「マクロとアドインの違い」を知って効率的に開発する
Excelでマクロをそれなりに作ってきますと、どこかで「アドイン」という言葉や、そのもの自体を目にすることがあると思います。
このアドインですが、私の経験から言って、慣れていないと「マクロとどこが違うのか」、これを理解するのは、なかなか難しいのではないかと思います。
その仕組みを知り、マクロとアドインを使い分けることができると、より効率的な開発ができると思います。
はい、今回は思いっきりVBA側の内容ですー。
「アドインだからできる」は言い過ぎか・・
冒頭にてお断り的な内容として「プログラム(マクロ・VBA)」について先に説明します。
※アドイン(のファイル)と対比させるため、マクロの入っているExcelブックを、以降は「マクロブック」と呼びます。
マクロブックもアドインもプログラムできることは「ほぼ同じ」ですね。
フォームも問題なく使えますし、イベントも然りです。プログラミングという点では大きな遜色はないと思います。
要はマクロブックもアドインも「同じように作れる」ということです。
「アドインだからできる」
これは少し誇張している言い方に感じます。処理内容によっては、マクロブックでもできるものもあり得ると思うからです。
現実的な部分では、マクロブックとアドイン間で「敢えて同じ実装をする」ことは考えにくいわけです。もしもそれが有りならば、アドイン自体が成り立たなくなるというか、、、
確かに処理の内容によっては「別に普通のマクロでいいんじゃない?」という見方もできます。しかし、この辺は割り切ってというか、別物としてと言うか、この内容を読むみなさんの考え方次第では、色々な解釈も出てくると思いました。
当ページで言いたいことは、「同じことができる」ということではなく、マクロブックとアドインの違い、更にはアドインの利便性です。捉え方では差を感じることが難しい点もあると思います。
ですので、そのお断りですね(笑)。
マクロとアドインの構造的な違い
一般的に「Excelマクロで作った〇〇システム、○○ツール」というと、
「とある1つのブック(ファイル)に、そこにVBA(プログラム)を書き込み、XLSM形式で保存して出来上がり」
というやり方が一般的に思います。
アドインでも同様の流れに準じるところでもありますが、そもそもマクロブックとアドインでは基本的な構成が異なります。
大きく異なる点は以下の通りです。
シートの表示の違い
マクロブックとアドインではシートの表示について違いがあります。
通常、アドインのワークシートは、アドイン(ファイル)を起動(ダブルクリック)してもシートは「非表示のまま」です。
上記の画像のようにシートは1個も表示されません。
この「シートは非表示のまま」というところが、アドインの構造的な特徴の一つだと思います。
Excelと同時にアドインも起動する
アドインは一度設定をすれば、以降はアドインの起動のための設定は何もしません。不要です。
というのも、Excel起動時に一緒に立ち上がるからです。
上記の「Excel起動時に一緒に立ち上がる」にはこの意味が背景にあります。
※すでにExcel本体が起動しているならば、選択されたブックだけ起動します。
マクロブックの場合、そのマクロのあるブックを起動して初めて(例えばOpenイベントなりを実行しますが)アドインの場合、その前にすでに立ち上がっているのですね。
(プログラムからExcelを起動した場合などこの限りではないですが)
つまりアドインはExcelの起動と同時に常駐している(準備OK)状態になるとも言えます。
これは後述する「アプリケーションレベルでの監視」などで活用しやすい部分だと思います。
作ったプロシージャが外から見えない
アドインで作成したSubプロシージャは、利用者がマクロを選択して実行するダイアログ(マクロ名ボックス)に表示されません。
アドインのこの仕様は、不親切に見えるかもしれませんが、こうすることでデータとマクロ(プログラム)を分離するのに一役買っているのではないかと思います。
つまり、アドインではこのほうが都合が良いのですね(ちょっと言いすぎかもしれませんが・・)。
「アドインのマクロ」は簡単に実行できない
通常のマクロブックでは、Excelのシート上に図形やボタンフォーム等を置いて、その図形などに作ったマクロを割り当てると思います。
そして以降は、その図形などをクリックすれば作ったマクロが実行されます。
しかしアドインのそれは、そもそもマクロ名ボックスに表示されないため、同じ手法が取れません(もしくは、できる方法があるが私が知らないだけかもしれません)。
アドイン上に作ったマクロを実行するためには、リボンや右クリックメニューなどにボタンなどを作り込み、マクロを実行する仕掛けを組み込む必要があります。
このようにマクロブックとアドインでは、構造的な部分で違いがあります。
とはいえ、先ほども言いましたが、プログラマーのスキルと、作業内容次第ではこの違いの多くを埋めることも可能です(※シート上からのマクロ実行の仕方は分かりませんが・・)。
しかし、そうするとアドインの持ち味を失うことになります。
したがってアドインを開発する人は、前提として「この差を生かした形でアドインを作っている」ということになると思います。
アドインは便利1「Excel起動時に一緒に立ち上がる」こと
先ほども説明しましたが、アドインはExcelソフト自体が起動すると、それに引っ張られるように一緒に立ち上がります。
本当に個人的な思いでは、これは「Excelの監視」に使えます。いえ、実際に使っています(笑)。
状況としては、隠されているシートや行列でゴニョゴニョしていることに気づかなかったりで、私の頭の中で「?」状態が続くことがあるからですね。
ですので、ここでアドインとして監視プログラムを作りExcelに組み込んでおきます。すると、開こうとしている「全てのブック」に対し、隠されたシート、隠された行列があれば画面にメッセージを表示するようにしています。
押さえどころとしては、この監視はマクロブックでもできます。しかしそのためには、その監視用のマクロが入っているブックを「事前に立ち上げておく」必要があります。
言い換えると、その監視用マクロブックを起動する前に立ち上げたブックは監視対象にできません。
ところがアドインを使えば、Excel起動時から立ち上がっています。すなわちExcelを起動した直後から監視ができるわけですね。
このことからもアドインにした方が楽というわけですね。
アドインは便利2「プログラムとデータを切り離せる」こと
アドインのメリットを聞くと、おそらく多くのアドイン経験者はこの点に触れるのだろうと思います。そして、私も触れます(笑)。
アドインを使うと「データ」と「プログラム(マクロ・VBA)」の部分を切り離すことができます。
これは私の経験上は、運用後のプログラムの改修時に非常に大きな違いを与えます。
「その違いとは何か」
例えば、請求書を自動作成するツールを作ったとします。
これを「マクロブックで提供するケース」と「アドインで提供するケース」で考えてみたいと思います。
請求データを「どこのシートに入れるのか」がポイント
例えば、以下の動作をする請求書作成ツールがあるとします。
- ツール上で入力した請求データは保存される
機能のほんの一部ですが、よくある形だと思います。
しかし、このツールをマクロブックとアドインで作ると、以下の部分に違いが出てきます。
厳密には、アドインの有効性を活かすため、(開発者は)違いを作ります。
「これまでに入力した請求データをどこに溜めるのか」
この解としては、次の方法が考えられます。
- マクロブック:自ブック内にシートを作り、そこに入力(追記)する
- アドイン:アドイン内でなく、外部のブックなどに入力(追記)する
です。マクロブックの場合は、一般的なやり方だと思いますから、意味がわかりやすいかと思います。
一方、アドインの場合の意味はわかりますでしょうか?
構造的な部分で説明したように、アドイン内のシートは非表示です。もちろん設定で表示させることや、非表示であってもデータを(プログラム上から)入力できるため、言い方が微妙になるのですが、ここにはツールで使用した(する)データ、今回で言えば「請求データ」は自アドインには入れないようにしておきます。
このような作りにしておくことで「データとプログラムの分離」が可能になります。
しかし・・・だから何?というか、これだけではまだ「意味が半分」です。
次にさらに「とある状況」を含めて説明します。するとその差が出てくるんですね。
アドインの仕組みが活きるのは・・
「アドインにしてよかった」と思えるのは、プログラムの改修時やバージョンアップのときです。
「データの切り離し」は、例えば以下の状況で役に立つのですね。
例えば、次のケースで見てみます。
「プログラムに欠陥発生・・ツールの使用を中止してください!」
・・・
(数時間後)
・・・
「ツールの改修が終了しました!このメールの添付(最新版)をを使ってください!!」
と、メールの添付には最新のツールがあります。
そして、それを使ったある作業スタッフからこんな言葉が・・・
「ツール最新版・・以前に入力したデータが消えているようですが!?」
こういうケースのとき、マクロブックとアドインで対応が異なってきます。
(そもそもで、私が開発者ならばここで心臓の高鳴りがマックスに・・笑)
入力されたデータの管理方法
改修時のポイントは、すでに「利用者によって入力されたデータをどのように扱うか」です。
利用者から見ると、入力済みデータ(請求データ)は、保存しておきたいと考えるとします。
マクロブックの場合、データの保存先は「自ブック内(のシート)」です。
これは別の見方でいうと、マクロ(プログラム)とデータが一体化しているということです。
データが分離していない(切り離せていない)ため、入力済みデータを保持し続けるには、プログラムの改修をする時に適切な手順を踏まなければなりませんね。
簡単にいうと、このツールの開発者は・・
- 利用者が使っていた(データ入力済みの)マクロブックを受け取る
- 開発者はそのマクロブックを改修
- 改修後のマクロブックを利用者に再送
ということになります。
このフローは「利用者が全員同じデータを使っている」ときは、さして影響を受けないと思います。
しかし、同じデータでないとき・・データの種類が増えていくと、とてもやっかいです。
それぞれが「保存しているデータ内容が違うとき、それぞれからマクロブックを回収し、それぞれを改修する」という流れになるからですね。
もしも仮にプログラム上の改修箇所が、わずか一箇所であったとしても、回収したマクロブックそれぞれで同じ箇所を改修するという作業が繰り返し発生します。
これは冗長的で管理面からも適切というか効率的でないと思います。
この点について、アドインでは見事に回避ですね(笑)。
プログラムとデータが分離されているからです。
開発者は「手元にあるアドイン」を使ってプログラムの改修ができ、再度リリースできます。利用者が入力したデータはアドインとは別の場所にあるためにそれが可能になるわけですね。
いかがでしょうか。「データとプログラムの分離」の意味がおわかりいただけたでしょうか?
ただ、勘のよい方はお気づきかもしれませんが、「マクロブックでも分離した構造を作れる」のです。ですので大きな違いとは言えないのも事実です。
しかし、アドインはそもそも分離できるための仕組みを持っている(と思っています)ことが大事だと思います。
「この仕組みがあるから、分離せざる得ない」
「マクロブックでも分離できる」
この2つの捉え方は、もはや開発側の主観にも依存する部分かもしれませんが、アドインを使うことで開発者が「必然的に同じ方向に流れていく」・・みたいな感じかもしれません。
まとめ
何度も繰り返していますが、マクロブックでも今回のアドインような振る舞いを作ることは可能です。
敢えてアドイン化しなくても対応できることもたくさんあると思います。
その意味では、ここでの説明にしっくりこない方もいらっしゃるかもです。
私的には、当ページで説明したアドインの特徴を受けて活用しています。そして、この点はアドインを理解するためには必要な部分であると思っています。
みなさんのお役に立てたら嬉しい限りです。