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

Excel Tips

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

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

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

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

リボン

「リボン」とは?

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

Excelで使える機能が人まとまりになった部分のことです。他のアプリケーションでのメニューのようなものですね。

そしてその機能を,同じような機能をもつものでまとめたのが「タブ」と呼ばれる部分です。「ホーム」や「挿入」等がタブに該当します。

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

最も簡単な作り方

リボンの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>の 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をコピーしました