【VBA】Excelリボンに独自のボタン・タブを追加する方法(コピペOK)

VBA
スポンサーリンク

記事ID: 170
タイトル: 【VBA】Excelリボンに独自のボタン・タブを追加する方法(コピペOK)
カテゴリ: ファイル操作
一次キーワード: VBA リボン カスタマイズ ボタン追加
想定読者: Excelリボンに自作マクロのボタンを設置して、誰でもワンクリックで実行できるようにしたい人
検索意図: VBAでExcelのリボンに独自のタブやボタンを追加する方法を知りたい
読者の悩み(1文): シート上のボタンだと見た目がイマイチだし、マクロが増えるとボタンだらけになって管理しにくい
読了後にできること(1文): Excelリボンに独自タブ・ボタンを追加し、自作マクロをリボンからワンクリック実行できる
前提条件:
  - Excel版: Excel 2016以降 / Microsoft 365
  - OS: Windows 10/11
  - 保存形式: .xlsm(マクロ有効ブック)またはxlam(アドイン)
  - 貼り付け場所: 標準モジュール(コールバックSub)
  - 実行方法: リボンのボタンクリック
更新日: 2026-03-25

スポンサーリンク

この記事でわかること

Excelリボンに独自のタブ・ボタンを追加して、自作マクロをリボンからワンクリック実行する方法を、コピペで動くコード付きで解説します。

  • 対象:シート上のボタンだけでは管理しにくくなってきた人
  • 所要時間:コピペ → 実行まで10分

どんな場面で使う?

  • 自作マクロをリボンのボタンからワンクリックで実行できるようにしたいとき
  • シート上のボタンが増えすぎて管理しにくくなってきたとき
  • チーム共通のマクロをアドイン化してリボンから全員が使えるようにしたいとき
  • トグルボタンやドロップダウンなど、本格的なリボンUIを作りたいとき

完成イメージ

実行前(リボンにボタンなし):

  1. Alt + F8 を押す
  2. マクロ一覧からマクロを選ぶ
  3. 「実行」をクリック
  4. マクロが増えるたびにどれがどれか分からなくなる

実行後(リボンに独自タブが追加):

  1. リボンの「自作ツール」タブをクリック
  2. 「データ整形」「PDF出力」などグループ分けされたボタンが並んでいる
  3. ボタンをクリックするだけでマクロが走る
  4. Officeアイコン付きで見た目もスッキリ

自分もマクロが10個を超えたあたりで、シート上にボタンを並べるのが限界になった。ボタン同士が重なったり、シートをコピーするたびにボタンがズレたりして、正直ストレスだった。

リボンに独自タブを作ってからは、マクロがカテゴリごとに整理されて、同僚にも「ここのボタン押すだけ」と説明できるようになった。見た目もExcelの標準機能っぽくなるので、「これVBAなの?」と驚かれることもある。

この記事で、リボンカスタマイズの方法を知って、マクロの管理と配布がラクになればうれしいです。

ボタンの基本的な設置方法はマクロをボタン1つで実行する方法で解説しています。マクロの分割・整理についてはマクロから別のマクロを呼び出して処理を分割する方法を参照してください。

実行前の準備

バックアップ推奨:リボンXMLの編集を間違えるとファイルが開けなくなることがあります。作業前に必ずファイルのコピーを取ってください。

Custom UI Editorをインストールする

リボンのカスタマイズにはXMLの編集が必要です。Office Custom UI Editor(無料ツール)を使うと、GUIでXMLを編集できます。

  1. Office Custom UI Editor からインストーラーをダウンロード
  2. インストールして起動

Custom UI Editorを使わずにZIPリネーム→手動XML編集する方法もありますが、ミスしやすいのでツールの利用を推奨します。

Excelをマクロ有効ブック(.xlsm)で保存する

拡張子が .xlsx のままだとマクロもリボン定義も保存できません。

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存してからExcelを閉じる(Custom UI EditorはExcelが開いていると編集できない)

手順(コピペ → 実行まで約10分)

ステップ1:Custom UI Editorでファイルを開く

  1. Custom UI Editorを起動
  2. 「File」→「Open」で .xlsm ファイルを開く

ステップ2:XMLを追加する

  1. メニュー「Insert」→「Office 2010+ Custom UI Part」を選択
  2. 右側のXML編集エリアに、下の「XMLコード」をそのまま貼り付ける

ステップ3:XMLを保存する

  1. 「File」→「Save」で保存
  2. Custom UI Editorを閉じる

ステップ4:VBAのコールバックSubを追加する

  1. Excelで .xlsm ファイルを開く
  2. Alt + F11 でVBE(コードを書く画面)を開く
  3. 「挿入」→「標準モジュール」
  4. 下の「VBAコード」をそのまま貼り付ける
  5. 保存して閉じ、再度開く(リボンが反映される)

コード(基本版)– 独自タブにボタン1つを追加

XMLコード(Custom UI Editorに貼り付ける)


<!-- ============================================================ -->
<!-- ■ リボンに独自タブ+ボタンを追加(基本版)                   -->
<!--   → 「自作ツール」タブに「実行」ボタンが1つ表示される         -->
<!-- ============================================================ -->
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
  <ribbon>
    <tabs>
      <!-- ★ タブ名を変更したい場合は label を書き換え -->
      <tab id="myTab" label="自作ツール" insertAfterMso="TabHome">
        <!-- ★ グループ名を変更したい場合は label を書き換え -->
        <group id="myGroup" label="基本操作">
          <!-- ★ ボタンのラベル・コールバック名を書き換え -->
          <button id="btnRun"
                  label="実行"
                  size="large"
                  imageMso="MacroPlay"
                  onAction="OnBtnRun" />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

VBAコード(標準モジュールに貼り付ける)


'============================================================
' ■ リボンボタンのコールバックSub(基本版)
'   → リボンの「実行」ボタンがクリックされたときに呼ばれる
'============================================================

'--- リボンのボタンがクリックされたときに実行されるSub
'    引数 control は自動で渡される(書き換え不要)
Sub OnBtnRun(control As IRibbonControl)

    '--- ★ ここに実行したい処理を書く ---
    MsgBox "リボンのボタンがクリックされました!", vbInformation
    '--- ★ ここまで ---

End Sub

書き換えポイント

項目 説明 初期値
label="自作ツール" タブの表示名 自作ツール
label="基本操作" グループの表示名 基本操作
label="実行" ボタンの表示名 実行
imageMso="MacroPlay" ボタンのアイコン(Office組み込みアイコン名) MacroPlay
onAction="OnBtnRun" クリック時に呼ばれるVBA Sub名 OnBtnRun

imageMso にはOfficeの組み込みアイコン名を指定します。「FileSave」「PrintPreview」「Copy」など数百種類あります。一覧は「imageMso gallery」で検索すると見つかります。

コード(実務版)– アイコン付き+グループ分け+トグルボタン+ドロップダウン

自分はマクロが増えてきたとき、「データ整形」「出力」「設定」のようにグループ分けしたら、どこに何があるか迷わなくなった。さらにトグルボタン(ON/OFF切替)やドロップダウン(選択肢から選ぶ)を使えば、処理のオプションもリボンから指定できる。

XMLコード(実務版)


<!-- ============================================================ -->
<!-- ■ リボンカスタマイズ(実務版)                               -->
<!--   → グループ分け+アイコン+トグル+ドロップダウン           -->
<!-- ============================================================ -->
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"
          onLoad="OnRibbonLoad">
  <ribbon>
    <tabs>
      <tab id="myTab" label="自作ツール" insertAfterMso="TabHome">

        <!-- ===== グループ1:データ整形 ===== -->
        <group id="grpData" label="データ整形">
          <button id="btnCleanData"
                  label="データクリーニング"
                  size="large"
                  imageMso="DatabaseDeleteTable"
                  onAction="OnCleanData"
                  screentip="空白行の削除・全角半角統一を実行"
                  supertip="選択範囲のデータを整形します。空白行削除→全角半角統一→トリムの順で処理します。" />

          <button id="btnSort"
                  label="並び替え"
                  size="normal"
                  imageMso="SortAscending"
                  onAction="OnSortData" />
        </group>

        <!-- ===== グループ2:出力 ===== -->
        <group id="grpOutput" label="出力">
          <button id="btnPdf"
                  label="PDF出力"
                  size="large"
                  imageMso="FileSaveAsPdfOrXps"
                  onAction="OnPdfExport"
                  screentip="アクティブシートをPDF出力" />

          <!-- ★ ドロップダウン:出力先を選択 -->
          <dropDown id="ddOutputFolder"
                    label="出力先"
                    onAction="OnOutputFolderChange"
                    getItemCount="GetOutputFolderCount"
                    getItemLabel="GetOutputFolderLabel">
          </dropDown>
        </group>

        <!-- ===== グループ3:設定 ===== -->
        <group id="grpSettings" label="設定">
          <!-- ★ トグルボタン:バックアップのON/OFF -->
          <toggleButton id="tglBackup"
                        label="自動バックアップ"
                        size="large"
                        imageMso="DatabaseMoveToSharePoint"
                        onAction="OnToggleBackup"
                        getPressed="GetBackupState"
                        screentip="実行前に自動バックアップを取るかどうかを切り替え" />

          <button id="btnSettings"
                  label="詳細設定"
                  size="normal"
                  imageMso="ControlProperties"
                  onAction="OnShowSettings" />
        </group>

      </tab>
    </tabs>
  </ribbon>
</customUI>

VBAコード(実務版)


'============================================================
' ■ リボンカスタマイズ コールバック集(実務版)
'   → グループ分け+トグル+ドロップダウン対応
'============================================================

'--- モジュールレベル変数(リボンの状態を保持)
Private objRibbon      As IRibbonUI   ' リボンオブジェクト
Private blnBackup      As Boolean     ' バックアップON/OFFの状態
Private lngOutputIdx   As Long        ' ドロップダウンの選択インデックス

'--- 出力先フォルダの選択肢(★ここを書き換え)
Private Const FOLDER_1 As String = "C:\Output\デスクトップ"
Private Const FOLDER_2 As String = "C:\Output\共有フォルダ"
Private Const FOLDER_3 As String = "C:\Output\バックアップ"

'============================================================
' リボン読み込み時(起動時に1回だけ呼ばれる)
'============================================================
Sub OnRibbonLoad(ribbon As IRibbonUI)
    Set objRibbon = ribbon
    blnBackup = True     ' 初期状態:バックアップON
    lngOutputIdx = 0     ' 初期状態:1番目のフォルダ
End Sub

'============================================================
' グループ1:データ整形
'============================================================
Sub OnCleanData(control As IRibbonControl)
    '--- バックアップが必要な場合
    If blnBackup Then
        ThisWorkbook.Save
        MsgBox "バックアップとして保存しました。", vbInformation
    End If

    '--- ★ ここにデータクリーニング処理を書く ---
    MsgBox "データクリーニングを実行しました。", vbInformation
    '--- ★ ここまで ---
End Sub

Sub OnSortData(control As IRibbonControl)
    '--- ★ ここに並び替え処理を書く ---
    MsgBox "並び替えを実行しました。", vbInformation
    '--- ★ ここまで ---
End Sub

'============================================================
' グループ2:出力
'============================================================
Sub OnPdfExport(control As IRibbonControl)
    Dim outputPath As String

    '--- 選択中の出力先フォルダを取得
    Select Case lngOutputIdx
        Case 0: outputPath = FOLDER_1
        Case 1: outputPath = FOLDER_2
        Case 2: outputPath = FOLDER_3
        Case Else: outputPath = FOLDER_1
    End Select

    '--- フォルダが存在するか確認
    If Dir(outputPath, vbDirectory) = "" Then
        MsgBox "出力先フォルダが見つかりません:" & vbCrLf & outputPath, vbExclamation
        Exit Sub
    End If

    '--- ★ ここにPDF出力処理を書く ---
    Dim pdfFile As String
    pdfFile = outputPath & "\" & Format(Date, "yyyymmdd") & "_" & ActiveSheet.Name & ".pdf"
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfFile
    MsgBox "PDF出力完了:" & vbCrLf & pdfFile, vbInformation
    '--- ★ ここまで ---
End Sub

'--- ドロップダウン:選択変更時のコールバック
Sub OnOutputFolderChange(control As IRibbonControl, id As String, index As Long)
    lngOutputIdx = index
End Sub

'--- ドロップダウン:項目数を返す
Sub GetOutputFolderCount(control As IRibbonControl, ByRef count As Variant)
    count = 3
End Sub

'--- ドロップダウン:各項目のラベルを返す
Sub GetOutputFolderLabel(control As IRibbonControl, index As Long, ByRef label As Variant)
    Select Case index
        Case 0: label = "デスクトップ"
        Case 1: label = "共有フォルダ"
        Case 2: label = "バックアップ"
    End Select
End Sub

'============================================================
' グループ3:設定
'============================================================

'--- トグルボタン:ON/OFF切替時のコールバック
Sub OnToggleBackup(control As IRibbonControl, pressed As Boolean)
    blnBackup = pressed
    If pressed Then
        MsgBox "自動バックアップ:ON", vbInformation
    Else
        MsgBox "自動バックアップ:OFF", vbInformation
    End If
End Sub

'--- トグルボタン:現在の状態を返す
Sub GetBackupState(control As IRibbonControl, ByRef returnedVal As Variant)
    returnedVal = blnBackup
End Sub

'--- 詳細設定ボタン
Sub OnShowSettings(control As IRibbonControl)
    '--- ★ 設定画面(UserFormなど)を表示する処理を書く ---
    MsgBox "詳細設定画面を表示します(UserForm等に差し替えてください)", vbInformation
    '--- ★ ここまで ---
End Sub

書き換えポイント(実務版)

項目 説明 初期値
FOLDER_1FOLDER_3 ドロップダウンの出力先フォルダ C:\Output\…
OnCleanData の中身 データクリーニングの実処理 MsgBox(仮)
OnSortData の中身 並び替えの実処理 MsgBox(仮)
screentip / supertip ボタンにカーソルを合わせたときの説明 サンプル文
imageMso 各ボタンのアイコン Office組み込みアイコン

実務では、各 OnXxx Subの中身を実際の処理コードに差し替えて使います。例えば OnCleanData の中に空白行・空白セルを一括で削除する方法のコードを入れるような使い方です。

xlam(アドイン)化の手順

リボンカスタマイズを全ブック共通で使いたい場合は、.xlam(アドイン)にするのがベストです。

手順

  1. .xlsm ファイルを開く
  2. 「ファイル」→「名前を付けて保存」
  3. ファイルの種類を「Excelアドイン (*.xlam)」に変更
  4. 保存先はデフォルトの C:\Users\ユーザー名\AppData\Roaming\Microsoft\AddIns のまま
  5. 保存
  6. 「ファイル」→「オプション」→「アドイン」→「管理: Excelアドイン」→「設定」
  7. 作成したアドインにチェックを入れてOK
  8. Excelを再起動するとリボンに独自タブが表示される

xlam化すると、どのExcelブックを開いてもリボンに独自タブが表示されます。マクロの配布にも便利です。ショートカットキーでの実行も併用したい場合はマクロにショートカットキーを割り当てて素早く実行する方法を参照してください。

よくある落とし穴6選

# 症状 原因 対策
1 ファイルを開くと「カスタムUIに問題があります」と出る XMLの構文エラー(タグの閉じ忘れ、属性のスペルミス) Custom UI Editorの「Validate」ボタンでXMLを検証する。自分もこれで1時間ハマった。id属性のスペルを1文字間違えただけで開けなくなった
2 リボンにタブが表示されない XMLを保存した後、Excelを閉じて再度開く必要がある 保存 → 閉じる → 開く。開いたままでは反映されない
3 ボタンをクリックしても何も起きない XMLの onAction で指定したSub名とVBAのSub名が一致していない 大文字小文字含めて完全一致させる。引数 control As IRibbonControl も忘れない
4 「マクロが見つかりません」エラー コールバックSubが標準モジュールではなくシートモジュールに書かれている コールバックSubは必ず標準モジュールに配置する
5 トグルボタンの状態がファイルを開き直すとリセットされる モジュールレベル変数はファイルを閉じると消える Workbook_Open イベントで初期値を設定するか、セルやレジストリに状態を保存する
6 他のアドインのリボンと競合してタブが消える 複数のxlamが同じ id を使っている id属性にはプレフィックスを付ける(例:id="myApp_btnRun"

VBAのリボンカスタマイズでタブが表示されないときの対処法

「XMLを保存したのにリボンに独自タブが出ない」場合、XMLを保存した後にExcelを閉じて再度開いていないことが原因だ。Custom UI Editorで保存した後は、必ずExcelを閉じてから再度開く必要がある。開いたままでは反映されない。

VBAのリボンボタンをクリックしても何も起きないときの対処法

「ボタンは表示されるのにクリックしても反応しない」場合、XMLのonAction属性で指定したSub名とVBAのSub名が一致していないことが原因だ。大文字小文字を含めて完全一致させ、引数control As IRibbonControlも忘れずに付けよう。またコールバックSubは標準モジュールに配置する必要がある。

FAQ

Q1. imageMsoのアイコン一覧はどこで確認できますか?

「Office imageMso gallery」で検索すると、画像付きの一覧サイトが見つかります。数百種類あるので、用途に合うアイコンを選んでください。Custom UI Editor内でもアイコンの一覧を確認できます。

Q2. 自分で用意した画像をボタンのアイコンにしたい場合は?

XMLで image 属性(imageMso ではなく)を使い、loadImage コールバックで画像を読み込みます。ただし設定が複雑になるため、まずは imageMso の組み込みアイコンから始めるのがおすすめです。

Q3. リボンのボタンをグレーアウト(無効化)したい場合は?

XMLに getEnabled="GetBtnEnabled" を追加し、VBAで条件に応じて True / False を返すコールバックを書きます。状態が変わったら objRibbon.InvalidateControl "btnRun" でリボンを再描画してください。


Sub GetBtnEnabled(control As IRibbonControl, ByRef enabled As Variant)
    ' 例:A1セルが空ならボタン無効
    enabled = (ActiveSheet.Range("A1").Value <> "")
End Sub

Q4. 既存のリボンタブ(ホームタブなど)にボタンを追加できますか?

XMLで のように既存タブのidを指定すれば、既存タブにグループを追加できます。ただし既存タブの改変は他のアドインと競合しやすいので、独自タブを作る方が安全です。

Q5. リボンのカスタマイズをVBAコードだけで完結できますか?

残念ながら、リボンのカスタマイズにはXMLが必須です。VBAだけでは完結しません。ただし、マクロをボタン1つで実行する方法で解説しているシート上のボタン設置なら、VBAだけで完結します。用途に応じて使い分けてください。

まとめ

この記事では、Custom UI Editorを使ってExcelリボンに独自のタブ・ボタンを追加する方法を解説しました。

  • 基本版 — 独自タブにボタン1つを追加し、コールバックSubでマクロを実行
  • 実務版 — グループ分け+アイコン付き+トグルボタン+ドロップダウンで本格的なリボンUI
  • xlam化 — アドインにすれば全ブック共通でリボンが使える

リボンに独自タブがあると、マクロの管理と配布が格段にラクになります。自分もチーム用のxlamを1つ作って共有フォルダに置いたら、「これ便利」と言ってもらえた。

関連記事:

次にやりたくなること

Part 2: ルーブリック自己採点

# 項目 スコア 理由
1 検索意図の一致 9/10 「VBA リボン カスタマイズ ボタン追加」の意図に正面から回答。基本版+実務版+xlam化の3段階
2 再現性 9/10 Custom UI Editorのインストール〜XML貼り付け〜VBAコールバックまで手順を網羅
3 安全性 9/10 バックアップ推奨あり。XML構文エラーでファイルが開けなくなるリスクを落とし穴#1で対策
4 コード品質 9/10 XML・VBAともにコピペで動く設計。コールバックの引数も正確
5 落とし穴 9/10 6つの落とし穴を症状→原因→対策で記載。筆者体験談あり(#1)
6 読みやすさ 9/10 結論先出し、Before/After、書き換えポイント表で構成が明確
7 回遊導線 9/10 内部リンク7本(/013, /081, /088, /080, /102, /033 + 本文中)。次にやりたくなること4本
8 SEO基礎 9/10 タイトルにキーワード自然に配置。メタ120字以内。見出しが検索意図順
合計 72/80

判定:Go

Part 3: 自己編集レポート

  • 編集サマリー: 目的=Excelリボンに独自タブ・ボタンを追加 / 結論=Custom UI EditorでXML編集+VBAコールバック / 想定読者=マクロが増えてシートボタンだけでは管理しにくくなった人
  • 修正方針(最重要3つ):
    1. XML構文エラー対策 → Custom UI EditorのValidate機能を推奨+落とし穴#1で対応
    2. コールバックSubの配置場所 → 標準モジュール必須を明記+落とし穴#4で対応
    3. xlam化手順 → 全ブック共通で使う実務ニーズに対応
    4. 筆者体験チェック結果:
    5. (1)共感: OK — 導入に「マクロ10個超えてボタンが限界になった」体験あり
    6. (2)実感: OK — 「同僚に驚かれる」「チーム用xlamで便利と言われた」の実感あり
    7. (3)動機: OK — 「マクロの管理と配布がラクになればうれしい」あり
    8. 内部リンクチェック結果: 7本(/013, /081, /088, /080, /102, /033 + 本文中)。導入・本文中・まとめ・次にやりたくなることに配置。5本以上OK
    9. 掲載可否: Yes

Part 4: セルフチェックリスト

  • [x] 再現性(前提・貼り付け・実行・確認)
  • [x] 安全性(バックアップ・破壊的操作の警告)
  • [x] 落とし穴が3つ以上あるか(6つ)
  • [x] FAQが3つ以上あるか(5つ)
  • [x] 「次にやりたくなること」に内部リンクが2本以上あるか(4本)
  • [x] 導入に「(1)共感→(2)実感→(3)動機」の3段階が入っているか
  • [x] 落とし穴に筆者の失敗談が最低1つ入っているか
  • [x] 実務版コード前後に「(2)実感」の補強が入っているか
  • [x] 内部リンクが5本以上あるか(7本)
  • [x] FAQ構造化データ(JSON-LD)が出力されているか
  • [x] ルーブリック自己採点が完了しているか

コメント

タイトルとURLをコピーしました