カテゴリー名: [VBEの自動操作によるExcelマクロの組込み]
イベントプロシージャは、何らかの出来事(イベント)が発生した時に呼び出される手続き(プロシージャ)のことです。
ここでは、そのイベントプロシージャを組み込む方法を取り上げます。
イベントプロシージャには、ワークシートに関するものとワークブックに関するものがあります。ここではワークシート関連を取り上げます。
ワークシートのイベントプロシージャは、標準モジュールやクラスモジュールとは違うところに組み込みます。シートモジュールというコンポーネントに組み込みます。
イベント(出来事)には、たとえば「該当のワークシートがアクティブになったとき」とか、「ワークシートの選択セルが変更されたとき」などいくつかあります。
Excelのユーザーがマウスやキーボードを操作すると、操作の種類によってはイベントが発生することになります。
イベントが発生した場合に、それに応じて実行されるプロシージャをシートモジュールに登録しておくと、どのタイミングで発生するか分からないイベントに対応できるようになります。
ワークシートのイベントプロシージャの簡単な例は下のとおり。
Private Sub Worksheet_Activate()
Range("A1").Value = "=NOW()"
Range("A1").NumberFormatLocal = "HH:MM:SS"
End Sub
上は、ワークシートがアクティブになる度に実行されます。
これが実行されると、A1セルに現在日時が書き込まれます。表示は 17:09:12 のような時刻だけになります。
このプロシージャが Sheet1 のシートモジュールに組み込まれている場合、
ユーザーがExcelをGUI操作して、Sheet2やSheet3からSheet1に注目シートを移したとき、先のイベントプロシージャが呼び出されます。
新規のワークブックには Sheet1, Sheet2, Sheet3 の三つのワークシートがあります。
ワークシートのイベントプロシージャを組み込むときは、この三つのうちのどれに組み込むかを決める必要があります。
下のVBScriptプログラムでは Sheet2 に組み込んでいます。
プロシージャ(マクロ)は EventFile01.txt というファイルに書き込まれているものとします。
以下、プログラムです。
1Option Explicit 2Dim FSO, BookPath 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("Sheet2") ' シートモジュールの選択 12CPobj.CodeModule.AddFromFile(FSO.GetAbsolutePathName("EventFile01.txt")) 13WBobj.SaveAs BookPath, -4143 14EXLapp.quit
標準モジュールの組み込みとほとんど同じですが、
コンポーネントを追加(Add)するのでなく、
名前(“Sheet2”)によって、扱うコンポーネントを指定します。
マクロのコードを組み込むのは、同じく CodeModule.AddFromFile(……) で行っています。
先のVBScriptと同じ処理を行うプログラムを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("Sheet2"); // シートモジュールの選択 9cp.CodeModule.AddFromFile(fso.GetAbsolutePathName("EventFile01.txt")); 10wb.SaveAs(bookPath, -4143); // ブックの保存 11exlApp.Quit(); // Excel終了
ここではワークブックにイベントプロシージャを組み込む方法を取り上げます。
ワークブックのイベントプロシージャは、ブックモジュールに組み込みます。
イベントは、たとえば「該当のワークブックがオープンされるとき」とか、「ワークブックが保存されるとき」あるいは「ワークブックがクローズされるとき」などです。
ワークブックのイベントプロシージャの簡単な例は下のとおり。
該当のワークブックがオープンされるとき、「Book1.xlsを開きます.」といったメッセージを出します。
Private Sub Workbook_Open()
MsgBox ThisWorkbook.Name & "を開きます."
End Sub
ThisWorkbook というのは、ここではイベントプロシージャを組み込んだワークブックオブジェクトを指し示します。
以下に掲げるプログラムを実行すると、
ワークブックのイベントプロシージャが組み込まれた Book1.xls が作られます。
そのBook1.xlsをオープンする度に、
「Book1.xlsを開きます.」というメッセージが出ます。
プロシージャ(マクロ)は EventFile01.txt に書かれているものとします。
1Option Explicit 2Dim FSO, BookPath 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("ThisWorkbook") 12CPobj.CodeModule.AddFromFile(FSO.GetAbsolutePathName("EventFile02.txt")) 13WBobj.SaveAs BookPath, -4143 14EXLapp.quit
上のプログラムは、ワークシートのイベントプロシージャを組み込むための EventIncorp02.vbs とほとんど同じです。
VBComponents("Sheet2")
の Sheet2 を ThisWorkbook に変更し、
読み込むマクロファイルを EventFile02.txt にしたところだけが違います。
先のVBScriptと同じ処理を行うプログラムを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("ThisWorkbook"); // ブックモジュールの選択 9cp.CodeModule.AddFromFile(fso.GetAbsolutePathName("EventFile02.txt")); 10wb.SaveAs(bookPath, -4143); // ブックの保存 11exlApp.Quit(); // Excel終了
〜 以上 〜