MENU

エクセルVBAワークショップ(1)アドイン事始め

みなさんはアドインという言葉を聞いたことがありますか?

エクセル関係の書籍で「マクロ」は多く見かけますが「アドイン」はあまり見かけません。両方とも「VBA」を使うのですが違いがはっきりしません。というわけで少し考えてみました。

VBAとはMicrosoftOfficeの各アプリケーションに付属しているプログラミング言語のことです。Visual Basic for Applicationの略でエクセルVBA、アクセスVBA、ワードVBA、というようにそれぞれのオフィスアプリケーションに対応したものが用意されています。その中で一番使われているのはエクセルVBAです。私も2000年頃から汎用ツールを中心にかなりの開発を経験しました。このブログでも特に断らない限り"VBA"は"エクセルVBA"のこととします。

エクセルの初期、"VBA"が導入される前に"マクロ"と呼ばれるものがありました。マクロは操作手順を記録して同じ操作を反復させることが主な目的です。今のRPAのようなものです。使われた言語もVBAではなく独自の簡易言語でした。"マクロ"とは本来は"ミクロ"に対して"巨大な"という意味ですが、現在のように超巨大化したコンピュータ環境に対しては比較的小さい処理のかたまりを指す言葉になってしまいました。「マクロの記録」も「マクロブック」も小さい処理が対象でした。

その後、Excel97になってマクロ用の簡易言語は実質的に廃止されてVBAに替わりました。「マクロの記録」もVBAで記述されることになりました。より複雑なロジックも表現できるようになったわけです。しかし"マクロ"という言葉は残ってしまいました。今でも"マクロの記録" "マクロブック"が使い続けられています。

VBAが導入されると同時に提供されたものに"アドイン"があります。アドインもVBAで記述されるものですがエクセルの追加機能のようにふるまうところがマクロブックと違います。


・マクロブック

マクロブックにはワークシートとマクロが同居しています。そのブックに特化した処理をしたいときに使います。ブックを複製するとマクロも一緒に複製されます。マクロブックをコピーして複数のユーザーに配布したあとでマクロがうまく動かなかったときは、配布したすべてのマクロブック内のマクロ部分を修正しなければなりません。普通は修正版のマクロブックを再配布することになります。大変です。


・アドイン

アドインはマクロブックと違いマクロ部分のみのブックです。エクセルをより便利にするための機能をVBAで作成して常駐させて使います。汎用的にどんなブックでも使えるのが特徴です。アドインがうまく動かない場合はアドインの修正版を配布するのでブックには影響は与えずに済みます。


ワークショップの内容

このワークショップでは「アドイン事始め」として、アドインの作り方を学習します。MsgBoxがひとつだけのアドインです。マクロブックと違って登録までの手続きはそれなりに必要ですが、仕組みが分かればそれほど難しくはありません。

準備

まず、エクセルでVBAが使えるよう[開発]メニューを表示させる必要があります。意外に深いところに設定があります。

エクセルの[ファイル]→[オプション]→[リボンのユーザー設定]で表示されるダイアログの[開発]にチェックして[OK]をクリックしてください。

シート表示に戻るとメニューに[開発]が追加されています。VBAの開発はこの[開発]メニューから行うことになります。

やっと準備が整いました。 それでは実際の作業に入ることにしましょう。

1.VBE(Visual Basic Editor)を表示させる

エクセルで「空白のブック」を開いてください。[開発]→[VisualBasic]をクリック(またはAlt+F11)するとVBE(Visual Basic Editor)が表示されます。



VBAのすべての作業はこのVBEで行います。エクセルのウィンドウはVBEの裏側に隠れて残っています。VBEとエクセルはそれぞれ独立したウィンドウですが、エクセルを終了させるとVBEも終了します。VBEだけを残すことはできないようです。 VBEの左上ペインをみると、VBProject(Book1)というプロジェクトがすでに作成されていることがわかります。

2.プロジェクトに名前をつける

[ツール]→[VBProjectのプロパティ]で表示されるダイアログの「全般]タブでプロジェクト名が変更できます。[保護]タブではプロジェクトにパスワードを設定できます。


プロジェクト名はデフォルトでVBAProjectとなっています。必ず変更するようにしましょう。複数のプロジェクトが同一名だと同時に開いているときに名前が特定できずに不都合が起こることがあります。 変更したプロジェクト名はVBEの左上ペインに表示されます。

3.標準モジュールに"Hello World"を記述する

定番の"Hello World"を記述してみましょう。まず[挿入]→[標準モジュール]をクリックします。

追加された標準モジュールに次のコードを記述しましょう。

Sub Auto_Open()
   Greeting
End Sub

Sub Greeting()
   MsgBox "Hello World !!", , ThisWorkbook.Name
End Sub

Auto_Openはプロジェクトがロードされたとき最初に実行されるプロシージャです。このプロシージャがないとプロジェクトは実行することができません。上の例ではAuto_Openに"Greeting"と記述しているので、起動時に"Greeting"が実行されます。
コードを走らせてみましょう。ツールバーの緑の右向き三角アイコン(または[実行」→[Sub/ユーザーフォームの実行])をクリックします。

"Hello World !!"というメッセージボックスが表示されましたか?もしメッセージボックスではなくマクロを選択するダイアログが表示されたら、"Auto_Open"または"Greeting"を選択して[実行]をクリックしてください。

4.アドインを保存する

[ファイル]→[上書き保存](またはツールバーのフロッピーアイコン)をクリックして保存ダイアログを表示します。

ファイルの種類は「Excelアドイン」を指定します。指定すると保存場所の表示が自動的に C:\Users\<ユーザー>\AppData\Roaming\Microsoft\AddIns となります。このフォルダは完成したアドインを常駐させるための特別なフォルダ(隠しフォルダ)です。デバッグ中は「ドキュメント」などの別フォルダに変更しましょう。 ファイル名にはプロジェクト名と同じものを入力します。別の名前で保存することもできますが混乱を避けるため同一名にします。拡張子はxlamです。

入力を確認して[保存]をクリックします。これでアドインが保存されます。VBEを終了したあとエクセルを終了させるときブックの保存ダイアログが表示されますが、アドインは保存されているので、ここは無視して終了します。

5.アドインの変更・デバッグ

保存したアドインは完成まで何度も開いて変更・デバッグを繰り返します。エクスプローラからアドインを開くと、マクロの警告が表示されるので[マクロを有効にする]をクリックしてください。開いたエクセルウィンドウで[開発]→[VisualBasic]をクリック(またはAlt+F11)するとVBEが前回保存の状態で表示されるので、変更・デバッグを繰り返します。





6.完成したアドインを常駐させる

完成したアドインをエクセルの起動とともに常駐させるには次のようにします。

(1)アドイン用フォルダに保存する

アドイン用フォルダは「4.ブックを保存する」にあるように C:\Users\<ユーザー>\AppData\Roaming\Microsoft\AddIns です。エクスプローラを使ってこのフォルダに完成したアドインを保存してください。(このフォルダは隠しフォルダです。表示するにはエクスプローラの「表示リボン」の「隠しファイル」をチェックする必要があります。)

(2)エクセルで常駐指定をする

エクセルを起動して[ファイル]→[オプション]で表示されるダイアログの左ペインの[アドイン]をクリックします。 表示された右ペインの下に[管理 Excelアドイン]と表示されていることを確認して[設定]をクリックします。



アドインを選択するダイアログで常駐させたいアドインを選択して[OK]をクリックするとエクセルに読み込まれます。次回からもエクセルの起動時に自動的に読み込まれます。(常駐を解除するときはこのダイアログでチェックをはずします)

7.アドインにメニューが必要なわけ

今回はAuto_OpenにGreetingというプロシージャを1つ記述しました。起動時にAuto_Openは1回だけ自動実行されるので、Greetingは起動時に1回だけ実行されます。何度でもGreetingを実行させるにはどうしたらいいでしょうか?

フォームを作りますか?フォームにボタンを配置してボタンをクリックするたびにGreetingを実行すれば確かに何度でもGreetingが実行できます。しかしフォームを閉じてしまうと再表示する方法がありません。

結局、常駐するプログラムには何らかのトリガーが必要となります。エクセルに備わっているトリガーはメニュー(リボン)です。必要に応じてメニュー(リボン)から処理を呼び出すことがエクセルの基本動作になります。

VBAでもメニューを作ることができます。Auto_Openでメニューを作っておけばメニューから何度でもプロシージャを呼び出したり、フォームを表示したりすることができることになります。

次回はメニューの作り方を取り上げたいと思います。