WithEventsキーワードとは

VB6,VBA,VBS,EXCEL,DOS,BAT,WSH,WORDの小技メモ

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ 燈明日記/ Perlノート/ 漢字起源/ yahoo

はじめに

本ページは、ウインドウズ系全般のティプスメモです。

そう、はじめはVB系のティプスメモだったのですが…いつの間にか、ウインドウズ系全般のティプスメモになってしまいました。

ちなみに、ティプス(Tips)とは、マニュアルに書かれていない技法や裏わざのことですが、本ページでは、私が経験してこれはと思ったノウハウのメモになっています。

尚、以下は本サイトの最新情報(ブログ)です。

それでは、本ページが何かのお役に立てれば幸いです。ごゆっくりご覧ください。

◆ WithEventsキーワードとは

EXCELのVBAは、当然、EXCELのイベントが拾えます。

しかし、VB6からEXCELのイベントを拾うにはどうしたらよいでしょうか…。

それには、WithEventsキーワードを使います。

ちなみに、WithEventsキーワードは、標準モジュール内では使えません(基本的にクラスモジュールで使う)。

また、Excelを使う場合は、参照設定でそのObject Libraryをチェックする。

'クラスモジュール---------------------------------------
'
'Class1:WithEventsキーワードテストサンプルクラス
'
'-------------------------------------------------------
Private WithEvents xlsApp   As Excel.Application
Private bokWork             As Excel.Workbook
Private shtSheet            As Excel.Worksheet
Private Declare Sub Sleep Lib ""kernel32"" (ByVal dmMilliseconds As Long)
Private intFg As Integer    '初回フラグ

Private Sub Class_Initialize()
    '
    '初期処理:インスタンス時に呼ばれる。
    '
    intFg = 0
    Set xlsApp = CreateObject(""Excel.Application"")
    Set bokWork = xlsApp.Workbooks.Open(App.Path & ""\"" & App.EXEName & "".xls"")
    Set shtSheet = bokWork.Worksheets(""sheet1"")
    bokWork.Activate
    shtSheet.Activate
End Sub

Private Sub Class_Terminate()
    '
    '終了処理:インスタンスNoting時に呼ばれる。
    '
    xlsApp.Quit
    Set shtSheet = Nothing
    Set bokWork = Nothing
    Set xlsApp = Nothing
End Sub

Private Sub xlsApp_WorkbookOpen(ByVal Wb As Excel.Workbook)
    '
    'ブックオープン時に呼ばれる。
    '
    MsgBox ""イベントキターーーーーーーーーー""
    '初回の自分の起動以外は、起動されてもクローズする。
    If (intFg <> 0) Then
      Wb.Close
    Else
      intFg = 1
    End If
End Sub

Public Sub dmy()
    '
    'ブックオープン時に呼ばれる。
    '
    Dim i As Integer

    For i = 1 To 10
        DoEvents
        shtSheet.Cells(i, 1) = i
        Sleep 1000
    Next
    bokWork.Save
End Sub
'標準モジュール-----------------------------------------
'
'WithEventsキーワードテストサンプルプログラム
'
'-------------------------------------------------------
Sub main()
    '
    'メイン処理
    '
    Dim objClass1 As Object
    
    'クラスClass1をインスタンスする。
    Set objClass1 = New Class1
    
    'dmyメソッド実行する。
    objClass1.dmy
    
    'インスタンス破棄する。
    Set objClass1 = Nothing
End Sub

処理概説

EXCELは、MDIアプリケーションです。

全く関係のない複数のブックを起動すると『同一 Excelアプリケーション内』となって、影響し合う場合があります。

そこで、影響が想定される場合は、後から起動されたブックを即座にクローズさせれば、影響回避ができるわけです。

上記の処理は、自ブックのシートのセルにデータを格納します。

格納中に自ブック以外がオープンされた場合、WorkbookOpenイベントを拾って、即座にそれをクローズさせます。


また、上記のイベント取得はEXCELウィンドウ内ですが、ブック内、シート内のイベントを拾うには以下のようにWithEventsキーワードを指定します。

Private WithEvents bokWork   As Excel.Workbook
Private WithEvents shtSheet  As Excel.Worksheet

おわりに

以下のページには、すべてのTIPSがあります。もしよろしければ、どうぞ!

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくVB-TIPS掲示板へご指摘ください。

人のよいところをどんどん見つけよう