【VBA機能拡張】C++でDLLを自作してExcelVBAで呼び出す方法
このページはVBAでアプリケーション拡張ファイルである「DLL」を自作して、呼び出すまでの流れを解説していきます。DLLファイルはC++言語で作成することができるため、VBAだけでは実現できないような処理をC++の機能で増幅させることができます。
ここではVBAの機能拡張という名目で進めていくので、VBAはある程度理解しているという前提で解説していきます。基本的にC++は知らなくても大丈夫な内容にはなっていますが、最終的に自作DLLを作る際には必須となるのであらかじめ注意しておいて下さい。
・DLL作成環境:Visual Studio Community 2022
DLLファイルとは
DLL(Dynamic Linking Library)とは拡張子が「.dll」のアプリケーション拡張ファイルです。
このDLLファイルの中身には様々な種類の関数がいくつもつまっています。VBAであろうとその他の言語であろうと基本的にはこのDLLファイルにアクセスして、指定した関数を呼び出すというような処理を行います。(このDLLはあくまでも呼び出される側のファイルであり、このファイル自体は実行できません)
DLLファイルを呼び出すことで、従来のアプリケーションの機能だけでは実現できない処理を可能にしたり、汎用的でいつもつかうような複数の処理を1つのファイルとしてまとめておくことが出来ます。
Windows APIの使用=DLLファイルの呼び出し
VBAの拡張として広く認知されているWindowsAPI(以下:WinAPI)もこのDLLファイルを呼び出すことで、キーボード入力の取得やマウスの操作などのアプリケーション(Excelなど)の機能だけでは実現できない処理を可能にしています。
WinAPIを使うにはまず「WinAPIの関数を使うよ」と宣言する必要があります。たとえば指定の時間処理を止める「Sleep関数」を使うにはモジュール内に下記のように宣言する必要があります。
Private Declare PtrSafe Sub Sleep Lib “kernel32″(ByVal dwMilliseconds As LongPtr)
このときWindowsAPIの関数の呼び出し元となっているファイルは「kernel32」の部分ですが、これがDLLファイルを表しています。つまり”WinAPIを使う”ということは、「kernel32.dll」や「User32.dll」「winmm.dll」といったWindowsに標準装備されているDLLファイルに書かれている関数を呼び出してマクロ処理の一部に利用することをいっているのです。
DLLファイルは自作も可能
そんなDLLファイルですがC++言語を使って自作することが可能です。
言語としてVBAと比べたときのC++のメリットとしては、処理速度の速さと扱える領域(分野)が非常に広いというところです。C++で扱うことができる処理はVBAとは比べられないほど膨大で、それらの機能をVBAマクロの一部として組み込むことができるということはマクロとして実現できる機能の幅が大きく広がることを意味します。
たとえば画像処理や機械学習で有名なライブラリ「OpenCV」というものがありますが、これはC++環境で利用することができます。つまり、このOpenCVを自作DLLの中に組み込めば、VBAマクロ内で画像処理(グレースケール化や回転、リサイズなど)や顔認識などを行うことが可能になります。
gif画像の処理内容としてはVBAで画像のパスを取得し、そのパスを引数としてOpenCVを使った”顔認識と結果表示”を行う自作DLL内の関数に渡しているだけです。顔認識処理をしてもこの速度なので、C++の処理速度の速さもなんとなく伝わると思います。
このように自作でDLLを作成することで自分に都合の良い関数を作ることができます。
イメージとしてはVBAで「Functionプロシージャ」を作っているものと思っておいて問題ありません。ただそのFunctionプロシージャはC++でできているのでVBAでは領域外の処理を行うこともできるという訳です。
自作DLLの呼び出し方は多少の違いはありますが基本的にはWinAPIと同じなので、DLLの作成さえできてしまえばVBA側のコードは非常に単純です。おそらく壁になるのはVBAで呼び出し可能なDLLファイルを作成するところです。
VBA呼び出し可能な自作DLLファイルを作ろう
DLLファイルとVBAで呼び出すメリットがわかったところで実際にDLLを自作してVBAで呼び出すまでの流れを順を追って解説していきます。1つのページにまとめると冗長になってしまうため、複数のページに分けて解説していくので上から順に読み進めて下さい。
1. 空DLLファイルの作成と呼び出し
2. DLL関数を作成する(引数なし)
3. DLL関数を作成する(引数あり)
4. DLL関数を作成する(戻り値あり)
5. VBAで自作DLLファイルを動的に呼び出す
6. OpenCVを使った顔認識マクロを作成する
参考サイト
・Excel で DLL にアクセスする | Microsoft Docs
・ExcelのVBAで使えるDLLを、C++(Visual Studio 2017)で作る。
・Excelから自作DLLを呼び出す(64ビット版) – Qiita
・1章:DLLの作成方法とVBAから呼び出し方法