【VBA資産を無駄にするな】VBScriptで「.bas」ファイルを直接読み込み、動的実行する魔法のローダー
こんにちは。長年、Windowsの自動化の現場で戦ってきたエンジニアとして、今日は君に「VBScript」と「VBA」の境界を越える、少しだけ禁断で、そして最高にエキサイティングなテクニックを授けよう。
君のPCの中に眠っている、あの苦労して書いた「VBA標準モジュール(.bas)」。
「VBScript(.vbs)で使いたいけど、いちいち書き換えるのは面倒だ…」と諦めていないか?
実は、VBScriptは「読み込む側」でちょっとした工夫をするだけで、VBAのソースコードをそのまま実行環境にインジェクトできるんだ。さあ、自動化の壁をぶち破ろう。
—
1. なぜ「.bas」をそのまま読みたいのか?
VBAとVBScriptは、親戚のようなものだ。しかし、VBAはExcelなどの「ホスト」が必要だが、VBScriptはWindowsがあればどこでも動く軽量な実行環境だ。
通常、VBAのコードをVBScriptで使うには書き換えが必要だが、以下の「互換ローダー」を作れば、ライブラリを共通化できる。
つまり、ロジックを修正したら、VBAからもVBScriptからも最新の機能が即座に使えるようになる。これが「資産の再利用」の本質だ。
—
2. 魔法の鍵:`ExecuteGlobal` の正体
VBScriptには、外部から読み込んだ文字列を「その場のコード」として解釈させる `ExecuteGlobal` という関数がある。これこそが、今回の中核技術だ。
陥りやすい罠:VBA特有の構文
ただし、気をつけろ。VBAにはVBScriptには存在しない構文(例:`Attribute`宣言、`Optional`引数、`As Type`などの型指定)がある。これらを強引に読み込むとエラーになる。
解決策:
「VBAでしか動かない行」を正規表現で削除してから読み込むのが、スマートなエンジニアのやり方だ。
—
3. 実装:VBA標準モジュール・ローダー
以下のコードは、指定した `.bas` ファイルを読み込み、不要なVBA専用構文を排除した上で、現在のプロセスに展開する関数だ。
‘ VBScript: basLoader.vbs
Option Explicit
‘ 共通ライブラリを読み込んで実行するメイン処理
Dim fso, basPath, code
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 読み込みたいVBA標準モジュールのパスを指定
basPath = “C:\Projects\CommonLib.bas”
‘ 1. ファイルを読み込む
code = fso.OpenTextFile(basPath, 1).ReadAll
‘ 2. VBA専用の構文を「VBScriptが解釈できる形」に置換(クリーニング)
code = CleanVbaCode(code)
‘ 3. 動的実行!
ExecuteGlobal code
‘ — ここから先は、basファイル内に定義された関数を呼び出せる —
‘ 例: Call MySharedFunction()
WScript.Echo “ライブラリの読み込みが完了しました。”
‘ クリーニング用関数
Function CleanVbaCode(strCode)
Dim regEx
Set regEx = CreateObject(“VBScript.RegExp”)
regEx.Global = True
regEx.IgnoreCase = True
‘ “Attribute” で始まる行はVBAのメタデータなので削除
regEx.Pattern = “Attribute .?\n”
strCode = regEx.Replace(strCode, “”)
‘ 型指定(As Integerなど)はVBScriptでは文法エラーになるため削除
‘ ※簡易的な置換例。複雑な型指定は工夫が必要
regEx.Pattern = ” As [A-Za-z0-9_]+”
strCode = regEx.Replace(strCode, “”)
CleanVbaCode = strCode
End Function
—
4. この設計が「現場」で強い理由
1. 疎結合な開発: ロジック(.bas)と実行インターフェース(.vbs)が分かれているため、VBAのIDEで開発・デバッグを行い、VBScriptでバッチ処理を実行するという「良いとこ取り」が可能になる。
2. 実行効率: `ExecuteGlobal` はメモリ上でコードを解釈するため、外部のファイルを逐次読み込むよりも圧倒的に高速だ。
3. 拡張性: `CleanVbaCode` 関数を改良すれば、君のチーム独自のVBA構文にも対応できる。
—
5. 初心者がハマるポイント:先輩からの助言
- 型指定の恐怖: VBScriptは `Dim x As Integer` と書くとエラーになる。`Dim x` とだけ書くのがVBScriptの流儀だ。もしVBA側で型をバリバリ使っているなら、正規表現での除去パターンをもう少し賢くする必要があるぞ。
- イベントハンドラの不在: VBScriptはシートの `Worksheet_Change` などのイベントを直接拾えない。あくまで「関数(Sub/Function)」のライブラリ化に留めるのが、この手法の鉄則だ。
—
最後に
「プログラミングを学ぶ」ということは、「道具に振り回されること」ではなく、「道具を自分の意のままに操ること」だ。
既存の `.bas` ファイルを捨てずに、新しい環境に適合させる。この発想があれば、君のエンジニアとしての価値は一気に高まるはずだ。
まずは、シンプルな関数だけが書かれた `.bas` ファイルで試してみてくれ。うまくいった時の「動いた!」という感覚こそが、次の自動化を生むエネルギーになる。
質問があればいつでも聞いてくれ。君の自動化ライフを応援しているよ。
