Excel - Add-Ins mit Symbolleiste  
Autor/Einsender:
Datum:
  Angie
03/2006
Anregungen/Tipps an:   Angie
Add-Ins sind Programme, mit dessen Hilfe die Funktionalität von Excel erweitert und/oder individuell angepasst werden kann. Ab Excel 2000 stehen mehrere Typen von Add-In-Programmen zur Verfügung, Excel-Add-Ins (*.xla) und zusätzlich noch benutzerdefinierte Component Object Model (COM)-Add-Ins.
Add-Ins sind m. E. die beste Möglichkeit Makros weiterzugeben, da hier unter anderem ein Update der Programmierung ohne größere "Klimmzüge" wie beispielsweise das Ersetzen von Modulen, Prozeduren usw. per VBE, möglich ist. Ein weiterer Vorteil ist auch, dass nicht ein und die selbe Programmierung in beliebig viele Arbeitsmappen verteilt wird.
Bei einem Excel-Add-In (*.xla) handelt es sich um eine Arbeitsmappe, die als Microsoft Excel-Add-In gespeichert wurde und ist Thema dieses Tutorials.
Es wird hier davon ausgegangen, dass gute Excel-Kenntnisse und zumindest Grundkenntnisse in VBA vorhanden sind.
1.    Add-Ins erstellen
2.    Verteilung/Installation eines Add-Ins
3.    Add-In mit Symbolleiste
3.1  Symbolleiste erstellen
3.2  Symbolleisteneinstellungen speichern
3.3  Schaltflächen aktivieren/deaktivieren
3.4  Anbinden des Add-Ins an Excel
4.    Add-In nur für gewisse Arbeitsmappen
4.1  Schaltflächen aktivieren/deaktivieren
4.2  Anbinden des Add-Ins an Excel
5.    Schlusswort
6.    Links zum Thema
7.    Download der Add-Ins
Bei Fragen zu diesem Tutorial nutzen Sie bitte unser VB-/VBA-Forum.

  Add-Ins erstellen
Ausgangspunkt für ein Excel-Add-In ist eine ganz normale Arbeitsmappe, in der der Quellcode in den Modulen und Klassenmodulen des VBA-Projekts unterbracht wird. Als Add-In wird die Arbeitsmappe über den Dialog Speichern unter… im Menü Datei als Microsoft Excel-Add-In (*.xla) gespeichert. Beim Aufruf des Dialogs Speichern unter… wird der Standardordner für Add-Ins als Speicherort vorgeschlagen, es ist jedoch nicht zwingend erforderlich, das Add-In im Standardordner zu speichern.
Nach dem Speichern wird die aktuelle Arbeitsmappe als Add-In gespeichert und sofort wieder ausgeblendet, das heißt, die "normale" Arbeitsmappe bleibt in Excel sichtbar. Um den Code im Add-In bearbeiten zu können, muss das Add-In entweder geöffnet oder zur Auflistung der Add-Ins hinzugefügt werden.
Bei einem Add-In handelt es sich nicht um eine ausgeblendete Arbeitsmappe im üblichen Sinne, ein Add-In kann also nicht wie die "persönliche Arbeitsmappe" (Personl.xls) über das Menü Fenster/Einblenden... angezeigt werden.
Weitere Informationen können dem Kurztipp Add-Ins erstellen, laden und entfernen entnommen werden.

  Verteilung/Installation eines Add-Ins [ Top ]
Es gibt die verschiedensten Möglichkeiten ein Add-In zu verteilen und zu installieren. Die hier folgenden Beispiele sollen nur ein paar der Methoden aufzeigen. Welche Methode sinnvoll ist, hängt von den verschiedensten Faktoren ab. Muss beispielsweise für ein Add-In ein Steuerelement registriert werden, sollte das Add-In "ordentlich" installiert werden und zur Auflistung der Add-Ins (Add-Ins-Manager) hinzugefügt werden.
Add-Ins-Manager
Ein Add-In kann in Excel zur Auflistung der Add-Ins, entweder manuell oder über eine Installationsroutine, hinzugefügt werden.
Manuell wird ein Add-In zur Auflistung der Add-Ins über das Menü Extras/Add-Ins-Manager… hinzugefügt. Falls das gewünschte Add-In nicht im Feld Verfügbare Add-Ins aufgeführt ist, kann nach dem Add-In über den Button Durchsuchen… gesucht werden. Damit das Add-In in Excel geladen wird, muss das Kontrollkästchen neben dem zu ladenden Add-In aktiviert werden.
Wird ein Add-In an unerfahrene Anwender weitergegeben, ist es sinnvoll, das Hinzufügen des Add-Ins zur Liste der verfügbaren Add-Ins per Code vorzunehmen. Die dafür benötigten Methoden und Eigenschaften des AddIn-Objekts sind in der Excel-VB(A)-Hilfe ausführlich beschrieben.
Add-In öffnen
Ein Add-In kann, wie jede andere Arbeitsmappe auch, manuell über das Menü Datei/Öffnen… oder per Doppelklick im Explorer geöffnet werden. Das Add-In wird damit nicht zur Auflistung der Add-Ins (Add-In-Manager) hinzugefügt. Diese Vorgehensweise ist dann sinnvoll, wenn keine Installation notwendig ist und das Add-In nur sporadisch verwendet wird.
Soll das Add-In nicht zur Auflistung der Add-Ins hinzugefügt werden, jedoch beim Starten von Excel automatisch geöffnet werden, kann das Add-In oder eine Verknüpfung zum Add-In im Ordner XLStart abgelegt werden. Die möglichen Pfade des XLStart-Ordners können der Excel-Hilfe entnommen werden.
Anmerkung: Je nachdem, wo der Anwender das Add-In gespeichert/ablegt hat und welche Makrosicherheitseinstellung gewählt ist, wird ggf. der Dialog mit der Aufforderung die Makros zu aktivieren oder zu deaktivieren, angezeigt.
Verweis einbinden
In einer oder mehreren Arbeitsmappen kann zur Entwurfszeit ein Verweis auf ein Add-In eingebunden werden. Damit die Beziehung zwischen den Arbeitsmappen beibehalten wird, müssen entweder die relativen Pfade zwischen den beiden Arbeitsmappen (Add-In und "normale" Arbeitsmappe) beibehalten werden, das Add-In vor der Arbeitsmappe geöffnet werden oder das Add-In im Standardordner für Add-Ins abgelegt sein.
Das Einbinden eines Verweises hat zwar den Vorteil, dass das Add-In beim Öffnen der Arbeitsmappe automatisch geladen wird, auch wenn das Add-In nicht im Standardordner für Add-Ins abgelegt ist, es hat aber wiederum den Nachteil, dass das Add-In weder umbenannt noch verschoben werden darf.
Anmerkung: Je nachdem, wo der Anwender das Add-In gespeichert/ablegt hat und welche Makrosicherheitseinstellung gewählt ist, wird ggf. der Dialog mit der Aufforderung die Makros zu aktivieren oder zu deaktivieren, angezeigt.

  Add-In mit Symbolleiste [ Top ]
Soll ein Add-In die Funktionalität von Excel ergänzen und mit allen Arbeitsmappen verwendet werden können, wie in diesem Beispiel-Add-In, sollten möglichst keine Änderungen in den Benutzereinstellungen und an der Excel-Oberfläche gemacht werden, damit der Anwender wie gewohnt mit Excel arbeiten kann. Wenn Änderungen in den Einstellungen des Anwenders vorgenommen werden müssen, so sollte man dies dem Anwender auch mitteilen.
In diesem Add-In wird per Code eine benutzerdefinierte Symbolleiste erstellt, die mit allen Arbeitsmappen verwendet werden kann.
Im Add-In ist der notwendige Code enthalten, um
eine Symbolleiste zu erstellen und die Eigenschaften wie Position und Breite aus der Registry auszulesen.
das Aktivieren/Deaktivieren der Schaltflächen auf der Symbolleiste, je nachdem, ob in Excel eine Arbeitsmappe geöffnet und ein Fenster sichtbar ist oder nicht, zu steuern.
die vom Anwender geänderten Eigenschaften der Symbolleiste in der Registry zu speichern.
den in der Registry erstellten Abschnitt wieder zu löschen.

  Symbolleiste erstellen [ Top ]
Um das Aktivieren/Deaktivieren der Schaltflächen aufzeigen zu können, je nachdem, ob eine Arbeitsmappe mit eingeblendetem Fenster geöffnet ist, werden sowohl die in Excel integrierten Schaltflächen Datei Neu, Öffnen und Speichern als auch drei benutzerdefinierte Schaltflächen zur neuen Symbolleiste hinzugefügt.
Für die in Excel integrierten Schaltflächen Datei Neu, Öffnen und Speichern wird kein Code für das Aktivieren/Deaktivieren benötigt, das wird von Excel automatisch gesteuert. Anders sieht es jedoch aus, wenn die benutzerdefinierten Schaltflächen aktiviert/deaktiviert werden sollen, je nachdem, ob in Excel eine Arbeitsmappe geöffnet und ein Fenster sichtbar ist oder nicht.
In diesem Beispiel wird der Tag-Eigenschaft der beiden benutzerdefinierten Schaltflächen, die deaktiviert werden sollen, wenn in Excel keine Arbeitsmappe mit eingeblendetem Fenster geöffnet ist, eine "Kennung" zugewiesen. Die dritte benutzerdefinierte Schaltfläche kann immer aktiv bleiben, da bei Klick die VB-fun.de-Startseite angezeigt wird und somit keine Arbeitsmappen-spezifische Aktion ausgelöst wird.
Schaltflächen auf Symbolleisten können mit einer Beschriftung belegt werden und/oder mit Symbolen. Der dritten benutzerdefinierten Schaltfläche wird ein eigenes Symbol zugewiesen. Das Symbol wurde zur Entwurfszeit in einem Tabellenblatt im Add-In als Grafik eingefügt und mit einem Namen versehen (siehe dazu auch unseren Tipp Symbolleiste - eigene Grafiken integrieren -2-). Die in einem Add-In enthaltenen Tabellenblätter sind zwar für den Anwender nicht sichtbar, ein Zugriff darauf ist jedoch per Code trotzdem möglich, allerdings ohne Verwendung der Methoden Select und Activate!
 
Public Sub CreateCommandBar()
  Dim objCBar     As Office.CommandBar
  Dim strOnAction As String

  DeleteCommandBar

  On Error GoTo err_CreateCommandBar

  Set objCBar = ThisWorkbook.Application.CommandBars.Add( _
          Name:=gcCBAR_NAME, Temporary:=True)

  strOnAction = "'" & ThisWorkbook.Name & "'!modOnAction."

  With objCBar
    .Controls.Add ID:=2520
    .Controls.Add ID:=23
    .Controls.Add ID:=3

    With .Controls.Add(Type:=msoControlButton)
      .BeginGroup = True
      .Style = msoButtonCaption
      .Caption = "Demo Button 1"
      .Tag = gcCBARBTN_TAG
      .OnAction = strOnAction & "OnAction_DemoAddIn_11"
    End With

    With .Controls.Add(Type:=msoControlButton)
      .Style = msoButtonCaption
      .Caption = "Demo Button 2"
      .Tag = gcCBARBTN_TAG
      .OnAction = strOnAction & "OnAction_DemoAddIn_12"
    End With

    With .Controls.Add(Type:=msoControlButton)
      .BeginGroup = True
      .Style = msoButtonIcon
      .FaceId = 3021
      .Parameter = "http://www.vb-fun.de"
      .TooltipText = "VB-fun-Startseite"
      .OnAction = strOnAction & "OnAction_GoToVBfun_13"

      On Error Resume Next
      TCBarPics.Shapes("picVBFun").CopyPicture
      If Err.Number = 0 Then
        .PasteFace
      End If
      On Error GoTo 0
    End With

    .Position = msoBarTop
    .Visible = True
    .Protection = msoBarNoCustomize
  End With

exit_Sub:
  On Error Resume Next
  Set objCBar = Nothing
  On Error GoTo 0
  Exit Sub

err_CreateCommandBar:
  MsgBox "Es ist ein Fehler bei der Erstellung der neuen " & _
          vbCrLf & "Symbolleiste aufgetreten !", vbCritical, _
          gcAPP_NAME & " - Fehler"
  DeleteCommandBar
  Resume exit_Sub
End Sub
 
Anmerkungen zur OnAction-Eigenschaft
Mit der OnAction-Eigenschaft wird der Name des Makros festgelegt, das ausgeführt wird, wenn der Anwender auf eine Schaltfläche auf einer Symbolleiste klickt.
Auch wenn die auszuführende Prozedur mit der OnAction-Eigenschaft vollständig mit Datei-, Modul- und Prozedurnamen zugewiesen wird, wird unter Umständen eine "falsche" Prozedur ausgeführt.
Eine "falsche" Prozedur wird dann aufgerufen, wenn bereits ein anderes Add-In (*.xla) geladen oder eine "normale" Arbeitsmappe (*.xls) geöffnet ist, in der sich zufällig sowohl ein Modul als auch eine Prozedur mit den selben Namen befinden.
Bei Add-Ins mit selben Modul- und Prozedurnamen wird immer die Prozedur von dem Add-In ausgeführt, das als Erstes in Excel geladen wurde.
Befindet sich in einer "normalen" Arbeitsmappe ein Modul und in diesem eine Prozedur mit dem selben Namen, so wird immer (!) die Prozedur ausgeführt, die sich in der "normalen" Arbeitsmappe befindet.
Das kann leicht mit diesem Beispiel-Add-In nachvollzogen werden. Zunächst wird das Add-In in Excel geladen, und anschließend der folgende Code in ein Modul (Name modOnAction) in einer "normalen" Arbeitsmappe (diese muss noch nicht mal gespeichert werden) kopiert. Bei Klick auf die Schaltfläche auf der Symbolleiste wird die Prozedur ausgeführt, die sich in der "normalen" Arbeitsmappe befindet.
 
Option Explicit
Option Private Module

Private Sub OnAction_DemoAddIn_11()
  MsgBox ThisWorkbook.Name
End Sub
 
Löscht oder deaktiviert man den Code in der "normalen" Arbeitsmappe, wird, obwohl das Add-In nach wie vor geladen ist, bei Klick auf die Schaltfläche die Fehlermeldung
Microsoft Excel kann das Makro 'modOnAction.OnAction_DemoAddIn_11' nicht finden.
ausgegeben. Die eigentlich ursprünglich zugewiesene Prozedur im Add-In wird erst dann wieder automatisch (!) ausgeführt, wenn die "normale" Arbeitsmappe geschlossen wird. Es nützt leider nichts, das OnAction-Makro als privat zu deklarieren, auch nicht mit Hilfe der Option Private Module-Anweisung.
Es gibt noch mehr Varianten zum Thema, welche OnAction-Prozedur wann ausgeführt wird, auf diese wird hier jedoch nicht näher eingegangen.
Die einfachste Lösung, die mir bekannt ist, damit es in diesem Zusammenhang keine Konflikte gibt, ist einen Prozedurnamen zu wählen, der hoffentlich (!) einmalig ist.
Ereignisse des CommandBar-Objekts vs. OnAction-Eigenschaft
Ab Office 2000 stehen Ereignisse für Symbolleisten und -Steuerelemente zur Verfügung. Wie die Ereignisse des Application-Objekts müssen auch die Ereignisse des CommandBar-Objekts zuerst eingerichtet werden, bevor sie genutzt werden können.
Besondere Vorteile bzgl. der Verwendung der Ereignisse des CommandBar-Objekts sind m. E. nicht gegeben. Im Gegensatz zu den OnAction-Makros sind beispielsweise nur für zwei Steuerelemente Ereignisse möglich, für die "normale" Schaltfläche (msoControlButton) und für Kombinationsfelder (msoControlComboBox), die zahlreichen weiteren Steuerelemente werden nicht unterstützt. Ein Vorteil ist, dass bei den beiden genannten Steuerelementen auf das Standardverhalten Einfluss genommen werden kann. Eine großer Nachteil ist, dass eine Programmierung, in der die Ereignisse des CommandBar-Objekts verwendet werden, nicht Excel 97- (bzw. Office 97-) kompatibel ist.
Die Ereignisse des CommandBar-Objekts werden üblicherweise in Com-Add-Ins und ggf. bei der Automatisierung von Excel (bzw. Office) von VB aus.

  Symbolleisteneinstellungen speichern [ Top ]
Wenn in einem Add-In Symbolleisten zur Verfügung gestellt werden, ist es für den Anwender angenehm, wenn er diese beim Neustart von Excel dort wieder findet, wo er sie in der letzten Excel-Sitzung abgelegt hat.
Die benötigten Informationen könnten in einer so genannten Initialisierungsdatei (*.ini) gespeichert werden. Problematisch ist in dem Fall, zu bestimmen, wo solche Dateien am sinnvollsten abgelegt werden sollten. In vielen Unternehmen werden die Schreibrechte der Anwender sehr eingegrenzt, im Ordner Anwendungsdaten des aktuellen Benutzers dürfte es die wenigsten Probleme geben.
Eine andere Möglichkeit ist, wie in diesem Beispiel, die Einstellungen in der Windows-Registrierung (Registry) unter
HKEY_CURRENT_USER\Software\VB and VBA Program Settings\
zu speichern.
Für den Zugriff auf die Registry können entweder die entsprechenden API-Funktionen verwendet werden, oder aber auch die in VBA integrierten Methoden GetSetting, SaveSetting und DeleteSetting. Der Syntax und die ausführliche Beschreibung zu den genannten Methoden kann der Excel-VB(A)-Hilfe entnommen werden.
GetSetting-Funktion
Mit der Funktion GetSetting werden ggf. bereits gespeicherte Einstellungen wie Position und Breite der Symbolleiste aus der Registry ausgelesen. Wird das Add-In zum ersten Mal geladen, werden die angegebenen Default-Werte verwendet, da noch keine Werte in der Registry gespeichert sind.
Um die Einstellungen ggf. aus der Registry auslesen zu können, wird der Code in der Prozedur zum Erstellen der Symbolleiste entsprechend geändert.
 
  With objCBar
    .Width = CInt(GetSetting( _
           gcREG_APP, gcREG_TOOLBAR, "Width", .Width))
    .Position = CLng(GetSetting( _
           gcREG_APP, gcREG_TOOLBAR, "Position", msoBarTop))
    .Top = CLng(GetSetting(gcREG_APP, gcREG_TOOLBAR, "Top", .Top))
    .Left = CLng(GetSetting( _
           gcREG_APP, gcREG_TOOLBAR, "Left", .Left))
    .RowIndex = CLng(GetSetting( _
           gcREG_APP, gcREG_TOOLBAR, "RowIndex", .RowIndex))

    .Visible = CBool(GetSetting( _
           gcREG_APP, gcREG_TOOLBAR, "Visible", -1))
    .Protection = msoBarNoCustomize
  End With
 
SaveSetting-Anweisung
Die SaveSetting-Anweisung speichert oder erstellt einen Eintrag einer Anwendung in der Registry.
Mit der folgenden Prozedur werden die ggf. vom Anwender geänderten Eigenschaften der Symbolleiste, wie Position und Breite, in der Registry gespeichert.
 
Private Sub AddIn_SaveSettings()
  Dim objCBar     As Office.CommandBar
  Dim lngPosition As Long
  Dim blnVisible  As Boolean

  On Error Resume Next
  Set objCBar = ThisWorkbook.Application.CommandBars(gcCBAR_NAME)
  If Not objCBar Is Nothing Then
    With objCBar
      lngPosition = .Position
      blnVisible = .Visible

      SaveSetting gcREG_APP, gcREG_TOOLBAR, "Visible", _
            CLng(.Visible)
      SaveSetting gcREG_APP, gcREG_TOOLBAR, "Position", .Position
      SaveSetting gcREG_APP, gcREG_TOOLBAR, "Top", .Top
      SaveSetting gcREG_APP, gcREG_TOOLBAR, "Left", .Left
      SaveSetting gcREG_APP, gcREG_TOOLBAR, "RowIndex", .RowIndex

      .Visible = False
      .Position = msoBarFloating
      SaveSetting gcREG_APP, gcREG_TOOLBAR, "Width", .Width

      .Position = lngPosition
      .Visible = blnVisible
    End With
    Set objCBar = Nothing
  End If
  On Error GoTo 0
End Sub
 
DeleteSetting-Anweisung
Mit der DeleteSetting-Anweisung wird ein Abschnitt oder eine Schlüsseleinstellung aus einem Eintrag einer Anwendung in der Registry gelöscht.
In diesem Add-In werden die Regsitry-Einträge ggf. komplett gelöscht, wenn das Add-In deinstalliert wird, also aus der Auflistung der Add-Ins entfernt wird.
 
Public Sub AddIn_DeleteRegSettings()
  On Error Resume Next
  DeleteSetting gcREG_APP
  On Error GoTo 0
End Sub
 

  Schaltflächen aktivieren/deaktivieren [ Top ]
Unter "normalen" Bedingungen können bei Fensterwechsel die Schaltflächen entsprechend aktiviert bzw. deaktiviert werden, je nachdem, ob eine Arbeitsmappe geöffnet und ein Fenster sichtbar ist oder nicht. Unter welchen Bedingung beispielsweise die Funktionalität nicht gegeben ist, kann unter Fenster in Taskleiste (ab Excel 2000) nachgelesen werden.
Anzahl eingeblendeter Fenster ermitteln
Wenn für eine Aktion einer benutzerdefinierten Schaltfläche eine Arbeitsmappe mit eingeblendetem Fenster benötigt wird, ist das Ermitteln der Anzahl der geöffneten Arbeitsmappen nicht ausreichend. Arbeitsmappen können über ein oder mehrere Fenster verfügen, die teilweise oder auch alle ausgeblendet sein können. Es ist also in dem Fall sinnvoll, eingeblendete/sichtbare Fenster als Kriterium für das Aktivieren von Schaltflächen zu verwenden. Die folgende Funktion gibt die Anzahl der in Excel eingeblendeter Fenster zurück.
 
Public Function GetVisibleWkbWindows() As Long
  Dim objWnd   As Window
  Dim nWndsCnt As Long

  For Each objWnd In Application.Windows
    If objWnd.Visible = True Then
      nWndsCnt = nWndsCnt + 1
    End If
  Next
  GetVisibleWkbWindows = nWndsCnt
End Function
 
Die Funktion zum Ermitteln der Anzahl der eingeblendeten Fenster sollte vorsichtshalber auch in den OnAction-Prozeduren der entsprechenden Schaltflächen enthalten sein, da die Ereignisse WindowDeactivate und WindowActivate des Application-Objekts nicht unbedingt immer "ordnungsgemäß" ausgeführt werden. Siehe dazu beispielsweise die Ausführungen unter Fenster in Taskleiste (ab Excel 2000).
 
Sub OnAction_Demo()
  If GetVisibleWkbWindows > 0 Then
    '...
  End If
End Sub
 
Ereignisse des Application-Objekts
Mit den Ereignissen WindowDeactivate und WindowActivate des Application-Objekts kann der Einsatz der benutzerdefinierten Schaltflächen auch beschränkt werden.
Um auf die Ereignisse Application-Objekts reagieren zu können, wird in diesem Beispiel ein neues Klassenmodul erstellt und mit dem Schlüsselwort WithEvents ein Objekt vom Typ Application deklariert.
 
Private WithEvents meXLAppl As Excel.Application
 
Im Initialize-Ereignis des Klassenmoduls, das automatisch ausgeführt wird, wenn das Objekt geladen wird, wird der Objektverweis auf die Excel-Anwendung gesetzt.
 
Private Sub Class_Initialize()
  Set meXLAppl = Excel.Application
End Sub
 
Um die Schaltflächen auf der benutzerdefinierte Symbolleiste aktivieren/deaktivieren zu können, je nachdem, ob eine Arbeitsmappe geöffnet und ein Fenster eingeblendet ist oder nicht, wird eine kleine Prozedur benötigt, die unter anderem in den beiden Ereignissen WindowActivate und WindowDeactivate aufgerufen wird.
In der Prozedur werden nur die Schaltflächen aktiviert/deaktiviert, denen bei der Erstellung der Symbolleiste die entsprechende Tag-Eigenschaft zugewiesen wurde.
 
Private Sub ToggleCBarButtons(ByVal fEnable As Boolean)
  Dim objCBar   As Office.CommandBar
  Dim i         As Integer

  On Error Resume Next
  Set objCBar = ThisWorkbook.Application.CommandBars(gcCBAR_NAME)
  If Not objCBar Is Nothing Then 

    For i = 1 To objCBar.Controls.Count
      If InStr(1, objCBar.Controls(i).Tag, gcCBARBTN_TAG) > 0 Then
        objCBar.Controls(i).Enabled = fEnable
      End If
    Next

    Set objCBar = Nothing
  End If

  On Error GoTo 0
End Sub
 
Im WindowActivate-Ereignis, das eintritt, wenn ein Arbeitsmappenfenster aktiviert wird, werden die benutzerdefinierten Schaltflächen aktiviert.
 
Private Sub meXLAppl_WindowActivate(ByVal Wb As Workbook, _
      ByVal Wn As Window)
  ToggleCBarButtons True
End Sub
 
Im WindowDeactivate-Ereignis, das eintritt, wenn ein Arbeitsmappenfenster deaktiviert wird, werden die benutzerdefinierten Schaltflächen immer deaktiviert.
 
Private Sub meXLAppl_WindowDeactivate(ByVal Wb As Workbook, _
      ByVal Wn As Window)
  ToggleCBarButtons False
End Sub
 
Da direkt nach dem Laden/Öffnen eines Add-Ins nicht unbedingt ein Fensterwechsel stattfindet, muss das Initialize-Ereignis noch mit dem Aufruf der Prozedur zum Aktivieren/Deaktivieren der benutzerdefinierten Schaltflächen ergänzt werden.
 
Private Sub Class_Initialize()
  Set meXLAppl = Excel.Application
  ToggleCBarButtons CBool(GetVisibleWkbWindows > 0)
End Sub
 
Will man auf Nummer sicher gehen, dass das Add-In zumindest anfangs "ordnungsgemäß" funktioniert (man weiß ja nie), kann man im Initialize-Ereignis auch die entsprechenden Eigenschaften des Application-Objekts vorsichtshalber zurücksetzen.
 
  With Application
    .ScreenUpdating = True
    .DisplayAlerts = True
    .EnableEvents = True
    .EnableCancelKey = xlInterrupt
    .Cursor = xlDefault
  End With
 
Fenster in Taskleiste (ab Excel 2000)
Ab Excel 2000 kann für jede geöffnete Arbeitsmappe eine eigene Schaltfläche auf der Windows-Taskleiste angezeigt werden. Mit der Einstellung Fenster in Taskleiste wird das Aussehen einer Oberfläche für eine einzelne Arbeitsmappe simuliert, wodurch die Navigation zwischen geöffneten Arbeitsmappen erleichtert wird. Es ist damit auch möglich, mit der Tastenkombination Alt+TAB zwischen den Arbeitsmappenfenstern hin- und herzuwechseln.
Diese Neuerung ab Excel 2000 bringt jedoch leider auch "Probleme" mit sich. Ist beispielsweise in einer Arbeitsmappe ein eingebettetes Diagramm selektiert, wird unter Umständen weder das WindowDeactivate- noch das WorkbookDeactivate-Ereignis des Application-Objekts, das auch verwendet werden könnte, ausgelöst, wenn die Arbeitsmappe über die Taskleiste deaktiviert wird. Auch das Activate-Ereignis der Arbeitsmappe die aktiviert wird, wird nicht ausgelöst. Sind mehrere eingebetteten Diagramme ausgewählt, wird das Deactivate-Ereignis wiederum ausgelöst.
Theoretisch wäre es zwar möglich, die in den Arbeitsmappen vorhandenen eingebetteten Diagramm-Objekte zu ermitteln und dann auf das Deactivate-Ereignis der Chart-Objekte zu reagieren. Den Programmieraufwand kann man sich m. E. jedoch sparen, da ohne einem Timer nicht festgestellt werden kann, ob der Anwender eventuell ein neues eingebettetes Diagramm erstellt hat.
Abgesehen von der hier geschilderten Problematik mit eingebetteten Diagrammen scheint es so zu sein, dass die erwähnten Ereignisse überhaupt in Excel 2000 erst ab Service Pack 3 ausgelöst werden, siehe dazu den Artikel XL2000: ALT+TAB Does Not Trigger Workbook_WindowActivate Event.
Mit der OnWindow-Eigenschaft kann festgelegt werden kann, welche Prozedur ausgeführt werden soll, wenn ein Fenster aktiviert wird. Aber auch die OnWindow-Eigenschaft, die an sich funktionieren würde, schafft leider keine Abhilfe. Legt man beispielsweise in zwei Add-Ins unterschiedliche Prozeduren fest, so wird in Excel immer die Prozedur von dem Add-In ausgeführt, das als Letztes geladen wurde. Das heißt, es kann scheinbar nur eine OnWindow-Eigenschaft pro Excel-Instanz festgelegt werden.
Die wohl einfachste und m. E. auch vertretbare Lösung ist die Option Fenster in Taskleiste zu deaktivieren, wenn sie aktiviert ist. Das Wiederherstellen dieser Excel-Einstellung beim Schließen des Add-Ins ist jedoch nicht sinnvoll, da es durchaus sein könnte, dass ein anderes Add-In geladen ist, in dem die Option auch deaktiviert wurde.
In diesem Beispiel wird dem Anwender ein Dialog mit dem Hinweis angezeigt, dass die Option Fenster in Taskleiste deaktiviert sein muss und ggf. auch deaktiviert wird, wenn der Dialog geschlossen wird. Im Dialog kann der Anwender wählen, ob der Dialog beim nächsten Start des Add-Ins wieder angezeigt werden soll oder nicht. Die Einstellung wird in der Registry gespeichert.
Sollte der Anwender auf die Idee kommen, die Option doch wieder zu aktivieren, so kann bei "guter" Programmierung eigentlich nichts schief gehen, siehe dazu die OnAction-Makros. Theoretisch könnte man auch ganz auf das Aktivieren/Deaktivieren der Steuerelemente auf der Symbolleiste verzichten.
 
Private Sub AddIn_GetSettings()
  #If VBA6 Then
    Dim blnShowDialog As Boolean

    blnShowDialog = CBool(GetSetting( _
          gcREG_APP, gcREG_STARTUP, "ShowDialog", -1))

    If blnShowDialog = True Then
      Dim strMsg    As String
      Dim frmDialog As FrmStartup

      strMsg = "Für dieses Add-In muss die Option " & _
               "'Fenster in Taskleiste' im " & _
               "Menü Extras / Optionen... / Ansicht " & _
               "deaktiviert werden." & vbCrLf & vbCrLf

      If Application.ShowWindowsInTaskbar = True Then
        strMsg = strMsg & "> Die Option wird bei OK deaktiviert! <"
      Else
        strMsg = strMsg & "> Die Option ist bereits deaktiviert! <"
      End If

      Set frmDialog = New FrmStartup
      With frmDialog
        .gInit = True
        .gMessage = strMsg
        .Show
        DoEvents
        SaveSetting gcREG_APP, gcREG_STARTUP, "ShowDialog", _
              CLng(.gShowDialog)
      End With
      Unload frmDialog
      Set frmDialog = Nothing
    End If
    Application.ShowWindowsInTaskbar = False
  #End If
End Sub
 
In Excel 97 wird der Dialog nie angezeigt, da die Option Fenster in Taskleiste nicht implementiert ist. Damit das Add-In Excel 97-kompatibel bleibt, wird bedingte Kompilierung verwendet, um den Code abhängig von der VBA-Version auszuführen.

  Anbinden des Add-Ins an Excel [ Top ]
Um beim Installieren, Deinstallieren, Öffnen und Schließen eines Add-Ins notwendige Einstellungen, wie z. B. das Erstellen der Symbolleiste, automatisch ausführen zu können, stehen verschiedene Ereignisse des Workbook-Objekts zur Verfügung.
Wird ein Add-In lediglich, wie jede andere Arbeitsmappe auch, manuell über das Menü Datei/Öffnen… oder per Doppelklick im Explorer geöffnet, werden die Open- und BeforeClose-Ereignisse des Workbook-Objekts ausgeführt. Beim Hinzufügen und Entfernen des Add-Ins aus der Auflistung der Add-Ins über den Add-In-Manager werden zusätzlich die AddinInstall- und AddinUninstall-Ereignisse ausgeführt.
AddinInstall-Ereignis
Das AddinInstall-Ereignis tritt ein, wenn die Arbeitsmappe als Add-In installiert wird, d. h., zur Auflistung der Add-Ins im Add-In-Manager hinzugefügt und installiert wird.
 
Private Sub Workbook_AddinInstall()
  '...
End Sub
 
Im AddinInstall-Ereignis, das vor dem Open-Ereignis ausgeführt wird, kann Code hinzugefügt werden, das beim Installieren des Add-Ins über den Dialog Add-Ins-Manager oder per VBA einmalig ausgeführt werden soll. Wird Excel nach der Installation des Add-Ins geschlossen und neu gestartet, wird das AddinInstall-Ereignis nicht mehr ausgeführt.
Für dieses Beispiel wird das AddinInstall-Ereignis nicht benötigt.
Open-Ereignis
Das Open-Ereignis tritt ein, wenn die Arbeitsmappe geöffnet wird.
 
Private Sub Workbook_Open()
  AddIn_Initialize
End Sub
 
Im Open-Ereignis, das bei jedem Öffnen des Add-Ins ausgeführt wird, wird die Prozedur aufgerufen, in der die Symbolleiste erstellt wird, ggf. bereits vorhandene Add-In-Einstellungen aus der Registry ausgelesen werden und der globalen Variable eine neue Instanz des Klassenobjekts mit den Ereignissen des Application-Objekts zugewiesen wird.
 
Public Sub AddIn_Initialize()
  CreateCommandBar
  AddIn_GetSettings
  If gCAppEvents Is Nothing Then
    Set gCAppEvents = New CAppEvents
  End If
End Sub
 
AddinUninstall-Ereignis
Das AddinUninstall-Ereignis tritt ein, wenn die Arbeitsmappe als Add-In über den Dialog Add-Ins-Manager deinstalliert wird. Das Ereignis wird also nicht automatisch beim Beenden von Excel ausgeführt.
 
Private Sub Workbook_AddinUninstall()
  m_blnAddInUninstall = True
  AddIn_Uninstall
End Sub
 
Beim Entladen des Add-Ins wird zunächst ein Flag gesetzt, damit im BeforeClose-Ereignis bekannt ist, dass das AddinUninstall-Ereignis ausgeführt wurde. Anschließend wird die Prozedur zum Deinstallieren des Add-Ins aufgerufen, die mit der Prozedur identisch ist, die im BeforeClose-Ereignis ausgeführt wird, jedoch mit dem Unterschied, dass die Symbolleiste und ggf. auch die Registry-Einträge gelöscht werden.
Wird ein Add-In im Add-Ins-Manager deaktiviert, kann man davon ausgehen, dass dies ganz bewusst vom Anwender so gewollt ist. Nachdem es aber durchaus sein kann, dass ein Anwender das Add-In im Add-Ins-Manager nur für die aktuelle Excel-Sitzung deaktivieren möchte, also lediglich den Haken des Kontrollkästchens entfernen, jedoch nicht das Add-In komplett deinstallieren will, wird vor dem Löschen der Registry-Einträge eine Abfrage eingefügt.
 
Public Sub AddIn_Uninstall()
  AddIn_Terminate

  If MsgBox("Sollen die Registry-Einträge für dieses " & _
        "Add-In gelöscht werden?", vbYesNo + vbQuestion, _
        gcAPP_NAME) = vbYes Then
    AddIn_DeleteRegSettings
  End If

  DeleteCommandBar
End Sub
 
BeforeClose-Ereignis
Das BeforeClose-Ereignis tritt ein, wenn die Arbeitsmappe geschlossen wird. Bei der Deinstallation eines Add-Ins über den Dialog Add-Ins-Manager, wird zuerst das AddinUninstall-Ereignis ausgeführt und anschließend das BeforeClose-Ereignis.
 
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  If Not m_blnAddInUninstall Then
    AddIn_Terminate
    If Application.Workbooks.Count > 0 Then
      Application.OnTime Now, "'" & ThisWorkbook.Name & _
            "'!AddIn_OnShutdown"
    End If
  End If
End Sub
 
Im BeforeClose-Ereignis wird, wenn das Add-In nicht vorher bereits über den Dialog Add-Ins-Manager deinstalliert wurde, die Prozedur aufgerufen, in der die Ereignisse des Application-Objekts terminiert und die Symbolleisteneinstellungen in der Registry gespeichert werden.
 
Public Sub AddIn_Terminate()
  Set gCAppEvents = Nothing
  AddIn_SaveSettings
End Sub
 
Ein explizites Löschen der Symbolleiste im BeforeClose-Ereignis (im Gegensatz zum AddinUninstall-Ereignis) ist in diesem Beispiel nicht notwendig. Wird eine benutzerdefinierte Symbolleiste mit dem Parameter Temporary:=True erstellt, wird sie automatisch gelöscht, wenn die Containeranwendung, hier Excel, geschlossen wird.
Anmerkung zur OnTime-Methode
Wird bei Aufruf der OnTime-Methode der Name der Arbeitsmappe, in der sich die auszuführende Prozedur befindet, nicht angegeben, so wird evtl. eine "falsche" Prozedur ausgeführt. Eine "falsche" Prozedur wird beispielsweise dann ausgeführt, wenn zwei Add-Ins (*.xla) im selben Ordner abgelegt sind, in beiden Add-Ins eine Prozedur mit dem selben Namen enthalten ist und beide Add-Ins in Excel geladen sind. In dem Fall wird die Prozedur ausgeführt, die sich in dem Add-In befindet, das als Erstes geladen wurde.
Schließen der Excel-Anwendung
Beim Schließen von Excel werden zunächst nacheinander die ggf. vorhandenen BeforeClose-Ereignisse geladener Add-Ins ausgeführt (die Add-Ins werden nicht sofort geschlossen, außer sie werden explizit über den Add-Ins-Manager deaktiviert) und erst anschließend werden ggf. die Aufforderungen bezüglich Speichern nicht gespeicherter Arbeitsmappen angezeigt. Bricht der Anwender den Schließvorgang von Excel ab, soll hier das noch in Excel geöffnete Add-In wieder initialisiert werden.
Im BeforeClose-Ereignis wird das Schließen von Excel mit Hilfe der OnTime-Methode "überwacht", aber nur wenn mindestens eine Arbeitsmappe noch in Excel geöffnet ist. Die in der OnTime-Methode angegebene Prozedur wird nicht ausgeführt, wenn Excel tatsächlich geschlossen wird. Dieser Umstand kann verwendet werden, um die Ereignisse des Application-Objekts wieder zu initialisieren, wenn der Schließvorgang von Excel vom Anwender abgebrochen wird, z. B. in dem er eine Speicherabfrage mit Abbrechen quittiert.
 
Public Sub AddIn_OnShutdown()
  If gCAppEvents Is Nothing Then
    Set gCAppEvents = New CAppEvents
  End If
End Sub
 
Nachdem die Symbolleiste in diesem Beispiel nicht gelöscht wird, reicht es hier aus, das Klassenobjekt mit den Ereignissen des Application-Objekts neu zu initialisieren.

  Add-In nur für gewisse Arbeitsmappen [ Top ]
Soll ein Add-In nur für gewisse Arbeitsmappen genutzt werden können, gibt es verschiedene Möglichkeiten das zu realisieren, entweder die Excel-Anwendung "komplett zu übernehmen", oder aber keine oder nur kleine Änderungen an der Excel-Oberfläche vorzunehmen, wie im ersten Beispiel-Add-In.
Als Grundlage für dieses zweite Beispiel dient das Add-In mit eigener Symbolleiste, das für alle Arbeitsmappen verwendet werden kann. Es sind lediglich ein paar Änderungen und Ergänzungen notwendig. Im Folgenden werden auch nur diese Änderungen und Ergänzung beschrieben.
Mit dem Add-In sollen nur bestimmte Arbeitsmappen bearbeitet werden, die vom Add-In erstellte Symbolleiste soll jedoch in Excel immer sichtbar sein, solange das Add-In geladen ist. Das heißt, auch in diesem Beispiel werden keinen größeren Änderungen an der Excel-Oberfläche vorgenommen, und der Anwender kann wie gewohnt in Excel arbeiten.
Als Basis für die Arbeitsmappen (*.xls), die mit dem Add-In bearbeitet werden sollen, wird eine so genannte Mustervorlage (*.xlt) verwendet. Damit die entsprechenden Arbeitsmappen vom Add-In erkannt werden und die Schaltflächen auf der Symbolleiste aktiviert werden können, wird eine "Kennung" benötigt. Dafür wurde in der Vorlage in den benutzerdefinierten Dokumenteigenschaften der Name des Add-Ins (dieser muss nicht identisch mit dem (Datei-)Namen des Add-Ins sein) und die Version gespeichert. Im Add-In selbst sind die Angaben als globale Konstanten deklariert. Wird eine neue Arbeitsmappe (*.xls) auf Basis der Vorlage (*.xlt) erstellt, werden die Dokumenteigenschaften automatisch übernommen.
Damit das Add-In automatisch geladen wird, wenn eine zu bearbeitende Arbeitsmappe geöffnet wird, könnte man in den Arbeitsmappen selbst einen Verweis zum Add-In einbinden, oder aber auch im Open-Ereignis prüfen, ob das Add-In in der Auflistung der Add-Ins enthalten ist.
Ein Nachteil beider genannter Methoden ist, dass das Add-In immer mit der Arbeitsmappe weitergegeben werden muss. In der Praxis gibt es jedoch durchaus die Konstellation, dass eine Arbeitsmappe von einer Stelle bearbeitet und dann komplett ohne Programmierung weitergegeben wird. Immer wieder werden im Forum Fragen gestellt, wie man beispielsweise zur Laufzeit einen Verweis aus einer Arbeitsmappe entfernen oder Code löschen kann. Das ist natürlich möglich, es ist jedoch sinnvoller, von Haus aus keine Programmierung in den Arbeitsmappen einzufügen.
Hier wird also davon ausgegangen, dass dem Anwender bekannt ist, dass er zur Bearbeitung der Arbeitsmappen ein Add-In benötigt und dieses von ihm selbstständig in Excel geladen wird. In diesem Beispiel müssen das Add-In und die Vorlage im selben Ordner abgelegt sein.

  Schaltflächen aktivieren/deaktivieren [ Top ]
Um die Schaltflächen auf der benutzerdefinierte Symbolleiste aktivieren/deaktivieren zu können, je nachdem, ob eine Arbeitsmappe mit Add-In-Kennung geöffnet und ein Fenster eingeblendet ist oder nicht, wird der Code im Klassenmodul mit den Ereignissen des Application-Objekts aus dem ersten Beispiel mit zwei Funktionen ergänzt.
Mit der folgenden Funktion wird ermittelt, ob in der angegebenen Arbeitsmappe die AddIn-Kennung in den benutzerdefinierten Dokumenteigenschaften vorhanden ist.
 
Private Function HasDocProperty(Optional ByRef Wb As Workbook) _
      As Boolean

  Dim varDPValue As Variant

  On Error Resume Next
  If Wb Is Nothing Then
    Set Wb = Application.ActiveWorkbook
  End If

  If Not Wb Is Nothing Then
    varDPValue = Trim$(Wb.CustomDocumentProperties(gcAPP_NAME))

    If varDPValue = gcAPP_VERSION Then
      HasDocProperty = True
    End If
  End If

exit_Func:
  On Error GoTo 0
End Function
 
Die Funktion zur Überprüfung der Dokumenteigenschaften kann in den verschiedensten Ereignissen aufgerufen werden. Hier wird beispielsweise im Ereignis WindowActivate die Prozedur zum Aktivieren/Deaktivieren der entsprechenden Schaltflächen aufgerufen.
 
Private Sub meXLAppl_WindowActivate(ByVal Wb As Workbook, _
      ByVal Wn As Window)
  ToggleCBarButtons HasDocProperty(Wb)
End Sub
 
Da direkt nach dem Laden/Öffnen eines Add-Ins nicht unbedingt ein Fensterwechsel stattfindet, muss das Initialize-Ereignis noch mit dem Aufruf der Prozedur zum Aktivieren/Deaktivieren der benutzerdefinierten Schaltflächen ergänzt werden.
Im ersten Beispiel-Add-In wurde lediglich geprüft, ob überhaupt eine Arbeitsmappe geöffnet und ein Fenster eingeblendet ist. Soll ein Add-In nur für bestimmte Arbeitsmappen verwendet werden, ist es wichtig zu wissen, ob es sich bei der in Excel ggf. aktiven Arbeitsmappe um eine Arbeitsmappe mit Add-In-Kennung handelt.
In der folgenden Funktion werden zunächst die entsprechenden Schaltflächen provisorisch deaktiviert und nur dann aktiviert, wenn mindestens eine Arbeitsmappe mit eingeblendetem Fenster geöffnet ist und in der aktiven Arbeitsmappe in den benutzerdefinierten Dokumenteigenschaften die Add-In-Kennung enthalten ist.
 
Public Function IsTemplateWorkbook() As Boolean
  On Error Resume Next
  ToggleCBarButtons False

  If GetVisibleWkbWindows > 0 Then
    If HasDocProperty() Then
      ToggleCBarButtons True
      IsTemplateWorkbook = True
    End If
  End If
  On Error GoTo 0
End Function
 
Im Initialize-Ereignis des Klassenmoduls wird obige Funktion wie folgt aufgerufen.
 
Private Sub Class_Initialize()
  Set meXLAppl = Excel.Application
  IsTemplateWorkbook
End Sub
 
Die Funktion zur Überprüfung der ggf. aktiven Arbeitsmappe ist bewusst als öffentlich deklariert worden. Die Funktion sollte vorsichtshalber auch in den OnAction-Prozeduren der entsprechenden Schaltflächen aufgerufen werden, da, wie bereits geschrieben, die Ereignisse WindowDeactivate und WindowActivate des Application-Objekts nicht unbedingt immer "ordnungsgemäß" ausgeführt werden.
 
Public Sub OnAction_Demo()
  If gCAppEvents.IsTemplateWorkbook Then
    MsgBox "Tue 'was ;-)", vbExclamation, gcAPP_NAME
  End If
End Sub
 

  Anbinden des Add-Ins an Excel [ Top ]
Im ersten Beispiel-Add-In, wird im Open-Ereignis, das bei jedem Öffnen des Add-Ins ausgeführt wird, die Prozedur, in der die Symbolleiste erstellt wird, ggf. bereits vorhandene Add-In-Einstellungen aus der Registry ausgelesen werden und der globalen Variable eine neue Instanz des Klassenobjekts mit den Ereignissen des Application-Objekts zugewiesen wird, wie folgt aufgerufen.
 
Private Sub Workbook_Open()
  AddIn_Initialize
End Sub
 
Soll ein Add-In nur für bestimmte Arbeitsmappen verwendet werden, ist es wichtig zu wissen, ob es sich bei der in Excel ggf. aktiven Arbeitsmappe um eine Arbeitsmappe mit Add-In-Kennung handelt. Um die in Excel ggf. aktive Arbeitsmappe ermitteln zu können, muss die OnTime-Methode zum Initialisieren der Klasse verwendet werden.
 
Private Sub Workbook_Open()
  Application.OnTime Now, "'" & ThisWorkbook.Name & _
        "'!AddIn_Initialize"
End Sub
 
Wenn in Excel ein Add-In zur Auflistung der Add-Ins (Dialog Add-Ins-Manager) hinzugefügt und geöffnet wird, egal ob per VBA oder manuell, wird in der MsgBox in folgendem Open-Ereignis der Dateiname des Add-Ins (!) zurückgegeben. Ein bisschen verwunderlich ist das schon, da ein Add-In an sich gar keine "aktive Arbeitsmappe" sein kann.
 
Private Sub Workbook_Open()
  'Zum Testen
  On Error Resume Next
  MsgBox "Name der aktiven Arbeitsmappe im Open-Ereignis: " & _
          ActiveWorkbook.Name
  On Error GoTo 0
End Sub
 
Wird das Add-In jedoch "nur" geöffnet, z. B. per Doppelklick im Explorer, und das Add-In ist nicht in der Auflistung der Add-Ins aktiviert, so wird in der MsgBox der Name der aktiven Arbeitsmappe angezeigt, sofern eine Arbeitsmappe in Excel sichtbar geöffnet ist.

  Schlusswort [ Top ]
Das Erstellen eines Excel-Add-Ins (*.xla) ist auch nicht schwieriger oder gar viel anders als die Programmierungen in einer "normalen" Arbeitsmappe. Add-Ins haben aber den Vorteil, dass der Code und die Funktionalität an zentraler Stelle verwaltet werden kann und sie auch leichter auszutauschen sind.
Der Code in den beiden VBA-Projekten ist so aufgebaut, dass dieser leicht als Grundlage für eigene Projekte verwendet werden kann. Die Beispiele im Download sind ausführlich kommentiert. Es ist allerdings nur eine minimale Fehlerbehandlung enthalten, diese müsste noch entsprechend ergänzt werden.
In den beiden Add-Ins ist weder eine Installations- noch eine Deinstallationsroutine enthalten. Lediglich beim Entladen der Add-Ins im Add-In-Manager werden die vom Add-In per VBA erstellten Registry-Einträge ggf. gelöscht. Geplant ist ein weiteres Tutorial, in dem beschrieben wird, wie man ein Add-In per VB/VBA installieren und wieder deinstallieren kann.

Links zum Thema [ Top ]
Excel - Add-Ins erstellen, laden und entfernen
Excel - Ereignisse des Application-Objekts
Excel - Ereignisse des Workbook-Objekts
XL2000: ALT+TAB Does Not Trigger Workbook_WindowActivate Event

Betriebssystem
Win 95
Win 98
Win ME
Win NT
Win 2000
Win XP
Excel-Version
Excel 97
Excel 2000
Excel 2002 (XP)
Excel 2003


Download  (104 kB) Downloads bisher: [ 5110 ]

  Zum Seitenanfang  

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

Seite empfehlen Bug-Report
Letzte Aktualisierung: Donnerstag, 23. März 2006