Microsoft Excel

Excel und VBA: Formeln, Programmierung, Lösungen

Die Excel/VBA-Beispiele

VBA-Begriff: Event-Anweisung (Beispiel)

In folgendem Beispiel werden Ereignisse verwendet, um während einer Demonstration des schnellsten 100m-Laufs die Sekunden mitzuzählen. Der Code führt sämtliche ereignisbezogenen Methoden, Eigenschaften und Anweisungen vor, einschließlich der Event-Anweisung.

Die Klasse, die ein Ereignis hervorruft, ist die Ereignisquelle; die Klassen, die das Ereignis implementieren, werden als Ereignisziele (Sinks) bezeichnet. Die von einer Ereignisquelle ausgehenden Ereignisse können mehrere Ziele haben. Wenn die Klasse das Ereignis hervorruft, wird es bei jeder Klasse ausgelöst, die sich dazu bereit erklärt hat, Ereignisse für diese Instanz des Objekts abzufangen.

In dem Beispiel werden auch ein Formular (Form1) mit einer Schaltfläche (Command1), ein Bezeichnungsfeld (Label1), sowie zwei Textfelder (Text1 und Text2) verwendet. Wenn Sie auf die Schaltfläche klicken, wird im ersten Textfeld "Ab jetzt" angezeigt, und im zweiten Textfeld werden die Sekunden gezählt. Nach Ablauf der Gesamtzeit (9,84 Sekunden) wird im ersten Textfeld "Bis jetzt" und im zweiten "9,84" angezeigt.

Der Code für Form1 legt den Anfangs- und den Endzustand des Formulars fest. Er enthält außerdem den Code, der ausgeführt wird, wenn Ereignisse ausgelöst werden.

Option Explicit

Private WithEvents mText As TimerState

Private Sub Command1_Click()
Text1.Text = "Ab jetzt"
    Text1.Refresh
    Text2.Text = "0"
    Text2.Refresh
Call mText.TimerTask(9.84)
End Sub

Private Sub Form_Load()
    Command1.Caption = "Klicken zum Start des Zeitgebers"
    Text1.Text = ""
    Text2.Text = ""
    Label1.Caption = "Der schnellste 100m-Lauf dauerte so lange:"
    Set mText = New TimerState
    End Sub

Private Sub mText_ChangeText()
    Text1.Text = "Bis jetzt"
    Text2.Text = "9,84"
End Sub

Private Sub mText_UpdateTime(ByVal dblJump As Double)
    Text2.Text = Str(Format(dblJump, "0"))
    DoEvents
End Sub

Der restliche Code befindet sich in einem Klassenmodul namens TimerState. Die Event-Anweisungen deklarieren die Prozeduren, die bei der Auslösung von Ereignissen gestartet werden.

Option Explicit
Public Event UpdateTime(ByVal dblJump As Double)
Public Event ChangeText()

Public Sub TimerTask(ByVal Duration As Double)
    Dim dblStart As Double
    Dim dblSecond As Double
    Dim dblSoFar As Double
    dblStart = Timer
    dblSoFar = dblStart
    
    Do While Timer < dblStart + Duration
        If Timer - dblSoFar >= 1 Then
            dblSoFar = dblSoFar + 1
            RaiseEvent UpdateTime(Timer - dblStart)
        End If
    Loop
    
    RaiseEvent ChangeText
    
End Sub