Zugriff auf addin dynamisch aus vba

Hallo,

Ich habe ein Addin erstellt, das neben Makros auch Formularvorlagen enthält. Wenn das Addin (über den Addin-Manager) eingebunden ist, kopiere ich die Vorlagen in die aktuelle Mappe.

Nun zu meinem Problem: Einige dieser Vorlagen brauchen Eventroutinen. Das, was beim Event passieren soll, ist in das Addin ausgelagert. Jetzt müsste ich diese Prozeduren beim Eintreten des Events in der aktuellen Mappe aufrufen können.

Gebe ich in der Eventroutine den Dateinamen des Addins statisch an, kann ich Code des Addins ausführen:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)
   Const xla = „addin.xla“
   If Not ActiveCell Is Nothing Then
    Application.Run xla & _
     „!Addin_Module.event_Worksheet_BeforeDoubleClick“, _
     Target, Cancel
   End If
End Sub

Das gefällt mir nicht, weil es statisch ist. Ich muss an allen Stellen, an denen ich Eventcode habe, den Dateinamen des Addins angeben und der kann sich ändern, wenn es verschiedene Versionen gibt. Außerdem enthält die aktuelle Mappe dann eine Verknüpfung zum Addin.

Lieber wäre mir, wenn ich die Routine über den Projektnamen ansprechen könnte, in etwa so:
Application.Run Application.VBE.VBProjects(„Addin-Projekt“). _
VBComponents(„Addin_Module“). _
event_Worksheet_BeforeDoubleClick, Target, Cancel
Aber das klappt leider nicht.

Weil ich gehört habe, dass das Problem gelöst werden könnte, indem man im VBA einen Verweis auf das Addin setzt, hab ich das auch probiert. Aber ich erhalte die Fehlermeldung „Name steht in Konflikt mit vorhandenem Modul, Projekt oder vorhandener Objektbibliothek“. Dabei heißt das VBA-Projekt des Addins „Addin-Projekt“ und das VBA-Projekt der aktuellen Mappe „VBAProject“. Ich nehme an, dass die Meldung erscheint, weil das Addin bereits über den Addin-Manager eingebunden ist.

Für Ideen, wie ich dynamisch auf das Addin zugreifen kann, bin ich dankbar!

Viele Grüße,
Kerstin :smile:

PS: Zur Info: Ich arbeite mit Excel 2000 SP3.

Hi Kerstin,
du scheinst dich in Add-Ins im Gegensatz zu mir gut auszukennen, was mir aber gleich auffiel, „xla“ hast du als Namen vergeben. tztz, ich vermeide tunlichst vba-Namen als Namen zu benutzen, gibt nur Ärger. Eine Variable als „Name“ zu benennen passt zwar gut zu Name, Vorname, Adresse, aber gibt nur Ärger.
AAnsonsten, habe noch bis Do viel Arbeit am Hut, danach stelle ich mal deine Poblemematik bei mir nach und melde mich wenn ich da ne Lösung finde.
Gruß
Reinhard

Doch mit strings basteln…?
Hallo Kerstin,

ich kann es bei mir nicht nachvollziehen (Hab irgendwelche OLE-Probleme unter Excel97), aber vom Code her fällt mir auf, dass Du im zweiten Beispiel den Addin-Namen gar nicht ausliest, sondern beim Objektverweis stehenbleibst. Wenn Du die .Name-Eigenschaft spezifizieren würdest, kommt dabei ein String raus. Den kannst Du dann in Bsp 1 einsetzen:

Private Sub Worksheet\_BeforeDoubleClick(ByVal Target As
Excel.Range, Cancel As Boolean)
 dim strAddInName as string
 strAddInName = Application.VBE.VBProjects("Addin-Projekt").\_
 VBComponents("Addin\_Module").NAME

 If Not ActiveCell Is Nothing Then
 Application.Run strAddInName & \_
 "!Addin\_Module.event\_Worksheet\_BeforeDoubleClick",Target, Cancel
 End If
End Sub

Diese Konstruktion müsste zur Laufzeit den Dateinamen variabel ermitteln können.
Hilft das?

Gruß, Dennis

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Dennis,

Deine Idee ist echt gut! Aus dem String kann ich mir den Dateinamen holen und damit die statische Angabe umgehen:

Private Sub Worksheet\_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)
 Dim strAddInName As String
 'Application.VBE.vbprojects("Addin-Projekt").Name: "Addin-Projekt"

 strAddInName = Application.VBE.vbprojects("Addin-Projekt").Filename
 strAddInName = Right(strAddInName, \_
 Len(strAddInName) - InStrRev(strAddInName, "\"))
 'strAddInName: "Addin.xla"

 If Not ActiveCell Is Nothing Then
 Application.Run strAddInName & \_
 "!Addin\_Module.event\_Worksheet\_BeforeDoubleClick", Target, Cancel
 End If
End Sub

Der Name („Addin-Projekt“) allein funktioniert leider nicht.
Wenn ich allerdings den Dateinamen mit Pfad (also Application.VBE.vbprojects(„Addin-Projekt“).Filename) in Application.Run verwende, erhalte ich die Fehlermeldung „Laufzeitfehler ‚1004‘:
Microsoft Excel kann das Makro ‚C:\Documents and Settings\user\Application Data\Microsoft\AddIns\Addin.xla!Addin_Module.event_Worksheet_BeforeDoubleClick‘ nicht finden.“
Wieso ich beim Dateinamen mit Pfad diese Meldung erhalte und beim Dateinamen allein nicht, ist mir nicht klar.

Je länger ich mich damit beschäftige, desto mehr zweifle ich, dass es überhaupt eine Lösung gibt, bei der ich nicht den Dateinamen des Addins angeben muss. Mir wäre es am liebsten, wenn ich das Addin nur über den Addin-Manager einbände und dann nur das eingebundene Addin referenzierte. Aber mit der Fehlermeldung beim Setzen eines Verweises auf das Addin im VBA bin ich auch nicht mehr weitergekommen.
Um die Verknüpfungen komme ich wahrscheinlich auch nicht herum, weil ich zwei Makros im Addin habe, die in Zellen der aktuellen Mappe genutzt werden.

Vielen Dank, Dennis, Deine Idee hat mir geholfen! :smile:

Viele Grüße,
Kerstin :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

…Am End ein Escape-Zeichen-Problem?
Nur mal so 'ne Idee… In vielen Fällen will VBA oder Verwandte doppelte \ bei Pfadangaben. Probier doch mal, ob sich was ändert an der Fehlermeldung, wenn Du die Backslashes verdoppelst…

Daumendrück Dennis

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]