図1●Excelウィンドウの左端に表示した自作のツールバーとボタン。ボタンにはマクロが登録されている
図1●Excelウィンドウの左端に表示した自作のツールバーとボタン。ボタンにはマクロが登録されている
[画像のクリックで拡大表示]
リスト1●ツールバーを作るマクロ
リスト1●ツールバーを作るマクロ
[画像のクリックで拡大表示]
表1●Positionオプションに指定する値
表1●Positionオプションに指定する値
[画像のクリックで拡大表示]
表2●Typeオプションに指定する値
表2●Typeオプションに指定する値
[画像のクリックで拡大表示]
リスト2●ブックを開くと同時にツールバーを表示するWorkbook_Openイベント・プロシジャ
リスト2●ブックを開くと同時にツールバーを表示するWorkbook_Openイベント・プロシジャ
[画像のクリックで拡大表示]
リスト3●ツールバーを削除するマクロ
リスト3●ツールバーを削除するマクロ
[画像のクリックで拡大表示]
リスト4●Workbook_BeforeCloseイベントを使って,ブックを閉じるときにツールバーを削除する
リスト4●Workbook_BeforeCloseイベントを使って,ブックを閉じるときにツールバーを削除する
[画像のクリックで拡大表示]

 暑い! いくらここが田舎で緑が多いといっても,やはり昼間は暑い。しかし,エアコンを寄付してくれるような奇特な患者さんはいないし…。

今月の相談

「オリジナルのアドインを作ったのですが,毎回[マクロの実行]ボタンから実行するのは面倒です。簡単に実行する方法はありませんか?」

 ふむふむ,作成したマクロやアドインをクリック一つで実行したいのですね。それならツールバー(コマンドや機能を実行するためのボタンやメニューを並べたウィンドウ)を作るのがいいでしょう。“アドインを作ったらツールバー”,これはVBAプログラマの常識ですからよく覚えておいてください。

ツールバーを作ろう

 前回,Excelでマクロ専用のブックを作る方法として,個人用マクロブックやブック型アドインを紹介しました。これらを使えば,いろいろなブックでオリジナルのマクロを共通的に呼び出すことができます。しかし,マクロを実行するには,[ツール]メニューからマクロ・ウィンドウを呼び出し,マクロを選択して[実行]ボタンをクリックする,といった具合に結構手間がかかります。頻繁に利用するマクロは,ボタン一つで実行できれば便利さがアップしますよね。そうした場合にオススメなのが,ツールバーです。

 Excelでは,[表示]メニューの[ツールバー]-[ユーザー設定]で,独自のツールバーを作成し,その上に任意の機能を登録できます。そして当然ながら,ユーザー設定のツールバーを作る一連の作業はマクロで記述できます。今回はこれを使ってオリジナルのツールバーを作り,ボタンを貼り付け,自作のマクロを登録します(図1[拡大表示])。そうすれば,Excel標準の機能と同じように,ボタン・クリックだけでマクロを実行できます。

CommandBarsの
Addメソッドで作成

 では,ツールバーを作成するプロシジャ(リスト1[拡大表示])を見てください。ツールバーを作成するには,CommandBarsプロパティとAddメソッドを組み合わせて使います(1)。このサンプルでは,後の操作のために,ツールバーを作成すると同時に,オブジェクト型変数に代入します。Nameオプションはツールバーの名前(ここでは「文字修飾」)を,Positionオプションはツールバーの表示方法(表1[拡大表示])を指定します。Positionオプションを省略すると,フロート(固定されていないタイプ)のツールバーになります。次に,VisibleプロパティにTrueをセットして,ツールバーを表示します(2)。

リスト1●ツールバーを作るマクロ

Sub MakeToolBar()
    Dim myBar As CommandBar
    Dim myButton As CommandBarControl

    Set myBar = Application.CommandBars.Add( _
        Name:="文字修飾", Position:=msoBarLeft)
    myBar.Visible = True

    Set myButton = myBar.Controls.Add( _
        Type:=msoControlButton, ID:=1)

    With myButton
        .OnAction = "Moji1"
        .FaceId = 253
    End With
End Sub

 ツールバーができたら,その上に部品(ボタンなど)を配置します(3)。AddメソッドのTypeオプションに指定する値で,5種類の部品(表2[拡大表示])を選ぶことができます。IDオプションは省略するか1を指定します。2以上の番号を指定すると,あらかじめ機能が決められている部品を配置できます。例えばIDに3を指定すると[上書き保存]ボタンが組み込まれます。

 続いて,ボタンをクリックしたときに実行するマクロを登録します(4)。このマクロは標準モジュールに記述されていなければなりません。ここではMoji1という名前のプロシジャを指定していますが,ここは皆さんが作成したマクロの名前にしてください。(5)でボタンのアイコンを指定します。FaceIdプロパティはボタンの絵柄だけを指定するものです。(3)のIDオプションのように,機能付きのボタンになることはありません。

ブックの開閉に合わせて
自動的に起動/削除する

 これでツールバーを作るマクロはできましたが,その起動をいちいちユーザーが実行するのではあまり意味がありません。やはり,アドインを開くと同時に自動で実行するようにしたいものです。Excelのブックには,こうした用途を想定したWorkbook_Openイベントがあります。このイベント・プロシジャに,先ほどのマクロ(MakeToolBarプロシジャ)を呼び出すステートメントを1行記述しましょう(リスト2[拡大表示])。これでアドインが組み込まれると同時にツールバーが作成,表示されます。

リスト2●ブックを開くと同時にツールバーを表示するWorkbook_Openイベント・プロシジャ

Private Sub Workbook_Open()
    Call MakeToolBar
End Sub

 これでツールバーのマクロは完璧,と言いたいところですが,ユーザーがアドインの組み込みを解除するとどうなるでしょうか。そうです,ツールバーだけが残ってしまいます。アドインは解除してしまったので,その状態でボタンをクリックしたらエラーになります。これでは完璧とは言えません。アドインの登録を解除したら,同時にツールバーも削除しましょう(リスト3[拡大表示])。

リスト3●ツールバーを削除するマクロ

Sub RemoveToolBar()
    On Error Resume Next
        Application.CommandBars("文字修飾").Delete
    On Error GoTo 0
End Sub

 ツールバーの削除には,Deleteメソッドを使います(2)。特に難しいステートメントではありません。しかし,一つだけご用心。削除しようとしたコマンドバーが存在しない,つまり,ユーザーによって削除されたり,なんらかのアクシデントで消えてしまった場合,このステートメントはシステム・エラーになります。対策として,エラーが発生した場合に,そのエラーを無視して次のステートメントに進むエラー・トラップ(1)を仕掛けておきましょう。ターゲットとなるステートメントの直後に,エラー・トラップを解除するステートメント(3)を記述するのを忘れないように。

 ツールバーを消すのも自動にしたい?お任せください。ExcelにはWorkbook_BeforeCloseイベントがあります。ここに記述したマクロはブックを閉じる前に実行されます。ここに,ツールバーを削除するステートメントを記述すればOKです(リスト4[拡大表示])。

リスト4●Workbook_BeforeCloseイベントを使って,ブックを閉じるときにツールバーを削除する

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call RemoveToolBar
End Sub

 ところで,一般的に「メニューバー」と「ツールバー」はそれぞれ違う名前で呼ばれています。しかし,オブジェクト構造では,すべてCommandBarsコレクションのメンバーです。そしてそこに貼り付ける部品は,Controlsコレクションのメンバーです。Controlsコレクションは数が多いので,その詳細はいつか機会があれば紹介しましょう。

古庄 潤