Officeにて業務用アプリケーションを構築する時に、いつも課題になるのが「ボタンや入力用UIをどうするか?」で悩みます。Accessの場合には、フォームを作るのが定石なので、それほど困らないのですが、Excelの場合はシートの上にボタンを置くというのも、格好が悪いのと、列が多い場合、置き場所に困ります。

また、複数ウィンドウがあると、ボタンへのアクセスがしにくくなります。そこで利用するのが色々悪名高いリボン。しかし、登場からもう10数年経過して割りと受け入れられてきてるとも思います。今回は、このリボンに自分が作ったVBAコマンドなどを割り当てて動かせるように構築しようと思います。

今回使用するファイル

WYSIWYGでリボンを作成するOffice2010 RibbonCreatorというソフトウェアもありますが、こちらはシェアウェアとなっています。また、Visual Studio for OfficeでもGUIでリボンを作成できるようです。

Excelにリボンを追加する

Excelファイルにリボンを追加するのは少々厄介です。まずリボンが追加出来るのは、VBAが利用出来る拡張子がxlsm形式である事が必要です。事前にxlsm形式でファイルを保存しておきましょう。また、XMLファイルが必要ですが、xlsmをLhazなどのアーカイバで解凍すると色々出てきます。この中に「customUI」というフォルダを作り、その中に「customUI.xml」と「customUI14.xml」の2つのファイルを作るのですが、最期はZIPで固め直すという面倒が作業が必要です。

そこで利用するのが、Custom UI Editor Toolです。まずはこれを使えるようにしましょう。

Custom UI Editor Tool

Custom UI Editor Toolをまずはインストールしましょう。以下の手順で準備します。

  1. サイトに行きClone or Downloadをクリックする
  2. Download ZIPをクリックする
  3. ダウンロードされたZIPファイルを解凍する
  4. 解凍された中のフォルダ「Publish」⇒「Application Files」⇒「CustomUIEditor_4_0_0_0」を開く
  5. CustomUIEditor.exe.deployというファイルがあるので、名前変更で、.deployを削る
  6. CustomUIEditor.exeに対するショートカットをデスクトップにでも作る

Setup.exeがあるのですが、ビルドに失敗してるのか!?起動しても何もおきないのでこの方法でexeファイルを起動します。

図:Custom UI Editor Toolを起動してみた

起動時初期化のコード

リボンを定義する前に、初期化する為のコードなどをExcel側に用意しておきましょう。標準モジュールを追加して、以下のコードを用意しておきます。

OnLoadという関数が肝です。リボン初期化時にこのコードが読み込まれ、リボンのインスタンスを取得します。ここでしか取得できず、取得しておかないと後でリボンをコントロール出来なくなります。また、今回は自作リボンを起動時にアクティブにしています。

また、リボンのボタンが直接叩く「hello」という関数を作っておきました。

リボンを作成する

早速リボンを作成します。Custom UI Editor Toolを起動し、Openでxlsmファイルを開きましょう。開いた初期の状態では何も入っていない状態のはずです。メニューより「Insert」⇒「office2010 Custom UI Part」をクリックしましょう。これでXMLが書けるようになります。作成したら、以下のサンプルコードを貼り付けてみましょう。

サンプルコード

リボンはボタンだけでなく、テキストボックスやドロップダウンなど色々なパーツを作り込むことができますが、今回はまずシンプルに1個のタブと1個のグループ、1個のボタンだけで構成しています。1行目ラストにはonLoad=”OnLoad“を追加し、初期化コードを実行させます。

また、buttonのonActionには作成済み関数であるhelloを指定してあげています。

imageMsoについて

imageMsoはボタンなどで使うアイコン画像です。アイコン名を入れる事で予め用意されてるアイコン類を使えるのですが、imageMso Gallaryにてどんな画像があるのか調べる事が可能です(但し、Office2010とOffice2016ではアイコンのデザインが大分異なります)

また、ここに独自の画像(PNGファイルなど)を使う事も可能です(但し、32bit版オフィスのみ)。詳しい設定方法や準備の方法はこちらのサイトに詳しく記載されています。

主に使うパーツ

自分がよく使うパーツをピックアップしてみました。上記では必要最低限度のパーツのみでXMLに記述しましたが、主に今後開発を進めていくに当たってよく使うパーツのコードを記述してみました。

チェックボックスやテキストボックスなどもありますが、あまりリボンで作り込む時には適さないので、自分は使用していません。

気をつけなければならない点は

  1. 各パーツ類のidは重複してはなりません。
  2. menu属性の場合、その親のitemSizeに従うので、Buttonにはsize属性は付けない

この2点はコピペ時にしょっちゅう引っかかるポイントです。きちんと確認しましょう。

図:サブメニューなどを追加してみた

Accessにリボンを追加する

Accessの場合、WordやExcel、PowerPointとはアプリケーションの構造自体が異なり、リボン自体の組み込み方も異なります。XML形式で定義するのは同じなのですが、この組み込み部分がややこしいです。

図:サブメニューや大きなメニューを使うと雰囲気アップ

Usysribbonsテーブルを作る

リボンはテーブルで作ります。まずは以下の形式でテーブルを隠しオブジェクトとして作ります。

  • IDはオートナンバー(値は1)
  • RibbonNameは短いテキスト型(値は適当にリボン名を入力)
  • RibbonXmlは長いテキスト型(XML構造定義をここに記述)

作成後に、以下の手順で起動時にこのリボンが表示されるように設定します。

  1. メニューより「ファイル」⇒「オプション」を開く
  2. 現在のデータベースを開く
  3. リボンとツールバーのオプションの項目に移動する
  4. リボン名のドロップダウンリストに上記で設定したリボン名が出て来るので選択する。
  5. OKボタンを押して、Accessを再起動

Usysribbonsテーブルは隠しオブジェクトにしておくべきですので、左サイドバーより

  1. Usysribbonsテーブルを右クリック
  2. テーブルのプロパティを開く
  3. 属性の隠しオブジェクトにチェックを入れてOKボタンをクリック

図:Usysribbonsテーブルの構造

起動時初期化のコード

リボンを定義する前に、リボンを初期化する為のコードを事前に用意しておきましょう。標準モジュールを追加しておいて、以下のコードを用意しておきます。また、Accessで独自リボンを使う場合には、Microsoft office15 Objectb Libraryへの参照設定が必要です。

とりわけ、onLoadはリボン読み込み時にだけ実行される特別な関数で、ここでリボンのインスタンスを取得しておかないと、移行リボンのコントロールが出来ないので必須のコマンドです。また、Accessの場合はオリジナルのリボンをまず表示するのが定石なので、この段階で自作リボンをアクティブにしています。

リボンを作成する

基本的にはExcelの場合と同じです。少し異なる点は、onActionにマクロを指定できる点です。マクロを指定する場合は、onActionにマクロ名を入れるだけです。関数を直接叩く場合には、関数名を入れますがその関数はExcelの場合と同じ様式で作成します。

起動時に初期化する

onLoadという関数を事前に用意しましたが、XML内でこれを読み込み時に実行するように追加します。

1行目のcustomUIの項目に、onLoad=”onLoad“として追加します。これで自動で実行されるようになります。

ボタンの実行に関数を割り当て

idにはButtonXを指定。onActionにはtestribbonを指定しました。testribbonという名前のマクロを用意した場合には、そちらが実行されるようになります。

実行用のコード

上記のときの直接実行コードは以下のように作ります。

control.IDで押されたボタンのIDを取得しています。この時、ButtonXならばメッセージボックスを表示してくれます。

ボタンの幅などのTips

普通にそのまま、リボンを作ってると、ボタンの幅が狭く、リボンのラベルが妙な所で改行!?されたような不細工な表示になることがままあります。自分としては綺麗に表示したいのに制御が出来ません。これを制御する方法は、ラベルの改行したい場所に「
」という文字を入れることで、改行が可能になります。

すると綺麗に幅が調整されてボタンの見た目もGoodになります。

関連リンク