カテゴリー名: [VBEの自動操作によるExcelマクロの組込み]
マクロを組み込むだけでなく、組み込んだマクロを実行します。
また、組み込んだマクロを削除する方法にも触れます。
このシリーズのテーマは、マクロの組み込みです。その意味で、マクロの実行と削除は番外編といえます。ただ、この実行と削除を知っておくと便利なケースがあります。
Excelの自動操作は、マクロを使わなくても OLEという仕組みを用いて行うことができます。これまで掲げてきたVBScriptプログラムは、いずれもOLEを利用して「マクロの組み込み」を行うものです。
といっても、外側からExcelを操るOLEには「かゆいところに手が届く」とはいかない点があります。「マクロを使った方がやりやすい」という場合があるのは確かです。
そんなとき、マクロを組み込んで、それを実行する方法(自動操作の方法)を知っていれば便利です。
そして、マクロの実行は一度こっきりでいいということなら、実行後にそのマクロを削除します。
マクロの実行と削除の解説を記す前に、まずサンプルのマクロとVBScriptプログラムを掲げます。
今回、組み込むマクロは次の3行です。TestRunCode.txt として保存しておきます。
Sub SetValue(CellVal)
Range("A1").Value = CellVal
End Sub
このマクロは、渡されたパラメータをA1セルに書き込むものです。
このマクロを組み込んでから実行し、そして削除します。
削除後にワークブックを Book1.xls という名前で保存します。
Book1.xlsのSheet1のA1セルに、Hello! が書き込まれているはずです。
1Option Explicit 2Dim FSO, BookPath, MacroName 3Dim EXLapp, WBobj, CPobj 4 5Set FSO = CreateObject("Scripting.FileSystemObject") 6BookPath = FSO.GetAbsolutePathName("Book1.xls") 7If (FSO.FileExists(BookPath) = True) Then FSO.DeleteFile(BookPath) 8Set EXLapp = CreateObject("Excel.Application") ' Excelの起動 9EXLapp.Visible = True ' Excelを見える状態に 10Set WBobj = EXLapp.Workbooks.Add() ' Workbookの新規作成 11Set CPobj = WBobj.VBProject.VBComponents.Add(1) ' 標準モジュール追加 12CPobj.CodeModule.AddFromFile FSO.GetAbsolutePathName("TestRunCode.txt") 13MacroName = "'" & WBobj.Name & "'!" & CPobj.Name & ".SetValue" 14EXLapp.Run MacroName, "Hello!" ' マクロの実行 15WBobj.VBProject.VBComponents.Remove CPobj ' コンポーネントModule1を削除 16WBobj.SaveAs BookPath, -4143 17EXLapp.quit
上のプログラムについて、以降で説明を加えます。
マクロの実行は、VBAで書くと Application.Run で行います。
このRunを呼び出すとき、第1パラメータにはマクロ名を指定します。
マクロ名は、単に SetValue
としてもいいのですが、今回は念のためフルネームを指定しました。
'Book1'!Module1.SetValue
がフルネームです。
ワークブック名、コンポーネント名、プロシージャ名の三つを上の形式で記述します。
フルネームにしておけば別のコンポーネントに同じ名前のプロシージャがあっても、問題なく意図したプロシージャを実行できます。
たとえば、Module2という名前のコンポーネントがあって、その中にもSetValueというプロシージャがある場合、単に SetValue とするのでなく、Module1.SetValue
とか Module2.SetValue
とすれば確実です。ブック名も加えればさらに安心。
それから、マクロに引き渡すパラメータは、マクロ名の後にカンマで区切って記述します。サンプルでは “Hello!” になっています。
該当の箇所を掲げると次のとおり。
MacroName = "'" & WBobj.Name & "'!" & CPobj.Name & ".SetValue"
EXLapp.Run MacroName, "Hello!"
マクロの削除、正確には「コンポーネントの削除」ですが、これは Removeメソッドで行います。
一つのコンポーネントに Macro1, Macro2 など複数のプロシージャが含まれていると、それらが全部削除されます。
Module1 という名前のコンポーネントを削除するには次のようにします。
Set CPobj = WBobj.VBProject.VBComponents("Module1")
WBobj.VBProject.VBComponents.Remove CPobj
これまでのべてきた事柄をJScriptで書くと次のようになります。
1var fso, exlApp, wb, cp; 2fso = WScript.CreateObject("Scripting.FileSystemObject"); 3var bookPath = fso.GetAbsolutePathName("Book1.xls"); 4if (fso.FileExists(bookPath)) fso.DeleteFile(bookPath); 5exlApp = WScript.CreateObject("Excel.Application"); // Excelの起動 6exlApp.Visible = true; // Excelを見える状態に 7wb = exlApp.Workbooks.Add(); // Workbookの新規作成 8cp = wb.VBProject.VBComponents.Add(1); // 標準モジュール追加 9cp.CodeModule.AddFromFile(fso.GetAbsolutePathName("TestRunCode.txt")); 10var macroName = "'" + wb.Name + "'!" + cp.Name + ".SetValue"; 11exlApp.Run(macroName, "Hello!"); // マクロの実行 12wb.SaveAs(bookPath, -4143); // ブックの保存 13exlApp.Quit(); // Excel終了
〜 以上 〜