Ein Symbol für einen Makronamen in
verschiedenen Dateien

29.05.2002


Bitte beachten Sie, dass dieser Beitrag
fortgeschrittene Kenntnisse in VBA erfordert !

Was zunächst recht verwirrend klingen mag ist recht schnell erklärt:
Stellen Sie sich vor, Sie arbeiten mit mehreren Dateien,
die alle ein gleichnamiges Makro beinhalten,
jedoch verschiedene Aufgaben erledigen soll. 

Eine neue Symbolleiste mit einem Symbol zu erstellen
ist keine große Sache, jedoch steckt hinter diesem Symbol
das unter "OnAction" angegebene Makro in einer bestimmten Datei,
und zwar nur in "dieser einen" Datei !

Die folgende Lösung soll verdeutlichen,
wie einfach es ist, "OnAction" je nach geöffneter Datei anzupassen.

Diese Datei hat die Aufgabe eine neue Symbolleiste mit einem
Symbol zu erstellen. Zunächst wird "OnAction" das Makro "MachWas"
zugewiesen, welches sich in der gleichen Datei befindet.
Des weiteren überwacht diese Datei mit Hilfe eines Klassenmodules
das Öffnen von Dateien, um somit die Eigenschaft "OnAction" zu ändern.
Wird also eine andere Datei geöffnet, soll sich die "OnAction" Eigenschaft
auf die gerade geöffnete Datei beziehen, ebenfalls auf den
Makronamen "MachWas".
'** DieseArbeitsmappe **
Dim AppObject As New CAppLog
Private Sub Workbook_Open()
    Call Symbolleiste_erstellen
    Set AppObject.app = Application
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Set AppObject.app = Nothing
End Sub

'** Modul1 **
Const Symbolleistenname = "Eigene Symbolleiste"
Const Symbolname = "Test"
Const Makroname = "MachWas"
'
'Erstellt eine neue Symbolleiste
'
Sub Symbolleiste_erstellen()
    On Error Resume Next
    Application.CommandBars(Symbolleistenname).Delete
    Set CB = Application.CommandBars.Add(Name:=Symbolleistenname, _
       temporary:=True, Position:=msoBarTop)
    CB.Visible = True
    Set CBC = CB.Controls.Add(Type:=msoControlButton)
    With CBC
        .Name = Symbolname
        .FaceId = 59
        .Caption = "Test"
        .OnAction = Makroname
    End With
End Sub
'
'Ändert die Eigenschaften der Symbolleiste (OnAction)
'
Sub SymbolMakroÄndern(Dateiname)
    On Error Resume Next
    Application.CommandBars(Symbolleistenname). _
       Controls(Symbolname).OnAction = Dateiname & "!" & Makroname
End Sub
'
'Testmakro, steckt hinter dem Symbol
'
Sub MachWas()
    MsgBox "Hier meldet sich ein Makro aus der 'Hauptdatei'", vbExclamation
End Sub

'** Klassenmodul "CAppLog" **
Public WithEvents app As Application   
Private Sub app_WorkbookOpen(ByVal WBook As Excel.Workbook)
    Dateiname = WBook.FullName
    Call SymbolMakroÄndern(Dateiname)
End Sub

Erstellen Sie sich nun einige Testdateien,
die alle ein Makro namens "MachWas" beinhalten.
Zum Testen reicht es aus, eine Msgbox in das Makro zu setzen.

Im untenstehenden Beispiel finden Sie das Beispiel und 3 Testdateien.

Natürlich könnte man den Namen des zu startenden Makros
abhängig vom Dateinamen festlegen.
Dazu würde es ausreichen eine entsprechende Abfrage in
der Routine "SymbolMakroÄndern" einzubauen.

Ein Anwendungsbeispiel könnte sein,
wenn Sie regelmäßig mit verschiedenen Dateien arbeiten,
die unterschiedliche Routinen beinhalten.
Sie müssen sich dazu nicht unbedingt mehrere Symbole in einer
Symbolleiste anlegen, sondern nur dieses eine.
Je nach geöffneter Datei wird die entsprechend richtige Routine gestartet.

Um die Sache perfekt zu gestalten, könnte man mit Hilfe der VBE-Programmierung
vor dem Ändern der "OnAction" Eigenschaft prüfen, ob sich das entsprechende
Makro überhaupt in der geöffneten Datei befindet.
Falls dies nicht der Fall ist, weist man einfach ein Makro zu,
welches dies in Form einer entsprechenden Meldung dem Benutzer mitteilt.


Download - 14 KB