Als erstes halten wir mal fest, das VBA keine objektorientierte Sprache ist, sondern objektbasiert (für ersteres fehlt ihr Vererbung).
Du willst scheinbar eine Klasse schreiben, die einen Event auslöst.
'Klassenmodul: clsModule
Option Explicit
Private Const E_NOT_INITIALIZED As Long = &H1
Public Event MyEvent(ByVal Module As clsModule, ByVal Message As String)
Private m_strName As String
Private m_blnInitialized As Boolean
Public Sub Initialize(Name As String)
m_strName = Trim$(Name)
m_blnInitialized = m_strName <> ""
End Sub
Public Property Get Name() As String
Name = m_strName
End Property
Public Sub Notify()
If m_blnInitialized = False Then
Call Err.Raise(vbObjectError + E_NOT_INITIALIZED, Description:="Klasse ist nicht initialisiert.")
End If
RaiseEvent MyEvent(Me, "Hallo, ich bin """ & Me.Name & """.")
End Sub
Test:
Option Explicit
Private WithEvents m_objModule As clsModule
Sub Test()
If m_objModule Is Nothing Then
Set m_objModule = New clsModule
End If
Call m_objModule.Initialize("Module-0A5")
Call m_objModule.Notify
End Sub
Private Sub m_objModule_MyEvent(ByVal Module As clsModule, ByVal Message As String)
Call MsgBox(Message, vbInformation)
End Sub
Wenn du jetzt möchtest, dass sich verschiedene Modul-Instanzen untereinander benachrichtigen können, dann brauchst du so etwas wie einen ModuleManager - in einem spezielleren Fall einen Mediator - der alle Module kennt und wenn eines davon sich meldet, leitet er es an alle restlichen weiter. Über einen kleinen Trick kann man in VBA diesen als Singleton implementieren.
- Ich vermute das ist es, was du vor hast?
Ganz so "sauber" wie man es von OOP Sprachen her kennt, wirst du es in VBA nicht hinbekommen, denn VBA gibt das teilweise nicht her oder wird schnell unschön.
Grüße
|