2018年07月28日

VBA 自作クラスへのイベント実装例

自作クラスへのイベント実装例です。
ここでは爆弾クラスというのを作り、イベントの発生がどのように別クラスに作用するかを見ていきます。
爆弾クラスは「爆発イベント」を発生させるごとに自動車クラス、家クラスの現在価格を減額していきます。

かなり突飛な内容のサンプルですがイベントの動きを理解するのにはちょうどいいかと思って作成しました。
実務的には、例えはExcelなら「1シートに入力→別の複数シートにデータを反映」というようなときに使えます。

作成するクラスは下記の通りです。
なおCarClass、HouseClassと2つあるのは、一回のイベント発生で別クラス、複数インスタンスに作用するのを見るためにです。

クラス名論理クラス名役割説明
BombClass爆弾クラスイベントが発生する
actionプロシージャの呼び出しによりexplodeイベントを発生させる。
CarClass自動車クラス発生したイベントを受け取る
BombClassのメンバ変数を持つ。
explodeイベントプロシージャを持つ。
HouseClass家クラス

爆弾クラス(BombClass)
'爆弾クラス(BombClass)

Option Explicit

'爆発イベントの宣言
Public Event explode(damage As Long, count As Integer)

'メンバ変数 爆発回数記録
Private m_count As Integer

'爆発スイッチプロシージャ
Public Sub action(ByVal damage As Long)
'爆発回数インクリメント
m_count = m_count + 1

'爆発イベントの発生
RaiseEvent explode(damage, m_count)
End Sub
自動車クラス(CarClass)
'自動車クラス(CarClass)

Option Explicit

'イベントの発生するメンバ変数
Private WithEvents m_bomb As BombClass

'メンバ変数 所有者
Private m_owner As String
'メンバ変数 価格
Private m_value As Long

'プロパティプロシージャ
Property Set bomb(ByRef bomb As BombClass)
'爆弾クラスのインスタンスを受け取る
Set m_bomb = bomb
End Property

'所有者と価格を設定
Public Sub setOwner(name As String, value As Long)
m_owner = name
m_value = value
End Sub

'爆発イベントプロシージャ
Private Sub m_bomb_explode(damage As Long, count As Integer)
m_value = m_value - damage
Call MsgBox(m_owner & "さんの自動車が爆発した(" & CInt(count) & "回目)。現在価格:" & CStr(m_value))
End Sub
家クラス(HouseClass)
'家クラス(HouseClass)

Option Explicit

'イベントの発生するメンバ変数
Private WithEvents m_bomb As BombClass

'メンバ変数 所有者
Private m_owner As String
'メンバ変数 価格
Private m_value As Long

'プロパティプロシージャ
Property Set bomb(ByRef bomb As BombClass)
'爆弾クラスのインスタンスを受け取る
Set m_bomb = bomb
End Property

'所有者と価格を設定
Public Sub setOwner(name As String, value As Long)
m_owner = name
m_value = value
End Sub

'爆発イベントプロシージャ
Private Sub m_bomb_explode(damage As Long, count As Integer)
m_value = m_value - damage
Call MsgBox(m_owner & "さんの家が爆発した(" & CInt(count) & "回目)。現在価格:" & CStr(m_value))
End Sub
呼び出し側(ActiveXボタンを貼り付けてイベントプロシージャを記述)
Option Explicit

Public Sub CommandButton1_Click()
'自動車クラスのインスタンスを生成
Dim car1 As New CarClass
'所有者と価格をセット
Call car1.setOwner("太郎", 1000)

'家クラスのインスタンスを生成
Dim house1 As New HouseClass
'所有者と価格をセット
Call house1.setOwner("花子", 3500)

'爆弾インスタンスを生成
Dim myBomb As New BombClass

'自動車クラスのインスタンスに爆弾をセット
Set car1.bomb = myBomb
'家クラスのインスタンスに爆弾をセット
Set house1.bomb = myBomb

'減少額を指定して爆発(1回目)
Call myBomb.action(50)

'減少額を指定して爆発(2回目)
Call myBomb.action(250)

End Sub

ポイント

  • イベントが発生するごとに、各インスタンスのイベントプロシージャが自動で呼ばれる。
  • イベント発生とともに引数が渡せる。
タグ:Excel VBA
posted by Hiro at 19:07| Comment(0) | プログラム