************************************************************* * * * Automatische Code-Ausfuehrung mit Ereignissen: * * Worksheet- und Workbook-Module * * * ************************************************************* Bisher haben wir das Ausfuehren eines VBA-Programms immer von Hand gestartet, entweder durch Anklicken eines Buttons oder durch ein F5 im Programm-Code oder durch Anklicken des gruenen Pfeils in der VBA-Menueleiste (in der Standard-Toolbar). Man kann das Starten eines VBA-Programms aber auch von einem Excel-Ereignis ausloesen lassen. Excel-Ereignisse sind etwa folgende Vorkommnisse: - eine neue Excel-Mappe (Workbook) wird geoeffnet - innerhalb einer Excel-Mappe wird ein neues Tabellenblatt (Worksheet) aktiviert - auf einem Worksheet aendert sich der Inhalt einer beliebigen Zelle - die Formeln in einem Worksheet werden neu berechnet - eine Zelle wird angeklickt - eine Excel-Mappe wird geschlossen Es gibt Workbook-Ereignisse und Worksheet-Ereignisse (und noch andere Ereignisse, die jetzt aber nicht betrachtet werden sollen). Workbook-Ereignisse sind etwa - eine neue Excel-Mappe (Workbook) wird geoeffnet - eine Excel-Mappe wird geschlossen und Worksheet-Ereignisse waeren etwa - auf einem Worksheet aendert sich der Inhalt einer beliebigen Zelle - die Formeln in einem Worksheet werden neu berechnet Das Ereignis - innerhalb einer Excel-Mappe wird ein neues Tabellenblatt (Worksheet) aktiviert steht sowohl als Workbook- als auch als Worksheet-Ereignis zur Verfuegung (mit unterschiedlicher Syntax). Damit VBA-Code von einem Workbook- oder Worksheet-Ereignis gestartet werden kann, darf dieser nicht in einem Standard- Modul stehen, sondern muss in den extra fuer diesen Zweck gemachten Workbook- oder Worksheet-Modulen stehen: -> look at worksheet modules and events -> look at workbook module and events Schauen wir jetzt ein paar Beispiele an. Die folgenden 6 Beispiele sind alle aus Urtis_ExcelVBA, die ersten 3 aus Kapitel 11 und die letzten 3 aus Kapitel 12: Kapitel 11: Automating Procedures with Worksheet Events Kapitel 12: Automating Procedures with Workbook Events 1) Worksheet Events: 'p.115: Worksheet_Change Event: Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 2 Then Exit Sub Target.Offset(0, 1).Value = Format(VBA.Date, "MM/DD/YYYY") End Sub 'p.116: Worksheet_SelectionChange Event: Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cells.Interior.ColorIndex = 0 Target.Interior.Color = vbYellow End Sub 'p.117: Worksheet_BeforeRightClick Event: Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _ Cancel As Boolean) If Target.Column <> 5 Then Exit Sub Cancel = True Target.Value = Format(VBA.Now, "MMM DD, YYYY, hh:mm AM/PM") Columns(Target.Column).AutoFit End Sub 2) Workbook Events: 'p.128: Workbook_SheetChange Event: Private Sub Workbook_SheetChange(ByVal Sh As Object, _ ByVal Target As Range) If Sh.Name = "Log" Then Exit Sub Dim NextRow As Long NextRow = Worksheets("Log").Cells(Rows.Count, 1).End(xlUp).Row + 1 Worksheets("Log").Cells(NextRow, 1).Value = VBA.Date Worksheets("Log").Cells(NextRow, 2).Value = VBA.Time Worksheets("Log").Cells(NextRow, 3).Value = Sh.Name Worksheets("Log").Cells(NextRow, 4).Value = Target.Address Worksheets("Log").Columns.AutoFit End Sub 'p.128: Workbook_SheetSelectionChange Event: Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _ ByVal Target As Range) Dim myRow As Long, myColumn As Long myRow = Target.Row myColumn = Target.Column Sh.Cells.Interior.ColorIndex = 0 Sh.Rows(myRow).Interior.Color = vbGreen Sh.Columns(myColumn).Interior.Color = vbGreen End Sub 'p.127: Workbook_Activate Event: Private Sub Workbook_Activate() ActiveWindow.WindowState = xlMaximized End Sub