【VBA】ボタンをリボンに設定する
記事更新日:2022-08-27

ボタンを
Excelシートに
置きたくない
Excelシートに
置きたくない

リボンとは、これ

ボタンをリボンに置くメリット
- 間違えにくい
- ボタン or シート が消えちゃう心配がない
- どのシートからでも実行できる

シートにあると、消えちゃいそうで不安
リボンを設定する方法:zip方式

詳しい手順は、こちらの記事がわかりやすい
VBA 専用ツールを使わないカスタムリボン作成チュートリアル – t-hom’s diary (hateblo.jp)
ざっくり手順
- Excelファイルをzipにする
- 「.rels」を修正
- 一度作れば、次からは同じものでOK
- 「CustomUI.xml」を作成
- ボタンの見た目やIDなどの設定
- VBEにモジュール作成
- ボタンの詳細を設定

専用エディタを使う方法もあるけど、zip 方式のほうがやりやすかった
CustomUI.xml

見た目は、xmlで作成
xmlのコードをクリックして表示
<?xml version="1.0" encoding="utf-8"?>
<customUI onLoad="Ribbon_onLoad" xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="MyOriginalRibbon" label="ツール実行" insertBeforeMso="TabHome">
<group id="register" label="登録">
<button id="R_Button_User"
imageMso="ContactPictureMenu"
size="large"
label="ユーザ登録"
screentip="ユーザを登録します"
supertip="実行時の注意:〇〇"
onAction="RibbonMacros"
tag="tool"
/>
<toggleButton id="userB1" label="最終実行日" onAction="userDate_onAction" />
<button id="userB2" getLabel="userDate_getLabel" />
<separator id="separator1" />
<button id="R_Button_A"
imageMso="OpenStartPage"
size="large"
label="AA登録"
onAction="RibbonMacros"
screentip="Aを登録します"
supertip="実行時の注意:〇〇"
tag="tool"
/>
<toggleButton id="aB1" label="最終実行日" onAction="aDate_onAction" />
<button id="aB2" getLabel="aDate_getLabel" />
<separator id="separator2" />
<button id="R_Button_B"
imageMso="PictureBrightnessGallery"
size="large"
label="BB登録"
screentip="Bを登録します"
supertip="実行時の注意:〇〇"
onAction="RibbonMacros"
tag="tool"
/>
<toggleButton id="bB1" label="最終実行日" onAction="bDate_onAction" />
<button id="bB2" getLabel="bDate_getLabel" />
</group>
<group id="prepare" label="出力準備">
<button id="R_Button_Keisan"
imageMso="Calculator"
size="large"
label="CC計算"
onAction="RibbonMacros"
screentip="〇〇を計算します"
supertip="実行時の注意:〇〇"
tag="tool"
/>
<toggleButton id="keisanB1" label="最終実行日" onAction="keisanDate_onAction" />
<button id="keisanB2" getLabel="keisanDate_getLabel" />
<separator id="separator3" />
<button id="R_Button_Add"
imageMso="DistributionListAddNewMember"
size="large"
label="追加修正"
onAction="RibbonMacros"
screentip="追加修正します"
supertip="実行時の注意:〇〇"
tag="tool"
/>
<toggleButton id="addB1" label="最終実行日" onAction="addDate_onAction" />
<button id="addB2" getLabel="addDate_getLabel" />
<separator id="separator4" />
<button id="R_Button_Yobi"
imageMso="MeetingsWorkspace"
size="large"
label="〇〇実行"
screentip="〇〇を実行します"
supertip="実行時の注意:〇〇"
onAction="RibbonMacros"
tag="tool"
/>
<toggleButton id="yobiB1" label="最終実行日" onAction="yobiDate_onAction" />
<button id="yobiB2" getLabel="yobiDate_getLabel" />
</group>
<group id="view" label=" 確認 ">
<button id="R_Button_View"
imageMso="WhatIfAnalysisMenu"
size="large"
label="Accessログ"
onAction="RibbonMacros"
screentip="Accessに登録済のデータを表示します"
supertip="実行時の注意:〇〇"
tag="tool"
/>
</group>
<group id="output" label="出力">
<button id="R_Button_Result"
imageMso="UpgradeWorkbook"
size="large"
label="Excel出力"
onAction="RibbonMacros"
screentip="データをExcelに出力します"
supertip="実行時の注意:〇〇"
tag="tool"
/>
<toggleButton id="resultB1" label="最終実行日" onAction="resultDate_onAction" />
<button id="resultB2" getLabel="resultDate_getLabel" />
<separator id="separator5" />
<button id="R_Button_Graph"
imageMso="ChartPrimaryVerticalGridlines"
size="large"
label="グラフ出力"
screentip="〇〇のデータをグラフ化します"
supertip="実行時の注意:〇〇"
onAction="RibbonMacros"
tag="tool"
/>
<toggleButton id="graphB1" label="最終実行日" onAction="graphDate_onAction" />
<button id="graphB2" getLabel="graphDate_getLabel" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>

HTMLみたいに書ける
【ドキュメント】MicrosoftDocs
【アイコン】Image Mso Gallery
VBA

挙動は、VBAで設定
標準モジュールに記述
VBAのコードはこちら
Option Explicit
Dim b As Boolean
Private rbLabel As String
Private rbText As String
Dim MyRibbon As IRibbonUI
Private Const RIBBON_TABNAME = "MyOriginalRibbon"
Private Enum row
user = 2
aa
bb
keisan
Add
yobi
result
graph
End Enum
'ファイル起動時に実行
Sub Ribbon_onLoad(Ribbon As IRibbonUI)
Ribbon.ActivateTab RIBBON_TABNAME
Set MyRibbon = Ribbon 'リボンをセット
MyRibbon.Invalidate 'リボンを再描画する
End Sub
Sub RibbonMacros(control As IRibbonControl)
Application.Run control.Tag, control
End Sub
Private Sub tool(control As IRibbonControl)
Application.Run control.ID
End Sub
'ツール実行ボタン
Private Sub R_Button_User()
Dim myProjectName As String: myProjectName = P_NAME_USER
Call Macro(myProjectName)
End Sub
Private Sub R_Button_A()
Dim myProjectName As String: myProjectName = P_NAME_A
Call Macro(myProjectName)
End Sub
Private Sub R_Button_B()
Dim myProjectName As String: myProjectName = P_NAME_B
Call Macro(myProjectName)
End Sub
Private Sub R_Button_Keisan()
Dim myProjectName As String: myProjectName = P_NAME_KEISAN
Call Macro(myProjectName)
End Sub
Private Sub R_Button_Add()
Dim myProjectName As String: myProjectName = P_NAME_ADD
Call Macro(myProjectName)
End Sub
Private Sub R_Button_Yobi()
Dim myProjectName As String: myProjectName = P_NAME_YOBI
Call Macro(myProjectName)
End Sub
Private Sub R_Button_View()
Dim myProjectName As String: myProjectName = P_NAME_DB_VIEW
Call Macro(myProjectName)
End Sub
Private Sub R_Button_Result()
Dim myProjectName As String: myProjectName = P_NAME_TWOCHAT_RESULT
Call Macro(myProjectName)
End Sub
Private Sub R_Button_Graph()
Dim myProjectName As String: myProjectName = P_NAME_GRAPH
Call Macro(myProjectName)
End Sub
'最終実行日の取得
Private Sub userDate_getLabel(control As IRibbonControl, ByRef label)
Call GetSheetData(row.user, label)
End Sub
Private Sub userDate_onAction(control As IRibbonControl, ByRef returnedVal)
On Error Resume Next
b = returnedVal
MyRibbon.InvalidateControl "userB2"
End Sub
Private Sub aDate_getLabel(control As IRibbonControl, ByRef label)
Call GetSheetData(row.aa, label)
End Sub
Private Sub aDate_onAction(control As IRibbonControl, ByRef returnedVal)
On Error Resume Next
b = returnedVal
MyRibbon.InvalidateControl "aB2"
End Sub
Private Sub bDate_getLabel(control As IRibbonControl, ByRef label)
Call GetSheetData(row.bb, label)
End Sub
Private Sub bDate_onAction(control As IRibbonControl, ByRef returnedVal)
On Error Resume Next
b = returnedVal
MyRibbon.InvalidateControl "bB2"
End Sub
Private Sub keisanDate_getLabel(control As IRibbonControl, ByRef label)
Call GetSheetData(row.keisan, label)
End Sub
Private Sub keisanDate_onAction(control As IRibbonControl, ByRef returnedVal)
On Error Resume Next
b = returnedVal
MyRibbon.InvalidateControl "keisanB2"
End Sub
Private Sub addDate_getLabel(control As IRibbonControl, ByRef label)
Call GetSheetData(row.Add, label)
End Sub
Private Sub addDate_onAction(control As IRibbonControl, ByRef returnedVal)
On Error Resume Next
b = returnedVal
MyRibbon.InvalidateControl "addB2"
End Sub
Private Sub yobiDate_getLabel(control As IRibbonControl, ByRef label)
Call GetSheetData(row.yobi, label)
End Sub
Private Sub yobiDate_onAction(control As IRibbonControl, ByRef returnedVal)
On Error Resume Next
b = returnedVal
MyRibbon.InvalidateControl "yobiB2"
End Sub
Private Sub resultDate_getLabel(control As IRibbonControl, ByRef label)
Call GetSheetData(row.result, label)
End Sub
Private Sub resultDate_onAction(control As IRibbonControl, ByRef returnedVal)
On Error Resume Next
b = returnedVal
MyRibbon.InvalidateControl "resultB2"
End Sub
Private Sub graphDate_getLabel(control As IRibbonControl, ByRef label)
Call GetSheetData(row.graph, label)
End Sub
Private Sub graphDate_onAction(control As IRibbonControl, ByRef returnedVal)
On Error Resume Next
b = returnedVal
MyRibbon.InvalidateControl "graphB2"
End Sub
'シートから最終実行日の取得
Private Function GetSheetData(ByVal row As Long, ByRef label)
With WS_LastDate
With .ListObjects("TblLastDate").Range
label = .Cells(row, 2).Value
label = Format(label, "yyyy/m/d(aaa)")
End With
End With
End Function
最終実行日をシートから取得
シートにテーブル準備

マクロ完了時に、日付が出力される設定をしておきます


なくてもいいけど、最終実行日がリボン上で確認できると安心できる
シートは見る必要がないので、普段は非表示にしておきます

上のコードで、この見た目を作ったよ

実行ボタンを
リボンに設置すると
ラクになる
リボンに設置すると
ラクになる
2022-08-27
編集後記:
この記事の内容がベストではないかもしれません。