Programming Field - プログラミング Tips

VBAの限界?

本サイトで紹介している「VB6.0 で wvsprintf を使ってみる」「VB で機械語を実行する」でのswprintf関数呼び出し、「Win32APIの関数をVBで使うには…」は、全てWordやExcelのマクロ「VBA」で動きます。(VBAは「Visual Basic for Applications」の略で、その名の通り特定のアプリケーションで使用できるように作られたVisual Basicです。)

VBAはVBスクリプト(VBScript)とは違い、変数に型が存在したりDeclareステートメントが使えたりするため、上に挙げた内容のように、使い方によっては非常に幅広くプログラミングすることが出来ます。

では、果たしてVBAには限界はあるのでしょうか?

1. Declareステートメントではstdcall呼び出し規約しか使えない?

「VB で機械語を実行する」より、cdecl呼び出し規約の関数も呼び出すことが出来ます。

2. VB(VBA)だけではアセンブリは使えない?

「VB で機械語を実行する」より、機械語も(無理やりですが)扱うことはできます。

3. VBAでDirectXは使えない?

→ 「DirectX N for Visual Basic Type Library」(N はバージョン)がDirectXをインストールすると使えるようになるため、これを使うことで動かすことが出来ます。ウィンドウが欲しい場合はWin32APIの関数で作成します。

※ DirectX 9 以降は、機械語レベルの内容を駆使すると使えるかもしれませんが、あまり実用的ではないと思われます。

4. VBAではDLLは作れない?

→ VBAはWordやExcelなどを起動しないと使用できないので、作れません。ただし、ただ単にアプリケーション的なものを作るのであれば、VBAでDLLを作る必要性は無いように思われます。

5. VBAでは.NETのライブラリは使えない?

機械語を駆使すれば使えないこともないとは思いますが、純粋な.NETライブラリを呼び出すのはほぼ無理です。

※ 2013年1月 追記: COM相互運用をサポートしている.NETライブラリの場合は、COMライブラリとして使用することができるため、VBAからも使用することができます。逆に、COM相互運用をサポートしていない場合は(少なくとも)機械語の処理が必須になります。
※ 2018年4月 追記: 利用する方法を「VBからCLR(.NET)を利用する」で紹介しています。

6. VBAでWindows起動時に実行できるアプリケーションを作れる?

→ WordやExcelなどは、大抵マクロを含むファイルを開くときには警告メッセージが出る(そのような設定にしておくべきです)ため、たとえ起動時にマクロを含むファイルを開く設定にしていても、そのメッセージのために実用的なものはほぼ作れないと思われます。

ということで、VBAでは比較的軽量なアプリケーションであれば十分に作成できると思われます。逆に.NETを使用したり、DLLを作成したり、スタートアッププログラムを作成したりするのは、VBAの特性上ほぼ不可能であり、ここが限界だと思われます。

最終更新日: 2018/04/22 (作成: 2008/03/11)