Excel VBA 第3回 リボンにsplitButtonでボタンをまとめる

#はじめに
リボン関連の内容です。
作成したVBAマクロをまとめてリボンに実装して、それをアドイン化して使っています。
第2回ではリボンでのボタンの作り方を記載しました。
今回はsplitButtonを作ります。
頻出マクロをアドイン化するときに、buttonとsplitButtonくらいあれば、私の場合十分です。
よく使う頻出マクロは、「設定」などの機能の選択性を持たせず、単純にボタンを選ぶとそのマクロの機能が実行できるというシンプルなものにしています。

#今回実施する内容
リボンのメニューにsplitButtonを追加します。
splitButtonで関連するマクロをひとつのボタンにまとめます。
![splitbutton.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/d125a084-8cf1-d4af-401a-3f1e043a19e8.jpeg)
![message1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/83ea8505-f08f-2ae6-cf14-cc247e1c3186.jpeg)

splitButton自体は、Excelの通常のリボンでもよく使われています。
今回は、大きい「ボタン1」を押すと、メッセージボックスで「メッセージ1」を表示し、「▼」を押すと、小さい「ボタン1」と「ボタン2」が表示されてそれぞれを押すと、「メッセージ1」、「メッセージ2」を表示するというものです。
似たような機能のマクロをまとめるのに使っています。

#ソースコード (Git Hub)
[VBA_03_Ribbon_splitButton](https://github.com/Build-Mount/VBA_03_Ribbon_splitButton)

#環境
OS:Windows 10 JP
Excel: Excel 2019 (32bit)

#参考
[Excel VBA 第2回 リボンとアドイン作成](https://qiita.com/Mount/items/36c2b0d3af3654ab28d7)
今回作成するマクロは、リボンで作成しますので、これをもとにします。

[[MS-CUSTOMUI]: Custom UI XML Markup Specification](https://docs.microsoft.com/en-us/openspecs/office_standards/ms-customui/31f152d6-2a5d-4b50-a867-9dbc6d01aa43)
見たことほとんどないですが、ここにCustom UIの説明があるようです。

#用語

#作成
今回は、主に「customUI.xml」を編集します。
VBA上は単なる関数を記載するだけです。
以下の手順で行います。

1. 「customUI.xml」の作成
2. マクロの作成

「.rels」の編集などは、第2回を参照ください。
 
##1. 「customUI.xml」の作成
第2回で使ったファイルをベースに作成を行います。
まずは、ソースコードからです。

```customUI.xml
<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
    <ribbon startFromScratch="false">
      <tabs>
        <tab id="Tab" label="OrgMacro">
            <group id="b" label="グループ">
				<splitButton id="orgSplitBtn" size="large">
					<button id="Btn" label="ボタン1" imageMso="B" onAction="R_ShowMsg"/>
					<menu id="splitMenu" itemSize="normal">
						<button id="Btn1" label="ボタン1" imageMso="B" onAction="R_ShowMsg"/>
						<button id="Btn2" label="ボタン2" imageMso="B" onAction="R_ShowMsg2"/>
					</menu>
				</splitButton>
            </group>
        </tab>
      </tabs>
    </ribbon>
</customUI>
```

それでは、説明です。

- \<splitButton\>

      splitButtonです。splitButtonの配下には、\<button\>、\<menu\>、および\<toggleButton\>を配置できます。
今回は、\<button\>と\<menu\>を配置します。
sizeは"large"に設定し、アイコンを大きくしています。

- \<button\>

      一番上にある大きいボタンです。
      前回も説明したボタンで特筆することはありません。

- \<menu\>

      「▼」を押すと出てくるメニューで、「ボタン1」と「ボタン2」があります。
itemSizeは指定していますが、指定なしだと"normal"だと思います。大きくしたい場合は、"large"を設定します。
\<menu\>配下は単純に\<button\>を配置しているだけです。


ちなみに、今回の場合は、splitbuttonの最初に設定した「ボタン1」と「ボタン1」は同じ動作になるようにonActionで同じ関数を設定しています。
idは一意にする必要性はありますが、labelは同じでも構いません。

##2. マクロの作成
マクロは、以下の二つです。

- Module1.bas
- Ribbon.bas

###Module1.basの作成

```visualbasic:Module1.bas
Option Explicit

Public Sub ShowMsg(Message As String)
    MsgBox (Message)
End Sub
```
特に何も説明すべきことはありません。

###Ribbon.basの作成

```visualbasic:Ribbon.bas
Option Explicit

Public Sub R_ShowMsg(control As IRibbonControl)
    Call ShowMsg("メッセージ1")
End Sub

Public Sub R_ShowMsg2(control As IRibbonControl)
    Call ShowMsg("メッセージ2")
End Sub
```

R_ShowMsgとR_ShowMsg2と二つ作りました。
この関数は、引数がIRibbonControlだけなのですが、これで取得できるのが、Constext, id, tagの3つなのですが、あまり有用でないので、基本的に使っていません。
しいていえば、idは、XMLに記載したidを示すため、これをベースに関数の処理を変えるということはできるのですが、さして有効にも感じないため使っていません。

#おわりに
今回はsplitButtonを使ったリボンメニューを作成しました。