Tipp 0139 Excel-Ereignisse des Workbook-Objekts
Autor/Einsender:
Datum:
  Angie
22.10.2006 (Update)
Entwicklungsumgebung:   VB 6
Bei der Automatisierung von Excel können bestimmte Ereignisse, die ggf. durch den Anwender ausgelöst werden, überwacht werden. Die Verarbeitung von Ereignissen von Blättern und Arbeitmappen ist relativ einfach, da bereits im Objekt-Modell von Excel über 50 Ereignisse definiert sind, manche davon sind allerdings mehrfach definiert.
Beispielsweise kennt das Workbook-Objekt (Arbeitsmappe) das BeforeClose-Ereignis und das Application-Objekt (Anwendung) das WorkbookBeforeClose-Ereignis. Wird die Ereignisprozedur WorkbookBeforeClose des Application-Objekts benutzt, so wird diese Prozedur beim Schliessen jeder Arbeitsmappe (auch beim Programmende von Excel) ausgeführt, das BeforeClose-Ereignis dagegen nur bei der Arbeitsmappe, für die dieses Ereignis definiert wurde.
Auch bei der Automatisierung von Excel von Visual Basic aus können diese Ereignisse verwendet werden.
Code im Klassenmodul CWkbEvents
Im Klassenmodul CWkbEvents werden alle Objekt-spezifischen Eigenschaften, Methoden und Ereignisse untergebracht, hier die der Arbeitsmappe (Workbook). Diese Klasse dient als Vorlage, aus der eine Objektinstanz zur Laufzeit erzeugt wird. Es wird für jede Arbeitsmappe, die erstellt wird, eine Objektinstanz erstellt.
Um auf die entsprechenden Ereignisse reagieren zu können, wird bei der Definition der Objektvariable für die Arbeitsmappe das Schlüsselwort WithEvents benutzt.
In folgendem Beispiel wird im BeforeClose-Ereignis des Workbook-Objektes verhindert, dass die vom VB-Programm erstellte Excel-Arbeitsmappe vom Anwender in Excel geschlossen werden kann, d.h. in diesem Fall, dass dies nur über den Beenden-Button im VB-Programm möglich ist. Im Download befinden sich weitere Code-Beispiele, wie das BeforeSave-Ereignis des Workbook-Objekts, das eintritt bevor die Arbeitsmappe gespeichert wird und das WindowActivate-Ereignis, das eintritt wenn ein Arbeitsmappenfenster aktiviert wird.
Für die Anzeige der Meldungen in Excel wurde in diesem Beispiel ein Zeichnungsobjekt (Shape) statt einer MsgBox verwendet.
 
Option Explicit

Private WithEvents mevtXLWkb As Excel.Workbook
Private mobjXLShape As Excel.Shape

Private Sub Class_Terminate()
  Set mobjXLShape = Nothing
  Set mevtXLWkb = Nothing
End Sub

Public Property Set Workbook(ByRef objXLWkb As Excel.Workbook)
  Set mevtXLWkb = objXLWkb
End Property

Public Property Get Workbook() As Excel.Workbook
  Set Workbook = mevtXLWkb
End Property

Private Sub mevtXLWkb_BeforeClose(Cancel As Boolean)
  Cancel = True

  Dim strMsg As String
  strMsg = "Excel-Ereignisse des Workbook-Objekts" & vbLf & vbLf
  strMsg = strMsg & "Die Arbeitsmappe '" & mevtXLWkb.Name
  strMsg = strMsg & "' kann nur über den Button <Beenden> im "
  strMsg = strMsg & "VB-Programm geschlossen werden."

  Call DisplayXLShape(300, 110, strMsg)
End Sub

Private Sub DisplayXLShape(ByVal sngWdth As Single, _
      ByVal sngHght As Single, ByVal strMsg As String)

  Const msoShapeRoundedRectangle As Long = 5
  Dim i As Integer

  On Error Resume Next
  mobjXLShape.Delete
  Set mobjXLShape = mevtXLWkb.ActiveSheet.Shapes.AddShape _
        (msoShapeRoundedRectangle, 50, 50, sngWdth, sngHght)

  With mobjXLShape
    .Line.Weight = 1.5
    .Line.ForeColor.SchemeColor = 64
    .Line.BackColor.RGB = RGB(255, 255, 255)
    .Placement = xlFreeFloating
  End With

  With mobjXLShape.TextFrame
    .Characters.Text = ""
    For i = 0 To Int(Len(strMsg) / 255)
      .Characters(.Characters.Count + 1).Insert _
            Mid(strMsg, (i * 255) + 1, 255)
    Next

    .HorizontalAlignment = xlLeft
    .VerticalAlignment = xlVAlignCenter
    .AutoSize = False
  End With

  With mobjXLShape.TextFrame.Characters.Font
    .Name = "Arial"
    .FontStyle = "Standard"
    .Size = 10
    .ColorIndex = xlAutomatic
  End With
  On Error GoTo 0
End Sub
 
Code im Klassenmodul col_Workbooks
In der Auflistungsklasse col_Workbooks (Collection) befinden sich die benötigten Methoden mit der der Auflistung neue Objekte hinzugefügt (Add) und gelöscht (Remove) werden können, ein bestimmtes Objekt (Item) und die Anzahl (Count) der in der Auflistung enthaltenen Objekte zurückgegeben werden kann. Die Objektdaten werden in einem Collection-Objekt gespeichert.
 
Option Explicit

Private mcolXLWkbs As Collection

Private Sub Class_Initialize()
  Set mcolXLWkbs = New Collection
End Sub

Private Sub Class_Terminate()
  Set mcolXLWkbs = Nothing
End Sub

Public Function Add(ByRef objXLWkb As Excel.Workbook) As CWkbEvents
  Dim objCWkb As CWkbEvents

  On Error GoTo err_Add
  Set objCWkb = New CWkbEvents
  Set objCWkb.Workbook = objXLWkb
  mcolXLWkbs.Add objCWkb
  Set Add = objCWkb
  Set objCWkb = Nothing

exit_Func:
  On Error GoTo 0
  Exit Function

err_Add:
  MsgBox "Fehler: " & Err.Number & vbCrLf & _
        Err.Description, vbOKOnly + vbCritical
  Resume exit_Func
End Function

Public Property Get Item(ByVal Index As Variant) As CWkbEvents
  Set Item = mcolXLWkbs.Item(Index)
End Property

Public Property Get Count() As Long
  Count = mcolXLWkbs.Count
End Property

Public Sub Remove(ByVal Index As Variant)
  mcolXLWkbs.Remove Index
End Sub
 
Code im Codebereich der Form
Im Codebereich der Form befindet sich der Code zum Starten und Beenden der Excel-Anwendung als auch für das Erstellen der zwei neuen Arbeitsmappen.
 
Option Explicit

Private mobjXLApp   As Excel.Application
Private mcolXLWkbs  As col_Workbooks

Private Sub cmdStartXL_Click()
  Dim objXLWkb As Excel.Workbook

  On Error GoTo err_Excel
  Set mobjXLApp = CreateObject("Excel.Application")

  Set mcolXLWkbs = New col_Workbooks
  Set objXLWkb = mobjXLApp.Workbooks.Add
  mcolXLWkbs.Add objXLWkb
  Set objXLWkb = Nothing

  Set objXLWkb = mobjXLApp.Workbooks.Add
  mcolXLWkbs.Add objXLWkb
  Set objXLWkb = Nothing

  mcolXLWkbs.Item(1).Workbook.Activate
  mobjXLApp.Visible = True
  mobjXLApp.UserControl = True

exit_Sub:
  On Error Resume Next
  Me.cmdStartXL.Enabled = False
  Me.cmdQuit.Default = True
  On Error GoTo 0
  Exit Sub

err_Excel:
  MsgBox "Fehler bei der Verbindung zu Excel!", vbCritical
  Resume exit_Sub
End Sub

Private Sub cmdQuit_Click()
  Unload Me
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, _
      UnloadMode As Integer)
  On Error Resume Next
  mobjXLApp.EnableEvents = False

  Dim i As Integer
  For i = 1 To mcolXLWkbs.Count
    mcolXLWkbs.Item(1).Workbook.Close False
    mcolXLWkbs.Remove 1
  Next
  Set mcolXLWkbs = Nothing

  mobjXLApp.EnableEvents = True
  mobjXLApp.Quit
  Set mobjXLApp = Nothing
  On Error GoTo 0
End Sub
 
Weitere Links zum Thema
Automation mit Office-Anwendungen
Excel-Automatisierungsfehler vermeiden
Excel-Ereignisse des Worksheet-Objekts
Excel-Ereignisse im Überblick
Ereignisse des Application-Objekts
Ereignisse des Chart-Objekts
Ereignisse des Workbook-Objekts
Ereignisse des Worksheet-Objekts
Hinweis für VBA-Anwender
Im Download befindet sich auch ein Word/VBA-Beispiel. Wird Excel über eine UserForm gestartet, wie in diesem Beispiel, dann muss die UserForm ungebunden angezeigt werden, ansonsten "stürzt" Excel ab.
Hinweis
Um diesen Tipp ausführen zu können, muss Excel installiert sein und zur Entwurfszeit die Microsoft Excel x.0 Object Library in das Projekt eingebunden werden.
Für die Anzeige der Meldungen im Zeichnungsobjekt (Shape) in Excel ist bei Early Binding zusätzlich das Einbinden der Objektbibliothek Microsoft Office x.0 Object Library notwendig. Bei Late Binding wird zur Entwurfszeit kein Verweis auf die Objektbibliothek in das Projekt eingebunden. Alle verwendeten Objekte werden mit dem Variablentyp Object definiert. Ggf. verwendete anwendungsspezifische Konstanten müssen mit dem entsprechenden numerischen Äquivalent der Konstante ersetzt werden, könnten aber auch mit der Const-Anweisung deklariert werden. Die Verwendung von Konstanten erleichtert das Dokumentieren und Modifizieren Ihrer Programme, und trägt auch zur besseren Lesbarkeit des Codes bei.

Windows-Version
95
98/SE
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (38 kB) Downloads bisher: [ 1806 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Sonntag, 28. August 2011