Excelでアドイン作成時に独自のメニューを追加する3つの方法

Excel・Excel VBA

みなさん,こんにちは.
シンノユウキ(@y_stadio)です.

今回はExcelのアドインを作成する際に便利な「独自メニュー」を追加する方法を紹介します.こういう若干込み入った話は,私の公開メモ帳みたいなものなので,少し読みづらいかもしれませんし,説明不足な点もあるかもしれませんが,その点をお含みおきの上,ご覧ください.

以下の3つの方法を紹介します:

  • リボン
  • メニュー コマンド
  • ユーザー設定のツールバー

リボン

「リボン」とは?

「リボン」といっても,もしかしたらExcelに詳しい方以外は馴染みのない言葉かもしれません.

Excelの上にある機能のかたまりが詰まっている部分のことです.メニューのようなものですね.

そして,その機能を同様の機能をもつもの同士でまとめたものが「タブ」と呼ばれるものです.「ホーム」とか「挿入」とかがそれに該当します.

今回は,このリボンに新しいタブを追加し,使いやすいUIを構築する方法を紹介します.

最も簡単な作り方

「Custom UI Editor」を使う

リボンのUIは,XMLという形で記述されています.ただし,通常のExcelファイルのままでは,このXMLは編集したり,追加したりすることができません.

そこで,「Custom UI Editor」を使用します.これを使用することでXMLを簡単に追加することができます.

「Custom UI Editor」は以下の記事を参考にインストールしてみてください:

インストールできたら,エディタを開いてください.

そして,メニューの「Open」からXMLを編集するためのファイルを開いてください.そして,以下のコードを入力してください:

<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
  <ribbon>
    <tabs>
      <tab id="TestTab1" label="アドイン名">
        <group id="TestGroup1" label="グループ名">
          <button id="TestButton1" label="ラベル" 
                  onAction="test" 
                  size="large" imageMso="XDMoreDetailsInfo" />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

そして,「Save」をクリックすると,該当のExcelファイルにXMLファイルが作成されます.

では,XMLファイルを追加したExcelファイルを開いてみましょう.すると,以下のように新しいタブが追加されていることがわかるかと思います:

<button>のカスタマイズ

<button> の imageMso属性を変更することで,ボタンのアイコンを変更することができます.imageMsoの一覧は,下記の記事で詳しく紹介されていますので,ご覧ください:

また,ボタンを押した際に実行されるプロシージャはonAction属性に記述します.ここで指定したプロシージャが,ボタンクリック時に実行されます.ただし,プロシージャの記述方法には注意が必要です.以下のように,引数にコントロールを指定し,パブリックにする必要があります:

Public Sub test(control As IRibbonControl)

このように書くことでプロシージャが実行されます.

メニュー コマンド

次に紹介するのは「メニュー コマンド」です.これは,Excelのバージョンによってイメージされるものがことなりますが,ここでは,現時点での最新版:Excel2016を対象として行っていきます.

「メニュー コマンド」とは?

これは以下の場所にあります:

アドインタブの中の一番左にあります.初期の状態では,この場所にメニュー コマンドはありません.VBAで追加することで初めて現れてきます.

最も簡単な作り方

では,これを追加するコードを紹介します.以下のようになります:

Private Sub Workbook_Open()
    Dim bar As CommandBar
    Dim menu As CommandBarControl
    Dim btn As CommandBarButton
    
    'Excelのメニューバーを指定
    Set bar = Application.CommandBars("Worksheet Menu Bar")
    
    'すでにコマンドバーにメニューがある場合は削除
    For Each menu In bar.Controls
        menu.Delete
    Next menu
    
    'コマンドバーにメニューを追加
    Set btn = bar.Controls.Add(Type:=msoControlButton)
    With btn
        .Style = msoButtonCaption
        .Caption = "キャプション"
        .OnAction = "test"
    End With
End Sub

Workbookが開いた際に実行されるようにしてあります.

Set bar = Application.CommandBars("Worksheet Menu Bar")ControlsAdd していくことでメニューが追加されていきます.

このコードを実行することで,以下のようなメニュー コマンドが追加されます:

コードを少し変えるだけでアイコン入のボタンにもできます:

    Dim btn As CommandBarButton
    Set btn = bar.Controls.Add(Type:=msoControlButton)
    With btn
        .Style = msoButtonIconAndCaption
        .FaceId = 2
        .Caption = "キャプション"
        .OnAction = "test"
    End With

また,コマンドバーに追加するコントロールを変更することで,ポップアップ式のボタンを作ることもできます:

    'コマンドバーにメニューを追加
    Dim popup As CommandBarPopup
    Set popup = bar.Controls.Add(Type:=msoControlPopup)
    With popup
        .Caption = "ポップアップ"
    End With
    
    'ポップアップにボタンを追加
    Dim btn As CommandBarButton
    Set btn = popup.Controls.Add(Type:=msoControlButton)
    With btn
        .Style = msoButtonIconAndCaption
        .FaceId = 2
        .Caption = "キャプション"
        .OnAction = "test"
    End With

なお,アイコンを指定しているのはプロパティ:FaceIDです.FaceIDの一覧は下記に詳しいです:

こういった情報は非常にありがたいですね.

なお,これはブックを閉じた後でも残ってしまうので,ブックを閉じる際にコマンドバーを削除するようにしましょう.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim menu As CommandBarControl
    Dim bar As CommandBar
    Set bar = Application.CommandBars("Worksheet Menu Bar")
    For Each menu In bar.Controls
        menu.Delete
    Next menu
End Sub

ユーザー設定のツールバー

「ユーザー設定のツールバー」とは?

「ユーザー設定のツールバー」も,もしかしたら人によっては目にする機会が少ないかもしれません.以下の場所にあります:

おそらく,初期の状態では何も表示されていません.VBAから追加することで利用できるようになります.

最も簡単な作り方

ユーザー設定のツールバーを作成する最も簡単な方法は以下のような方法です:

Sub addToolBar()
    Dim cmndBar As commandBar
    Set cmndBar = Application.CommandBars.Add(Name:="ツールバーの名前")
    cmndBar.Visible = True
    
    Dim btn  As CommandBarButton
    Set btn = cmndBar.Controls.Add(Type:=msoControlButton)
    With btn
        .Style = msoButtonIconAndCaption
        .Caption = "保存"
        .FaceId = 3
        .OnAction = "test"
    End With
End Sub

さきほど紹介したコマンドバーと似ていますね.しかし,先ほどのメニューコマンドを作成したコードでは,Application.CommandBars("Worksheet Menu Bar")にコントロールを追加していきました.

しかしユーザー設定のツールバーでは,新しくコマンドバーを追加し,それを表示しています.その部分だけが異なる点ですね.以外の部分はほぼ同じです.

また,こちらのツールバーも,ブックを閉じた後も残ってしまいます.なので,ブックを閉じる際に,ユーザー設定のツールバーも削除してください:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.CommandBars("ツールバーの名前").Delete
End Sub

まとめ

今回は,VBAのUI面を構築する3つの方法を紹介しました.これらを上手く使用することで,非デベロッパーでも,マクロを活用しやすくなるかと思います.

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