28.02.2025, 09:46 (Dieser Beitrag wurde zuletzt bearbeitet: 28.02.2025, 09:46 von Warkings.)
(27.02.2025, 17:08)struct schrieb: Inwiefern würd das helfen? D.h. was müsste das Skript machen?
Jürgen
Ganz "einfach", mit dem Installationsskript sorgst Du dafür, dass das AddIn immer im gleichen lokalen Verzeichnis landet, am besten in C:\Users\[Benutzername]\AppData\Roaming\Microsoft\AddIns Und diesen Pfad referenziert Du, indem Du den Benutzernamen z.B. mit Hilfe von Environ("Username") bestimmst oder eine API Funktion wie GetUserName nimmst.
Deine Frage überrascht mich, da du hier problemlos eine C-Routine schreibst, aber in deinem VBA-Skript deinen Benutzernamen anscheinend fest hinterlegt hast und nicht weißt, wie man das dynamisch umsetzt.
28.02.2025, 10:47 (Dieser Beitrag wurde zuletzt bearbeitet: 28.02.2025, 10:50 von struct.)
(28.02.2025, 09:46)Warkings schrieb: Ganz "einfach", mit dem Installationsskript sorgst Du dafür, dass das AddIn immer im gleichen lokalen Verzeichnis landet, am besten in C:\Users\[Benutzername]\AppData\Roaming\Microsoft\AddIns Und diesen Pfad referenziert Du, indem Du den Benutzernamen z.B. mit Hilfe von Environ("Username") bestimmst oder eine API Funktion wie GetUserName nimmst.
Deine Frage überrascht mich, da du hier problemlos eine C-Routine schreibst, aber in deinem VBA-Skript deinen Benutzernamen anscheinend fest hinterlegt hast und nicht weißt, wie man das dynamisch umsetzt.
Die Funktionen aus dem Addin werden aber direkt in Zellen der Tabelle genutzt. Zum einen weiß ich nicht, ob ich in einer Zelle auch Umgebungsvariablen nutzen kann und zum anderen sieht das dann nicht unbedingt elegant aus und verringert die Lesbarkeit, wenn bei jedem Makro-Aufruf ein Pfad vor dem Makro steht.
Jürgen
(27.02.2025, 19:03)volti schrieb: Nun, ich kenne ja die Handhabe nicht.
Ich nahm an, dass per Software, also z.B. aus einer von Dir erstellten Datei bei User auf die AddIn-Datei zugefriffen werden soll und dort ein fester Pfad drin steht.
Anstelle dieses festen Pfades dann einfach im Code den flexiblen Pfad nehmen. Oder ich habe es falsch verstanden.
Environ$("Appdata") & "\Microsoft\AddIns" an Stelle von C:\Users\[Benutzername]\AppData\Roaming\Microsoft\AddIns
Gruß KH
Wo würde ich das eintragen? Bisher gebe ich den Pfad überhaupt nicht an. Wenn die xlam geladen ist, kann ich alle darin definierten Makros nutzen.
Würde ich das dann jedem Makro-Aufruf voranstellen? Das verringert die Les-, Wart- und Übertragbarkeit aber deutlich.
(27.02.2025, 14:23)struct schrieb: Wenn sie so eine Datei öffnen, hat jeder Makro Aufruf den gesamten Pfad des Ablageortes des Addin auf meinem Rechner vorangestellt, den es auf ihrem Rechner natürlich nicht gibt.
Genau das verstehe ich nicht. Wenn ich ein AddIn verwende, das Funktionen bereitstellt, dann steht doch niemals nicht irgendein Dateiname davor. Kann es sein, dass du gar kein echtes AddIn hast, sondern "nur" eine normale Excel-Datei?
(28.02.2025, 11:39)HKindler schrieb: Hi, Genau das verstehe ich nicht. Wenn ich ein AddIn verwende, das Funktionen bereitstellt, dann steht doch niemals nicht irgendein Dateiname davor. Kann es sein, dass du gar kein echtes AddIn hast, sondern "nur" eine normale Excel-Datei?
Hab eine leere Excel datei erzeugt, den Visual Basic Editor geöffnet, ein Modul hinzugefügt and da meinen Code rein geschrieben. Und dann als Addin (*.xlam) gspeichert. ist das korrekt so?
Wie gesagt, wenn nur ich selbst das benutze klappt alles und es steht kein Pfad vor den Makros. Öffnet jemand anders die gleiche Datei, steht ein Pfad davor (der auf mein Verzeichnis zeigt, dass es auf dem anderen Rechner nicht gibt) und Excel findet das Addin nicht. Wenn man die Quelle ändert, funktioniert wieder alles.
28.02.2025, 13:51 (Dieser Beitrag wurde zuletzt bearbeitet: 28.02.2025, 13:51 von Warkings.)
(28.02.2025, 10:47)struct schrieb: Die Funktionen aus dem Addin werden aber direkt in Zellen der Tabelle genutzt. Zum einen weiß ich nicht, ob ich in einer Zelle auch Umgebungsvariablen nutzen kann und zum anderen sieht das dann nicht unbedingt elegant aus und verringert die Lesbarkeit, wenn bei jedem Makro-Aufruf ein Pfad vor dem Makro steht.
Jürgen Wo würde ich das eintragen? Bisher gebe ich den Pfad überhaupt nicht an. Wenn die xlam geladen ist, kann ich alle darin definierten Makros nutzen.
Würde ich das dann jedem Makro-Aufruf voranstellen? Das verringert die Les-, Wart- und Übertragbarkeit aber deutlich.
Jürgen
Im Ausgangspost hattest Du geschrieben: "Die Kollegen haben das Addin auch im gleichen Verzeichnis installiert, der Benutzername ist aber natürlich anders und damit ist es eben auch ein anderes Verzeichnis."
Das hat mich zu der Annahme verleitet, dass aus irgendeinem Grund "C:\Users\[Benutzername]\AppData\Roaming\Microsoft\AddIns" Dir Probleme macht. Wenn das nicht so ist, habe ich Dein Problem nicht verstanden.
Vielleicht hilft KI
Zitat:Damit du Subs oder Funktionen aus einem Add-In in einem Makro einer neuen Excel-Datei aufrufen kannst, gibt es mehrere Möglichkeiten. Hier sind die gängigsten Methoden: 1. Add-In als Referenz einbinden (für öffentliche Funktionen) Wenn dein Add-In öffentliche Funktionen oder Subs enthält, kannst du es als VBA-Referenz hinzufügen und direkt aufrufen. Schritte:
Öffne die neue Excel-Datei.
Gehe in den VBA-Editor (ALT + F11).
Klicke auf Extras > Verweise....
Scrolle in der Liste nach deinem Add-In (der Name entspricht dem Titel im Add-In-Manager).
Aktiviere das Häkchen und bestätige mit OK.
Nun kannst du die öffentlichen Subs oder Funktionen des Add-Ins direkt in deinem Makro aufrufen, z. B.:
Code:
Call MeineAddInSub ' oder MeineAddInSub
Falls es sich um eine Funktion handelt:
Code:
Dim Ergebnis As String Ergebnis = MeineAddInFunktion(Argument)
Voraussetzung: Die Sub oder Funktion im Add-In muss als Public deklariert sein:
Code:
Public Sub MeineAddInSub() MsgBox "Das ist eine Sub aus dem Add-In!" End Sub
2. Add-In über Application.Run aufrufen (auch ohne Referenz) Falls du das Add-In nicht als Referenz einbinden kannst oder willst, kannst du die enthaltenen Subs mit Application.Run aufrufen. Beispiel:
Der Name des Add-Ins muss exakt stimmen, wie es in Excel geladen ist.
Die Sub oder Funktion muss Public sein.
3. Benutzerdefinierte Funktionen (UDFs) in Excel-Zellen nutzen Falls das Add-In eine benutzerdefinierte Funktion enthält, kannst du diese direkt in einer Excel-Zelle nutzen, z. B.:
Code:
=MeineAddInFunktion(A1)
Voraussetzung: Die Funktion muss
Code:
Public Function
sein, z. B.:
Code:
Public Function MeineAddInFunktion(x As Double) As Double MeineAddInFunktion = x * 2 End Function
Zusätzlicher Tipp: Add-In sicherstellen Falls das Add-In beim Öffnen nicht geladen ist, kannst du es zur Laufzeit aktivieren:
Code:
If AddIns("MeinAddIn").Installed = False Then AddIns("MeinAddIn").Installed = True End If
Wann welche Methode? Methode Vorteile Nachteile VBA-Referenz setzen Einfacher direkter Zugriff Muss manuell gesetzt werden Application.Run Funktioniert auch ohne Referenz Langsamer als direkter Aufruf Excel-Zellfunktion Ideal für Benutzer, keine VBA-Kenntnisse nötig Nur für Funktionen, nicht für Subs
03.03.2025, 10:10 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2025, 10:12 von struct.)
(28.02.2025, 13:51)Warkings schrieb: Im Ausgangspost hattest Du geschrieben: "Die Kollegen haben das Addin auch im gleichen Verzeichnis installiert, der Benutzername ist aber natürlich anders und damit ist es eben auch ein anderes Verzeichnis."
Das hat mich zu der Annahme verleitet, dass aus irgendeinem Grund "C:\Users\[Benutzername]\AppData\Roaming\Microsoft\AddIns" Dir Probleme macht. Wenn das nicht so ist, habe ich Dein Problem nicht verstanden.
Vielleicht hilft KI
Hallo Warkings,
ja, ich nehme an, das ist das Problem. Excel scheint sich zu merken, wo die Datei liegt, in der die Makros definiert sind. Und wenn die Datei bei Bearbeitung auf einem anderen Rechner nicht da liegt (z.B. weil es das Verzeichnis dort nicht gibt, das es ja den Nutzernamen enthält und der Nutzer ein anderer ist.
Danke auch für die Auflistung der Wege, wie ich ein Addin für Excel bekannt machen kann. Allerdings funktionieren die ersten zwei Methoden nur, wenn ich die Makros in VBA verwenden will. Aber nicht, wenn ich sie in Zellen nutzen möchte, wie in meiner Anwendung. Die dritte Variante passt zwar auf meinen Anwendungsfall, funktioniert in der Form aber nicht, denn woher soll Excel wissen, wo das Addin liegt?
Was mir helfen würde wäre das Äquivalent zu PATH, wo ich dann beliebige Addins ablegen kann. Ähnlich wie es das Betriebssystem macht. Ich würde diesen Pfad einmal angeben und sobald in Excel ein makro aufgerufen wird, das es nicht kennt, sucht Excel unter diesem Pfad, ob der Befehl in einem dort abgelegten Addin definiert wird. Jeder Nutzer könnte seinen eignen PATH definieren und es würde damit auf jedem Rechner funktionieren.
Gruß, Jürgen > Ich würde ein 'general' Addin in 'Library' speichern.
Tut mir leid, das versehe ich nicht. Meinst du, ich soll die Addin Datei (also z.b. test.xlam) im Ordner "Library" speichern? Wo finde ich diesen Ordner?
> PS. ein AddIn muss auch ein Isaddin Property =true haben
03.03.2025, 11:15 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2025, 11:15 von snb.)
Zitat:Wo finde ich diesen Ordner?
Code übersehen, nicht getestet ?
Jeder User kan diesen Code verwenden:
Code:
Sub M_snb() With Application.FileDialog(3) .InitialFileName = Application.LibraryPath & "\*.xlam" If .Show Then AddIns.Add(.SelectedItems(1), True).Installed = True End With End Sub
(03.03.2025, 10:10)struct schrieb: ... Wenn sie so eine Datei öffnen, hat jeder Makro Aufruf den gesamten Pfad des Ablageortes des Addin auf meinem Rechner vorangestellt, den es auf ihrem Rechner natürlich nicht gibt. Wenn sie "Quelle ändern" nutzen, können sie das natürlich korrigieren und alles funktioniert wieder. Das ist aber etwas umständlich. ...
Ich denke, um Dein Problem zu verstehen, musst Du das oben Geschriebene im Detail erläutern, ggf. mit Code oder Formeln, oder was immer da das Problem ist.
BTW Application.LibraryPath Application.UserLibraryPath liefert Dir die jeweiligen Pfade zur Laufzeit. Excel Options - Folder Paths
03.03.2025, 14:29 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2025, 14:41 von struct.)
(03.03.2025, 11:15)snb schrieb: Code übersehen, nicht getestet ?
Jeder User kan diesen Code verwenden:
Code:
Sub M_snb() With Application.FileDialog(3) .InitialFileName = Application.LibraryPath & "\*.xlam" If .Show Then AddIns.Add(.SelectedItems(1), True).Installed = True End With End Sub
Ok, mir war nicht klar, dass mir dieser Code das Verzeichnis ausgibt.
Das sind dann aber die bekannten Verzeichnisse, mit den Problemen, die ich schon genannt habe:
- UserLibraryPath ist bei jedem Benutzer anders. Excel scheint aber immer an der Stelle zu suchen, bei dem das Addin beim Erstellen der Excel Datei lag. Und diesen Pfad gibts dann bei anderem Nutzer/Rechner nicht. - LibraryPath ist ohne admin Rechte nicht schreibbar.
Jürgen
(03.03.2025, 11:20)Warkings schrieb: Ich denke, um Dein Problem zu verstehen, musst Du das oben Geschriebene im Detail erläutern, ggf. mit Code oder Formeln, oder was immer da das Problem ist.
BTW Application.LibraryPath Application.UserLibraryPath liefert Dir die jeweiligen Pfade zur Laufzeit. Excel Options - Folder Paths
Hatte gedacht, das könnte man verstehen. Ok, dann anders.
1. Ich erstelle ein addin und lege es auf meinem Rechner unter c:\users\ich\AppData\Roaming\Microsoft\Addins\meinAddin.xlam ab. 2. Ich aktiviere das Addin unter Optionen->Add-Ins->"verwalten: Excel Add-Ins Los" 2. Ich erstelle eine Excel Datei Berechnungen.xlsxm und nutze das Makro meineFunktion(A1), die sich Addin befinden. 3. ich speichere die Datei ab. 4. Mein Kollege legt das Addin bei sich unter c:\users\Kollege\AppData\Roaming\Microsoft\Addins\meinAddin.xlam auf seinem Rechner ab. 5. Mein Kollege öffnet meine Excel Datei Berechnungen.xlsm auf seinem Rechner. 6. Jetzt steht bei jedem Aufruf der Funktion ='c:\users\ich\AppData\Roaming\Microsoft\Addins\meinAddin.xlam'!meineFunktion(A1) - Und der Aufruf funktioniert nicht, weil er das Verzeichnis nicht hat.