イベントプロシージャの組み込み

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

2016/08/13

 イベントプロシージャは、何らかの出来事(イベント)が発生した時に呼び出される手続き(プロシージャ)のことです。

 ここでは、そのイベントプロシージャを組み込む方法を取り上げます。


《このページの目次》


    

1. ワークシートのイベントプロシージャを組み込む

 イベントプロシージャには、ワークシートに関するものとワークブックに関するものがあります。ここではワークシート関連を取り上げます。

 ワークシートのイベントプロシージャは、標準モジュールやクラスモジュールとは違うところに組み込みます。シートモジュールというコンポーネントに組み込みます。

    

 イベント(出来事)には、たとえば「該当のワークシートがアクティブになったとき」とか、「ワークシートの選択セルが変更されたとき」などいくつかあります。

 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に注目シートを移したとき、先のイベントプロシージャが呼び出されます。

    

(1) シートモジュールを扱うVBScript

 新規のワークブックには Sheet1, Sheet2, Sheet3 の三つのワークシートがあります。

 ワークシートのイベントプロシージャを組み込むときは、この三つのうちのどれに組み込むかを決める必要があります。

 下のVBScriptプログラムでは Sheet2 に組み込んでいます。

 プロシージャ(マクロ)は EventFile01.txt というファイルに書き込まれているものとします。

 以下、プログラムです。

    

△ EventIncorp01.vbs

 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(……) で行っています。

    

(2) シートモジュールを扱うJScript

 先のVBScriptと同じ処理を行うプログラムをJScriptの形で示します。

△ EventIncorp01.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("Sheet2");  // シートモジュールの選択
 9cp.CodeModule.AddFromFile(fso.GetAbsolutePathName("EventFile01.txt"));
10wb.SaveAs(bookPath, -4143);  // ブックの保存
11exlApp.Quit();  // Excel終了

    

目次に戻る


    

2. ワークブックのイベントプロシージャを組み込む

 ここではワークブックにイベントプロシージャを組み込む方法を取り上げます。

 ワークブックのイベントプロシージャは、ブックモジュールに組み込みます。

 イベントは、たとえば「該当のワークブックがオープンされるとき」とか、「ワークブックが保存されるとき」あるいは「ワークブックがクローズされるとき」などです。

    

 ワークブックのイベントプロシージャの簡単な例は下のとおり。

 該当のワークブックがオープンされるとき、「Book1.xlsを開きます.」といったメッセージを出します。

Private Sub Workbook_Open()
    MsgBox ThisWorkbook.Name & "を開きます."
End Sub

 ThisWorkbook というのは、ここではイベントプロシージャを組み込んだワークブックオブジェクトを指し示します。

    

(1) ブックモジュールを扱うVBScript

 以下に掲げるプログラムを実行すると、
ワークブックのイベントプロシージャが組み込まれた Book1.xls が作られます。

 そのBook1.xlsをオープンする度に、
「Book1.xlsを開きます.」というメッセージが出ます。

 プロシージャ(マクロ)は EventFile01.txt に書かれているものとします。

    

△ EventIncorp02.vbs

 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 にしたところだけが違います。

    

(2) ブックモジュールを扱うJScript

 先のVBScriptと同じ処理を行うプログラムをJScriptの形で示します。

△ EventIncorp02.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("ThisWorkbook");  // ブックモジュールの選択
 9cp.CodeModule.AddFromFile(fso.GetAbsolutePathName("EventFile02.txt"));
10wb.SaveAs(bookPath, -4143);  // ブックの保存
11exlApp.Quit();  // Excel終了

    

〜 以上 〜