記事キャッチ画像
 (24) オブジェクトが親子関係を持つ場合、子から親の順でイベントは発生する! 

 1. コードの共通化と再利用の促進 

 2. ダブルクリック時のイベント発生順の確認 

  「広告」  
 

 (24) オブジェクトが親子関係を持つ場合、子から親の順でイベントは発生する! 

Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。 

Excel 2016 for Mac 環境での説明となりますので、 Mac版 Excel 2011 では( VBA が利用できますが )同じ結果にならない場合があるかもしれません。

現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)

( ユーザー定義関数 のVBAコードを含んだ)前回使用した XLSM ファイルを、「マクロを有効」にして開きます。

52

 [ alt ] + [ F11 ] にて VBE を開き、(上記画面赤枠の) Module1 を選択後、末尾に以下の VBAコードを入力するかコピーして貼り付け 

'----------------------------------------
'    My_BeforeDoubleClick()
'----------------------------------------
Public Sub My_BeforeDoubleClick(Target As Range)

    If Target.Interior.Color = RGB(0, 127, 63) Then
        Target.Interior.ColorIndex = 0    ' Color clear!
    Else
        Target.Interior.Color = RGB(0, 127, 63)
    End If

End Sub

 次に、Sheet1 モジュールを以下のように修正するか、コピーして貼り付け 

'----------------------------------------
'    Event: Worksheet_BeforeDoubleClick()
'----------------------------------------
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    MsgBox ActiveSheet.Name & " Event : " & Target.Address(False, False)

    Call My_BeforeDoubleClick(Target)

Rem Cancel = True

End Sub

 次に、Sheet2 モジュールに以下コードを追加するか、コピーして貼り付け 

Rem
Rem    Sheet2 (Sheet2)
Rem

Option Explicit

'----------------------------------------
'    Event: Worksheet_BeforeDoubleClick()
'----------------------------------------
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    MsgBox ActiveSheet.Name & " Event : " & Target.Address(False, False)

    Call My_BeforeDoubleClick(Target)

    Cancel = True

End Sub

 最後は、ThisWorkbook モジュールに以下コードを追加するか、コピーして貼り付け 

'--------------------------------
'    Event: Workbook_SheetBeforeDoubleClick()
'--------------------------------
Private Sub Workbook_SheetBeforeDoubleClick( _
ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

    MsgBox ActiveWorkbook.Name & " Event " & Sh.Name & " : " _
    & Target.Address(False, False)

End Sub

コード右端に 「半角SPACE」と「アンダーバー」付加で、本来1行に記述すべきコードを複数行に分割して見易くできる
もちろん、見難くなるだけで複数行に分割しなくとも良い。


 1. コードの共通化と再利用の促進 

同じコードを色々な所に記述するのは、メンテナンスが大変になるので避けたほうが良い。
1か所修正するだけで、全ての修正が反映されるようにすべきだ。
機能の部品化を行ない、コードの共通化と再利用を促進し続ければ、後々楽ができる。
共通するコードをモジュール内にプロシージャとして記述しておき、それを呼び出すだけだ。
他のブックでも利用したければ、以前説明したとおり PERSONAL.XLSB モジュール内に Public プロシージャとして記述する。

今回のサンプルコードでは、 Sheet1Sheet2 モジュール内から Module1My_BeforeDoubleClick プロシージャ を呼び出している。
Sheet1 と Sheet2 モジュール内に記述した Worksheet_BeforeDoubleClick プロシージャのコードの違いは、「 Cancel = True 」がコメントになっているかどうかだけ。


 2. ダブルクリック時のイベント発生順の確認 

ワークシートやグラフシートオブジェクトは Workbook オブジェクトの子供で、 Workbook オブジェクトを管理する親のオブジェクトは Excel 自体を表す Application オブジェクトだ。
Sheet1 か Sheet2 内のセルをダブルクリックして確認できる通り、親子関係を持つオブジェクトの場合は子から親の順でイベントは発生する。
ついでに、BeforeDoubleClick プロシージャの「 Cancel = True 」有り無しの違いも確認して欲しい。


次回は、「イベント発生を制御する方法」を理解します!


お疲れ様でした!
[command] + [Q] にてExcel を終了時、「作業中のブック」を保存するか確認のダイアログ画面が表示されるため 「保存」しましょう。
現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)


最後まで読んでいただき、ありがとうございます。
ぜひ、右側の「人気ブログランキング」投票に ご協力ください。
また、お越しくださいませ。
// アタル

  「広告」