銀河鉄道

【VBA】ボタンをリボンに設定する

サムネイル
ボタンリボンに設置
ボタンを
Excelシートに
置きたくない

リボンとは、これ

ボタンをリボンに置くメリット

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

シートにあると、消えちゃいそうで不安

リボンを設定する方法:zip方式

ざっくり手順

  1. Excelファイルをzipにする
  2. .rels」を修正
    • 一度作れば、次からは同じものでOK
  3. CustomUI.xml」を作成
    • ボタンの見た目やIDなどの設定
  4. 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

最終実行日をシートから取得

シートにテーブル準備

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

なくてもいいけど、最終実行日がリボン上で確認できると安心できる

シートは見る必要がないので、普段は非表示にしておきます

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

実行ボタンを
リボンに設置すると
ラクになる

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧