銀河鉄道

【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_a"
                        imageMso="ContactPictureMenu"
                        size="large"
                        label="ユーザ登録"
                        screentip="ユーザを登録します"
                        supertip="実行時の注意:〇〇"
                        onAction="RibbonMacros"
                        tag="tool"
                    />
                    <toggleButton id="a01" label="最終実行日" onAction="aDate_onAction" />
                    <button id="a02" getLabel="aDate_getLabel" />

                    <separator id="separator1" />

                    <button id="R_Button_b"
                        imageMso="OpenStartPage"
                        size="large"
                        label="AA登録"
                        onAction="RibbonMacros"
                        screentip="Aを登録します"
                        supertip="実行時の注意:〇〇"
                        tag="tool"
                    />
                    <toggleButton id="b01" label="最終実行日" onAction="bDate_onAction" />
                    <button id="b02" getLabel="bDate_getLabel" />

                    <separator id="separator2" />

                    <button id="R_Button_c"
                        imageMso="PictureBrightnessGallery"
                        size="large"
                        label="BB登録"
                        screentip="Bを登録します"
                        supertip="実行時の注意:〇〇"
                        onAction="RibbonMacros"
                        tag="tool"
                    />
                    <toggleButton id="c01" label="最終実行日" onAction="cDate_onAction" />
                    <button id="c02" getLabel="cDate_getLabel" />
                </group>

                <group id="prepare" label="出力準備">
                    <button id="R_Button_d"
                        imageMso="Calculator"
                        size="large"
                        label="CC計算"
                        onAction="RibbonMacros"
                        screentip="〇〇を計算します"
                        supertip="実行時の注意:〇〇"
                        tag="tool"
                    />
                    <toggleButton id="d01" label="最終実行日" onAction="dDate_onAction" />
                    <button id="d02" getLabel="dDate_getLabel" />

                    <separator id="separator3" />

                    <button id="R_Button_e"
                        imageMso="DistributionListAddNewMember"
                        size="large"
                        label="追加修正"
                        onAction="RibbonMacros"
                        screentip="追加修正します"
                        supertip="実行時の注意:〇〇"
                        tag="tool"
                        />
                    <toggleButton id="e01" label="最終実行日" onAction="eDate_onAction" />
                    <button id="e02" getLabel="eDate_getLabel" />

                    <separator id="separator4" />                    

                    <button id="R_Button_f"
                        imageMso="MeetingsWorkspace"
                        size="large"
                        label="〇〇実行"
                        screentip="〇〇を実行します"
                        supertip="実行時の注意:〇〇"
                        onAction="RibbonMacros"
                        tag="tool"
                    />
                    <toggleButton id="f01" label="最終実行日" onAction="fDate_onAction" />
                    <button id="f02" getLabel="fDate_getLabel" />
                </group>

                <group id="view" label=" 確認 ">
                    <button id="R_Button_g"
                        imageMso="WhatIfAnalysisMenu"
                        size="large"
                        label="Accessログ"
                        onAction="RibbonMacros"
                        screentip="Accessに登録済のデータを表示します"
                        supertip="実行時の注意:〇〇"
                    tag="tool"
                    /> 
                </group>

                <group id="output" label="出力">
                    <button id="R_Button_h"
                        imageMso="UpgradeWorkbook"
                        size="large"
                        label="Excel出力"
                        onAction="RibbonMacros"
                        screentip="データをExcelに出力します"
                        supertip="実行時の注意:〇〇"
                        tag="tool"
                    />
                    <toggleButton id="h01" label="最終実行日" onAction="hDate_onAction" />
                    <button id="h02" getLabel="hDate_getLabel" />

                    <separator id="separator5" />
 
                    <button id="R_Button_i"
                        imageMso="ChartPrimaryVerticalGridlines"
                        size="large"
                        label="グラフ出力"
                        screentip="〇〇のデータをグラフ化します"
                         supertip="実行時の注意:〇〇"
                        onAction="RibbonMacros"
                        tag="tool"
                    />
                    <toggleButton id="i01" label="最終実行日" onAction="iDate_onAction" />
                    <button id="i02" getLabel="iDate_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
    aa = 2
    bb
    cc
    dd
    ee
    ff
    hh
    ii
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_a()
    Call 呼び出すマクロ
End Sub
Private Sub R_Button_b()
    Call 呼び出すマクロ
End Sub
Private Sub R_Button_c()
    Call 呼び出すマクロ
End Sub
Private Sub R_Button_d()
    Call 呼び出すマクロ
End Sub
Private Sub R_Button_e()
    Call 呼び出すマクロ
End Sub
Private Sub R_Button_f()
    Call 呼び出すマクロ
End Sub
Private Sub R_Button_g()
    Call 呼び出すマクロ
End Sub
Private Sub R_Button_h()
    Call 呼び出すマクロ
End Sub
Private Sub R_Button_i()
    Call 呼び出すマクロ
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)
    MyRibbon.InvalidateControl "a02"
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)
    MyRibbon.InvalidateControl "b02"
End Sub

Private Sub cDate_getLabel(control As IRibbonControl, ByRef label)
    Call GetSheetData(row.cc, label)
End Sub
Private Sub cDate_onAction(control As IRibbonControl, ByRef returnedVal)
    MyRibbon.InvalidateControl "c02"
End Sub

Private Sub dDate_getLabel(control As IRibbonControl, ByRef label)
    Call GetSheetData(row.dd, label)
End Sub
Private Sub dDate_onAction(control As IRibbonControl, ByRef returnedVal)
    MyRibbon.InvalidateControl "d02"
End Sub

Private Sub eDate_getLabel(control As IRibbonControl, ByRef label)
    Call GetSheetData(row.ee, label)
End Sub
Private Sub eDate_onAction(control As IRibbonControl, ByRef returnedVal)
    MyRibbon.InvalidateControl "e02"
End Sub

Private Sub fDate_getLabel(control As IRibbonControl, ByRef label)
    Call GetSheetData(row.ff, label)
End Sub
Private Sub fDate_onAction(control As IRibbonControl, ByRef returnedVal)
    MyRibbon.InvalidateControl "f02"
End Sub

Private Sub hDate_getLabel(control As IRibbonControl, ByRef label)
    Call GetSheetData(row.hh, label)
End Sub
Private Sub hDate_onAction(control As IRibbonControl, ByRef returnedVal)
    MyRibbon.InvalidateControl "h02"
End Sub

Private Sub iDate_getLabel(control As IRibbonControl, ByRef label)
    Call GetSheetData(row.ii, label)
End Sub
Private Sub iDate_onAction(control As IRibbonControl, ByRef returnedVal)
    MyRibbon.InvalidateControl "i02"
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
月うさぎ

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

記事一覧