xlEventServer
Downloads xlEventServer

Beispiele ...
Neue Events für Ihre Excel-Arbeitsmappen

Dieses COM-AddIn hat es wirklich in sich ... Es versogt Ihre Arbeitsmappen mit tollen neuen Ereignissen, die Sie dann mit VBA-Code verwenden können. Es funktioniert genau so, wie bei den exceleigenen Ereignissen.


Und hier sind sie ...

OnWorkbookMinimize tritt ein, wenn das Fenster der geöffneten Mappe minimiert wird.

OnWorkbookMaximize tritt ein, wenn das Fenster der geöffneten Mappe maximiert wird.

OnMouseWheel wird ausgelöst, sobald am Mausrad (soweit vorhanden) gedreht wird.

OnButtonDown tritt ein, wenn eine Maustaste gedrückt wird.

OnDblClick tritt ein, wenn ein Doppelklick einer Maustaste gemacht wird.

OnMove tritt ein, wenn der Mauszeiger über die Arbeitsmappe bewegt wird.

OnApplicationMinimize tritt ein, wenn die Excel-Anwendung minimiert wird.

OnApplicationMaximize tritt ein, wenn die Excel-Anwendung maximiert wird.

OnApplicationRestore tritt ein, wenn die Excel-Anwendung wiederhergestellt wird.


Einschränkungen/Probleme

Ich habe das Tool mit xl2000, xlXP und xl2003 getestet, mit großen und kleinen Dateien, und soweit scheint alles zu funktionieren.

Beachten Sie aber bitte, daß das Tool ja auf VBA-Code zugreifen muß. Dieses kann sich in einem Performanceverlust auf Ihrem System bemerkbar machen. Das Programm läuft, sobald es im COM-Addin-Manager angewählt wird. Wenn Sie dann in Ihrer Excel-Arbeitsmappe arbeiten (mit der Maus), werden die Events gefeuert. Sobald Sie mit dem Mauszeiger den Bereich der aktiven Arbeitsmappe wieder verlassen, funktioniert wieder alles wie gewohnt. Entwickelt habe ich das Tool auf einem Pentium-Rechner mit 350MHz, und es funktioniert einwandfrei ...

Wie gesagt, ich habe es mit verschiedenen Excel-Versionen ausprobiert. Bei meinen Tests bin ich aber auf eine Excel-Datei gestoßen, mit der es einfach nicht richtig funktionieren will. Ich nehme an, daß diese Datei mit einer früheren Excel-Version erstellt wurde. Dieser Effekt kann zu einem Datenverlust führen, wenn Sie z.B. mit einer funktionierenden Excel-Datei arbeiten, deren Änderungen noch nicht gespeichert wurden, und dann eine solche Problem-Datei öffnen. Excel kann dann möglicherweise die Änderungen nicht mehr speichern. Sollte diese Situation eintreten, reicht es normalerweise aus, den Mauszeiger aus dem Arbeitsblattbereich zu entfernen (ggf. etwas warten) und dann die Problem-Datei zu schließen.


Die Alternative

Um die Performance-Probleme, die mit den VBA-Aufrufen auftreten, zu umgehen, könnte man die Funktionen auch direkt in eine DLL konpilieren. Hierzu finden Sie auch den Download xlEventServerDemo einer solchen Excel/DLL-Lösung. Es würde sich generell anbieten, Excel-Dateien an eine DLL anzubinden. Damit lassen sich dann auch die Möglichkeiten einer richtigen Programmiersprache nutzen.


Wie funktioniert's?

Das COM-Addin wird installiert und sendet die Events an die jeweils aktive Arbeitsmappe. Jede Arbeitsmappe, die die Events verarbeiten will, benötigt ein zusätzliches Modul, in dem das Grundgerüst des Codes enthalten ist. Das hört sich kompliziert an, ist aber ganz einfach. Es muß nur ein neues (normales) Code-Modul angelegt werden, in welches dann der unten angegebene Quelltext eingefügt wird, und zwar genauso wie es dort steht. Das Modul erfordert keinen bestimmten Namen. Es sind auch einige Beispiele angegeben, die Sie verwenden oder durch Ihren eigenen Code ersetzen können.


Tipps

Wenn man das Addin nur für bestimmte Mappen benötigt, kann man es immer über den COM-Addin-Manager aktivieren, bzw. deaktivieren. Ist natürlich nicht die bequemste Art. Man kann das Addin aber auch dynamisch zuschalten, und auch wieder abschalten. Dies kann man z.B. mit folgendem Code realisieren ...

' Aktiviert EventServer Public Sub ES_Activate() Application.COMAddIns("xlMouseTrack.dsr_xlMouseTrack").Connect = True End Sub
' Deaktiviert EventServer Public Sub ES_Deactivate() Application.COMAddIns("xlMouseTrack.dsr_xlMouseTrack").Connect = False End Sub


Wenn sie eigene tolle Effekte für Arbeitsmappen, auf Basis dieses Addins, erstellt haben, können Sie die Codes hier auf dieser Seite anderen Anwendern zur Verfügung stellen.

Hier der Code (Grundgerüst) für das Modul ...

Option Explicit
Public Enum xl_Button xl_B_LBUTTON = 1& xl_B_MBUTTON = 2& xl_B_RBUTTON = 3& End Enum
Public Enum xl_KeyStates xl_KS_LBUTTON = 1& xl_KS_RBUTTON = 2& xl_KS_SHIFT = 4& xl_KS_CONTROL = 8& xl_KS_MBUTTON = &H10& End Enum
Private BlockOnMove As Boolean Public EnableWheelEvent As Boolean
Private Const DELTA_MOUSEWHEEL = 3& Private Const DELTA_ZOOM = 5&
' (De)Aktiviert das OnMouseWheel-Event ... Public Function GetWheelState() As Boolean GetWheelState = EnableWheelEvent End Function
' Das OnButtonDown-Event ... ' Das Ereignis tritt ein, wenn ein Klick (mit der Maustaste) erfolgt. Public Sub OnButtonDown(Button As xl_Button, KeyState As Long, x As Long, y As Long)
On Error Resume Next
' Das Cell-Kontextmenü wird wie gewohnt angezeigt. Es wird jedoch verhindert, ' daß sich die selektierte Zelle ändert. If Button = xl_B_RBUTTON Then BlockOnMove = True ElseIf Button = xl_B_LBUTTON Then BlockOnMove = False End If
' Ab hier eigene Aktionen ausführen.
End Sub
' Das OnDblKlick-Event ... ' Das Ereignis tritt ein, wenn ein Doppelklick (Maustaste) erfolgt. Public Sub OnDblKlick(Button As xl_Button, KeyState As Long, x As Long, y As Long)
' Ab hier eigene Aktionen ausführen.
End Sub
' Das OnMove-Event ' Dieses Ereignis wird ausgelöst, wenn der Cursor über die Tabelle wandert. Public Sub OnMove(Target As Excel.Range, x As Long, y As Long)
On Error Resume Next
' Hier einige Beispiele ...
' (1) Eine Zelle wird selektiert, sobald sich der Mauszeiger darüber befindet. 'If Not BlockOnMove And Selection.Count = 1 Then _ Target.Select

' (2) Eine Zelle wird farbig markiert, sobald sich der Mauszeiger darüber befindet. If Not BlockOnMove And Selection.Count = 1 Then Static oldRange As Excel.Range oldRange.Interior.ColorIndex = oldRange.Interior.ColorIndex Xor 4 If Target.Interior.ColorIndex < 0 Then Target.Interior.ColorIndex = 4 Else Target.Interior.ColorIndex = Target.Interior.ColorIndex Xor 4 End If Set oldRange = Target End If

' Noch mehr Beispiele ...
' (3) Hier wird eine MsgBox angezeigt, wenn der Cursor über Zelle "A4" steht. 'If Target.Address = "$A$4" Then MsgBox "Cursor über $A$4"

' (4) Hier wird getestet, ob sich der Cursor in Reihe 4 befindet. 'If Not Application.Intersect(Target, Worksheets("Tabelle1").Rows(4)) Is Nothing Then _ MsgBox "Cursor ist in Reihe 4."

' (5) Hier wird temporär der Zelleninhalt geändert. 'Static oldString As String 'Static oldRange As Excel.Range
'If Not oldRange Is Nothing Then 'oldRange.Value = oldString 'End If
'oldString = Target 'Set oldRange = Target
'Target = "Hallo Welt ..."

' (6) Vielleicht etwas Musik? Oder ein Geräusch um Sehbehnderte zu unterstützen ... 'Call sndPlaySound32("c:\windows\media\Utopia Schließen.WAV", 1)

' Sie können hier eigentlich alles mögliche machen ;-) ' ' - Temporäre Manipulation der Zellinhalte ' - Eine MessageBox einblenden ' - Starten eines Makros ' - Ausführen einer DLL-Funktion ' - Eine EXE starten ' - Anzeigen einer UserForm ' - Anzeigen von externen Datenmasken, z,B. aus einer DLL ' - Einblenden von eigenen Kommentaren ' - u.s.w. End Sub
' Das OnApplicationRestore-Event ... ' Tritt beim Wiederherstellen (aus der Taskleiste) der Excel-Anwendung ein. Public Sub OnApplicationRestore()
' Ab hier eigene Aktionen ausführen.
End Sub
' Das OnApplicationMinimize-Event ... ' Tritt beim Minimieren der Excel-Anwendung ein. Public Sub OnApplicationMinimize()
' Ab hier eigene Aktionen ausführen.
End Sub
' Das OnApplicationMaximize-Event ... ' Tritt beim Maximieren der Excel-Anwendung ein. Public Sub OnApplicationMaximize()
' Ab hier eigene Aktionen ausführen.
End Sub
' Das OnWorkbookMinimize-Event ... ' Tritt beim Minimieren des aktiven Workbooks ein. Public Sub OnWorkbookMinimize()
' Ab hier eigene Aktionen ausführen.
End Sub
' Das OnWorkbookMaximize-Event ... ' Tritt beim Maximieren des aktiven Workbooks ein. Public Sub OnWorkbookMaximize()
' Ab hier eigene Aktionen ausführen.
End Sub
' Das OnMouseWheel-Event ... ' Tritt beim Drehen des Mausrades ein. Public Sub OnMouseWheel(KeyState As xl_KeyStates, WHEEL_DELTA As Long, x As Long, y As Long)
On Error Resume Next
' Ab hier eigene Aktionen ausführen.
' (7) WIe wär's mit stufenlosem Zoom? 'If WHEEL_DELTA < 0 Then 'Application.ActiveWindow.Zoom = Application.ActiveWindow.Zoom - DELTA_ZOOM 'Else 'Application.ActiveWindow.Zoom = Application.ActiveWindow.Zoom + DELTA_ZOOM 'End If

' (8) Einer Zelle ein Array zuordnen und darin scrollen ... 'Dim a: a = Array("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag") 'Static i&
'If WHEEL_DELTA < 0 Then 'If i > UBound(a) - 1 Then i = -1 'i = i + 1 'Application.ActiveCell.Value = a(i) 'Else 'If i = 0 Then i = 7 'i = i - 1 'Application.ActiveCell.Value = a(i) 'End If


' (9) Das Anwendungsfenster zoomen? 'If WHEEL_DELTA < 0 Then 'Application.Width = Application.Width - DELTA_ZOOM 'Else 'Application.Width = Application.Width + DELTA_ZOOM 'End If

' (10) WIe wär's mit Blättern? Static i&
If WHEEL_DELTA > 0 Then i = i + 1 If i > Application.Sheets.Count Then i = 1 Application.Sheets(i).Select Else i = i - 1 If i < 1 Then i = Application.Sheets.Count Application.Sheets(i).Select End If
' ALLES GEHT !!!!! End Sub