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
|
|
|
|
|
Excel-Ereignisse im Überblick |
|
|
|
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.
|
|
|
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.
|
|