マクロの実行と削除

カテゴリー名: [VBEの自動操作によるExcelマクロの組込み

2016/08/13

 マクロを組み込むだけでなく、組み込んだマクロを実行します。

 また、組み込んだマクロを削除する方法にも触れます。


《このページの目次》


    

1. 概略

 このシリーズのテーマは、マクロの組み込みです。その意味で、マクロの実行と削除は番外編といえます。ただ、この実行と削除を知っておくと便利なケースがあります。

 Excelの自動操作は、マクロを使わなくても OLEという仕組みを用いて行うことができます。これまで掲げてきたVBScriptプログラムは、いずれもOLEを利用して「マクロの組み込み」を行うものです。

 といっても、外側からExcelを操るOLEには「かゆいところに手が届く」とはいかない点があります。「マクロを使った方がやりやすい」という場合があるのは確かです。

 そんなとき、マクロを組み込んで、それを実行する方法(自動操作の方法)を知っていれば便利です。

 そして、マクロの実行は一度こっきりでいいということなら、実行後にそのマクロを削除します。

    

目次に戻る


    

2. サンプルのマクロとVBScript

 マクロの実行と削除の解説を記す前に、まずサンプルのマクロとVBScriptプログラムを掲げます。

 今回、組み込むマクロは次の3行です。TestRunCode.txt として保存しておきます。

Sub SetValue(CellVal)
    Range("A1").Value = CellVal
End Sub

 このマクロは、渡されたパラメータをA1セルに書き込むものです。

 このマクロを組み込んでから実行し、そして削除します。

 削除後にワークブックを Book1.xls という名前で保存します。
Book1.xlsのSheet1のA1セルに、Hello! が書き込まれているはずです。

    

△ TestRunMacro.vbs

 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

    

 上のプログラムについて、以降で説明を加えます。

目次に戻る


    

3. マクロの実行

 マクロの実行は、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!"

    

目次に戻る


    

4. マクロの削除

 マクロの削除、正確には「コンポーネントの削除」ですが、これは Removeメソッドで行います。

 一つのコンポーネントに Macro1, Macro2 など複数のプロシージャが含まれていると、それらが全部削除されます。

 Module1 という名前のコンポーネントを削除するには次のようにします。

Set CPobj = WBobj.VBProject.VBComponents("Module1")
WBobj.VBProject.VBComponents.Remove CPobj

    

目次に戻る


    

5. JScript

 これまでのべてきた事柄をJScriptで書くと次のようになります。

△ TestRunMacro.js

 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終了

〜 以上 〜