Excel VBA 第2回 リボンとアドイン作成

#はじめに
今回は、オリジナルのリボンの作成し、そのアドインを作成します。
リボンは、Excel上で追加できますが、そうではなく、リボン用のアドインを作成します。
リボンについて、いろいろとサイトに記載がありますので、目新しいところはありませんが、備忘として載せます。Excel VBAは本当にたくさんの記事がありますので、開発で困ることはあまりないんですよね。
私の場合、どんなExcelにもよく使う頻出マクロを作成し、それをリボンに実装して、アドインに取り込むことで、いつでも使えるようにしています。
また、リボンが面倒という時も多いため、Quick access tool barでも実装できるようにします。

そうだ、CustomUI Editor Toolというものも提供されているようですが、そのアプリのインストールが必要になるため、使っていません。

#今回実施する内容
Excelにマクロ専用のリボンを追加し、アドインを作成します。
以下のように、「OrgMacro」タブを作成し、そこに、「ボタン」というボタンを作成します。
「ボタン」を押すと、「メッセージ」を表示します。
![ribbon.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/7e19cd7a-7247-a46c-66cf-c599a846ffe3.jpeg)

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

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

#参考
[[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の説明があるようです。

[エクセルの開発タブを表示する方法](https://office-hack.com/excel/development-tab/)
エクセルで開発タブが表示されていない場合は、いろいろサイトはありますが、この辺でもみてください。

#用語
##アドイン
ソフトウェアに機能を追加するプログラム。
Excelアドインは、Excelに機能を追加します。
今回はVBAでマクロを作成し、それをアドインにします。
Excelアドインは、拡張子が「.xla」と「.xlam」がありますが、「.xla」は確かOffice 2007より前に使われていたものです。
Office 2007以降は基本的に、「.xlam」を使います。

#作業の概要
1. アドインの作成
2. リボンの作成
       1. 「.rels」の編集
       2. 「customUI.xml」の作成
3. マクロの作成

「1. アドインの作成」で、アドインファイルを作成します。
「2. リボンの作成」で、実際にリボンを作成します。二つのファイルを使ってリボンを作成します。ここではリボンとそこにボタンを配置するだけで、それを押しても動作はしません。
「3. マクロの作成」で、リボンのボタンに関連付けるマクロを作成します。

#1. アドインの作成
最初にアドインを作成します。

1. Excelを開き、「空白のブック」を選択する。
2. 「名前を付けて保存」で、「Excelアドイン(*.xlam)」を選択し、好きな名称でファイルを保存する（ここではOrgMacro.xlam）。ここで保存先は自動で変わりますが、特にもしなければ「C:\Users\[Username]\AppData\Roaming\Microsoft\AddIns」です。
3. Excelの「開発」タブ（存在しない場合は、別途下のほうで記載）で、「Excelアドイン」ボタンをおして、作成したアドインを選択し、OKする。
![adins.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/eb76a7ca-a99f-f6d7-7c93-8e681bde9f82.jpeg)

#開発タブの追加
開発タブがすでに表示されている場合はここは気にしなくてよいです。
上の参考あたりをみてもいいですし、簡潔に以下に示します。

1. 「ファイル」タブを選択。
2. 「オプション」の「リボンのユーザーの設定」で表示された画面で、右側のほうの階層構造で、「開発」があるため、これをチェックして、「OK」ボタンを押す。

#2. リボンの作成
##作成したアドインの拡張子を変更と解凍
Excelファイルは、zip形式になっており、解凍するとXML形式となっています。

1. 拡張子を「.xlam」から「.zip」に変更する。（Excel起動済みでアドインが選択されていると変更できないことに注意）
2. 「.zip」を解凍する。
すると以下のような構成になります。

![フォルダ構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/55293a78-5844-421e-ebdc-cb535d79ace7.jpeg)

##「.rels」の編集
1. 「_rels」フォルダ配下の「.rels」ファイルをテキストエディタで開く。
2. このファイルは、XMLで記載されている。一番最後の「\</Relationship\>」の前に以下の一文を記載する。

```xml:.rels
<Relationship Id="customUI" Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="customUI/customUI.xml"/>
```

なお、Id="customUI"はIDなため、かぶらなければ何でも構わない。おそらくこのファイル内だけでかぶらなければよいと思われます。
customUIが存在することをXMLで記載しているということです。

##「customUI.xml」の作成
オリジナルリボンの内容は、「customUI.xml」に記載しますので、これを作成します。
今回は、「ボタン」というボタンを作成します。
なお、「customUI.xml」は、Office 2007以降で使えるファイルで、もうひとつ「customUI14.xml」というファイルも作成すると、Office 2010以降で使えるファイルです。
この二つの機能の違いはよく知りませんが、私の使用範囲では、Office 2007で使える程度で十分ですし、色々な方を対象と考えるなら、「customUI.xml」だけを作成します。
（今更、サポートがきれたOffice 2007を考える必要もないでしょうが）

1. 「customUI.xml」ファイルの作成
  アドインファイルの存在するフォルダに、「customUI」フォルダを作成し、
  「customUI.xml」ファイルを作成する。

2. 「customUI.xml」の編集
  「customUI.xml」ファイルをテキストエディターで開いて、以下の内容を記載して、「utf-8」形式で保存する。
  xml定義でutf-8を設定してるためですが、shift-jisは試したことありませんので動作するかはわかりません。
  また、今回はあえて日本語でボタン名を付けましたが、基本的には英語でつけるようにしています。

```xml: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="g" label="グループ">
                <button id="Button" label="ボタン" imageMso="B" size="large" onAction="R_ShowMsg" />
            </group>
        </tab>
      </tabs>
    </ribbon>
</customUI>
```
すると以下のような画面ができます。
![ribbon.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/7e19cd7a-7247-a46c-66cf-c599a846ffe3.jpeg)

上記の記載はほとんど定型で、「\<tabs\>」配下が自分で作っていくことになりますが、少しだけ解説します。

- \<customUI\>のxmlns
  ネームスペースを設定します。
  Office 2007以降の場合このネームスペースです。
  Office 2010以降の機能を使いたい場合、「2006/01」を「2009/07」にします。

- \<ribbon\>のstartFromScratch="false"
  基本は、"false"と思います。これを"true"にすると、他のリボンが読み込まれず、以下のようにここで作成したリボンだけになります。

![startFromScratch.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/d6513d30-d631-a8e2-20bc-fcc59c8a1c31.jpeg)

- \<tabs\>
  タブのグループであり、この配下に<tab>を作ると、ひとつのタブができます。複数タブを作りたい場合は、<tab>をその分作成します。

- \<tab\>
  「id」の値は、たぶんこのXMLで一意であればよいと思いますが、いつもなんとなくつけています。私が作成するアドインでは問題になったことありません。
  「label」の値は、作成するタブの名称を記載します。今回は、"OrgMacro"としています。

- \<group\>
  gropuは、タブ内のグループのことで、「ホーム」タブでいえば、「クリップボード」とか、「フォント」など一つの仕切りに、いくつかボタンがあると思います。それがgroupです。
  「id」や「label」などは、どの要素においても、属性の役割は同じなため、割愛します。

- \<button\>
  これが実際に押すことができるボタンです。

      ・imageMso
      ボタンのアイコンイメージです。今回は、Excelにデフォルトで入っているアイコンを使います。「B」とします。別途オリジナルのアイコンを作りたい場合は、「image」で設定しますが、今回は割愛します。
  
      ・size
    ボタンのサイズを示しますが、デフォルトが"small"なため、"large"を設定します。

      ・onAction
    ボタンを押したときに起動するマクロを設定します。今回は"R_ShowMsg"としました。このマクロは後で作成します。

設定可能な属性は、このほかにもたくさんありますが、参考に記載したサイトに説明があります。
上記が普通のリボンにたりないとしたら、ぱっと見は、keytipとか、screentipくらいでしょうか。
それほどリボンと同じにしたいわけでもないため、私には上記くらいで十分です。

##ファイルの圧縮
これでリボンの作成はできましたので、ファイルを圧縮し、ファイル名を変更します。

1. 圧縮

      圧縮する場合、「[Content_Types].xml」やその他フォルダを一緒に圧縮する。上位のフォルダなどで圧縮はしてはだめです。

2. ファイル名変更

      拡張子を「.zip」から「.xlam」に変更する。

これで、Excelを起動すれば「今回実施する内容」に記載した画面ができます。

#3. マクロの作成
ここでは、「R_ShowMsg」を作成します。

VBA Editorを開き、プロジェクトは、アドインのファイル（「orgMacro.xlam」）を選びます。
アドインに追加するマクロは、このプロジェクトで行います。

1. モジュールの作成
      モジュールを追加する。
私の場合、機能用のモジュールやクラスと、リボン用はわけていますので、「Module1.bas」と「Ribbon.bas」を追加します。
リボン用とわけておくことで、Quick Access Tool barで作ったマクロを実行もできるため、リボンはリボンだけのほうが良いかと思います。

2. ソースの作成（Module1.bas)
      機能用のモジュールです。
以下のソースを追加します。

```visualbasic:Module1.bas
Option Explicit
Public Sub ShowMsg()
    MsgBox ("メッセージ")
End Sub
```

解説は不要ですね。
単なるメッセージを表示するマクロです。
3. ソースの作成（Ribbon.bas)

      リボン用のモジュールです。
以下のソースを追加します。

```visualbasic:Ribbon.bas
Option Explicit

Public Sub R_ShowMsg(control As IRibbonControl)
    Call ShowMsg
End Sub
```

`customUI.xml`のonActionに記載したマクロ名を記載します。
引数は、IRibbonControl型ですが、これは定型と考えてよいと思います。
この値をつかって、リボンの状態を変化させる（グレーアウトするとか）ならばこの引数を使ったりもしますが、あまり用途はないかと思います。
中身は、ShowMsgをCallしてるだけです。

これで、作成したリボンを押すと、「メッセージ」というメッセージボックスが表示されます。

#おわりに
今回は以上です。

ま、よくある内容なので恐縮です。