Legen Sie programmgesteuert DLL-Suchpfad in VBA-makro
Das problem
- Ich habe eine word-Vorlage, die verwendet VBA die
Declare
- Anweisung, um einen link zu einer dll, deren Pfad kann bestimmt werden, innerhalb des VBA-makro - Ich will delploy dies der Benutzer %APPDATA%\Microsoft\Word\STARTUP-Verzeichnis
- Ich will NICHT dauerhaft wechseln des Benutzers PATH-Umgebungsvariablen (vorübergehend wäre OK, aber das scheint nicht zu funktionieren, da Sie nicht aktualisiert werden, bis ein Neustart der Applikation)
Lösungsversuch
Ich habe versucht, dynamisch code hinzufügen, mit dem Declare
Aussagen über ThisDocument.VBProject.CodeModule.AddFromString(code)
die funktioniert beim laden der Vorlage von einem normalen Verzeichnis, aber wenn die Vorlage in Word\STARTUP es gibt die folgende Fehlermeldung:
Run-time error '50289':
Nicht ausführen, da die
Projekt geschützt ist.
Und Einstellung der registry-Schlüssel "HKEY___LOCAL_MACHINE\Software\Microsoft\Office\11.0\Word\Security\AccessVBOM" zu 1 nicht dadurch beheben, wenn die Vorlage in Word\STARTUP
Ich bin wirklich kämpfen, um eine Lösung zu finden. Wenn jemand eine Möglichkeit kennt, dies zu tun, das wäre toll.
InformationsquelleAutor Steve Ridout | 2009-01-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ehrlich gesagt, ich weiß nicht, was das problem mit diesen VBA-code-injection -, Montage-generation für die LoadLibrary () - Aufrufe, usw. Techniken, die ich gesehen habe verwendet für diese einfache Aufgabe. In meinem Projekt verwende ich einfache code zum laden der dll aus dem gleichen Ort wie die Arbeitsmappe, wie diese:
Excel 2003 zumindest, hat keine problem beim laden der dll aus dem aktuellen Pfad Einstellen ChDir, um was auch immer Pfad der DLL hat. Möglicherweise müssen Sie auch ändern Sie Ihre aktuelle Laufwerk, das getrennt ist vom aktuellen Pfad. Sie tun es nur einmal, bevor die erste Funktion aufrufen, nachdem Sie die DLL bleibt an, egal wo sich Ihre aktuelle Pfad ist, so können Sie es einmal tun in workbook_open und sich nicht die Mühe, über den Pfad später. Ich biete eine leere dummy-Funktion in der DLL nur für diesen Zweck. Ich glaube nicht, dass MS Word ist anders.
Das funktioniert nicht immer. Aktuelles Verzeichnis ist ein langer Weg nach unten die Liste der Pfade, die durchsucht werden, und in einigen Szenarien ist das aktuelle Verzeichnis kann nicht sein, der Suchpfad, auf alle. Plus Sie sind Schrauben, die mit dem Prozess Breite Arbeitsverzeichnis. Die explizite
LoadLibrary
Ansatz mit einem absoluten Pfad ist der beste Weg, dies zu tun.Angenommen, Sie benötigen den aktuellen Pfad für eine Access-Datei anstelle von Excel, seiner
CurrentProject.Path
InformationsquelleAutor panda-34
Können Sie LoadLibrary-api.
Z.B. in meinen Projekten der code sieht so aus:
InformationsquelleAutor SparcU
Es ist eine wirklich wirklich hässliche Lösung, aber diese blogger es herausgefunden, und ich kann nicht herausfinden, jede andere Art und Weise:
http://blogs.msdn.com/pranavwagh/archive/2006/08/30/How-To-Load-Win32-dlls-Dynamically-In-VBA.aspx
Im Grunde, Sie schreiben eine Prozedur, erzeugt ein code-Modul im VBA während der Laufzeit. Dieses Modul muss eine Referenz auf die dll und muss es schaffen eine dummy-Funktion (oder Prozedur) als Bestandteil dieses Moduls, ruft die dll. Dann, aus dem code, die Sie verwenden, Anwendung.Run(dummyfunction(), arg1, arg2...). Dies ist notwendig, da ansonsten das Projekt wird nicht kompiliert, da dummyfunction ist noch keine Funktion.
Sie werden bemerken, in seinem code, den er verwendet, InputBox (), um den Speicherort der die .dll, aber offensichtlich konnte man die Lage aus einem Bereich in der Tabellenkalkulation. Der folgende code-snippet nützlich sein können.
'decString' und 'funcString' waren nur strings, die ich gebaut, wie sein 'ss'. Das snippet zeigt, wie Sie Sie umbenennen können Sie den code-Modul, so dass man Sie später löschen, wenn nötig. Offensichtlich ist diese nur löscht es, nachdem es erstellt wird, und Sie wahrscheinlich würde nicht wollen, das zu tun, aber mindestens es zeigt Ihnen, wie es gemacht werden würde.
Nachdem alles gesagt, dass wir meistens nur schreiben .exe ' s jetzt und shell aus. Wenn Sie brauchen, VBA-warten auf die shell zu beenden, gibt es Lösungen für das Problem als gut.
InformationsquelleAutor oob
Hier ist, was ich am Ende machen, mit Pranav Wagh Methodik weiter oben verlinkt und der code von C Pearson Website (http://www.cpearson.com/excel/vbe.aspx). Dieser code fordert den Benutzer auf, wählen Sie den Pfad zu der dll mit einem Datei-Öffnen-Fenster, baut ein neues Modul mit einer Declare-Funktion mit den eingegebenen Pfad und eine Funktion zum ausführen eines handshake mit der dll. Der Zweck der Funktion in der dll gibt 1 zurück, wenn erfolgreich:
Allerdings, wenn ich um die Arbeitsmappe (xlsm) in ein add-in (xlam), habe ich festgestellt, dass Excel nicht zulassen würde, dass die makro erstellen neuer Module also meine LinkToDll nicht funktionieren würde. Das Update war um die Declare-Funktion wieder in LinkToDll nur mit den dll-Dateinamen ("Geo_DLL.dll") als die Lib zusammen mit der runthisfunc sub. Ich fand, dass der Benutzer wählen Sie einfach die dll-Datei über den Datei-Öffnen-Fenster war genug, um zu zeigen Sie Excel, um die dll auch mit nur den Namen der Datei in der Lib-Teil die Declare Function-Anweisung.
Chris
InformationsquelleAutor Chris Iriarte