みなさん,こんにちは。
シンノユウキ(shinno1993)です。
今回はExcelのアドインを作成する際に便利な「独自メニュー」を追加する方法を紹介します。
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として宣言する必要があります:
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")
に Controls
を Add
していくことでメニューが追加されていきます。
このコードを実行することで,以下のようなメニュー コマンドが追加されます:
コードを少し変えるだけで,アイコン付きのボタンにも変更できます:
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つの方法を紹介しました。これらを上手く使用することで,非デベロッパーでも,マクロを活用しやすくなるかと思います。