Définir par programmation DLL chemin de recherche en macro VBA
Le problème
- J'ai un modèle word qui utilise VBA
Declare
déclaration de lien d'une dll, dont le chemin d'accès peut être déterminé à l'intérieur de la macro VBA - Je veux delploy ce pour les utilisateurs de %APPDATA%\Microsoft\Word\STARTUP répertoire
- Je NE veux PAS changer de façon permanente à l'utilisateur de la variable d'environnement PATH (temporairement serait OK, mais cela ne semble pas fonctionner comme ils ne reçoivent pas actualisé jusqu'au redémarrage de l'application)
Tentative de solution
J'ai essayé d'ajouter dynamiquement le code avec le Declare
instructions à l'aide de ThisDocument.VBProject.CodeModule.AddFromString(code)
qui fonctionne lors du chargement du modèle à partir d'un répertoire normal, mais lorsque le modèle est à l'intérieur de Word\STARTUP, il donne l'erreur suivante:
Erreur d'exécution '50289':
Ne pouvez pas effectuer l'opération depuis le
le projet est protégé.
Et le réglage de la clé de registre "HKEY___LOCAL_MACHINE\Software\Microsoft\Office\11.0\Word\Security\AccessVBOM" à 1 ne résout pas ce problème lorsque le modèle est en Word\STARTUP
J'ai vraiment du mal à trouver une solution. Si quelqu'un connaît un moyen de le faire, ce serait génial.
- Liés pour MSAccess stackoverflow.com/questions/28977285/...
Vous devez vous connecter pour publier un commentaire.
Franchement, je ne sais pas quel est le problème avec l'aide de tous ceux code VBA injection, l'assemblage de la génération de LoadLibrary() appelle, etc les techniques que j'ai vu utilisé pour cette tâche simple. Dans mon projet j'utilise un code simple de charger la dll à partir du même emplacement que le classeur, comme ceci:
Excel 2003, au moins, n'a pas de problème de chargement de la dll à partir de l'actuel chemin, Mis ChDir quelque soit le chemin d'accès de votre fichier DLL a des. Vous pourriez aussi avoir besoin de changer de voiture qui est séparée de la voie actuelle. Vous devez le faire qu'une seule fois, avant le premier appel de la fonction, après la DLL reste attaché n'importe où de votre chemin d'accès actuel est, de sorte que vous pouvez le faire une fois dans "workbook_open" et pas la peine sur le chemin plus tard. - Je fournir un vide mannequin fonction dans la DLL que vous venez à cette fin. Je ne pense pas que MS Word est différent sur ce point.
LoadLibrary
approche avec un chemin absolu est la meilleure façon de le faire.CurrentProject.Path
Vous pouvez utiliser l'api LoadLibrary.
Par exemple, dans mes projets, le code ressemble à ceci:
Il y a un autre vraiment vraiment moche solution, mais ce blogueur compris, et je ne peux pas comprendre une autre manière:
http://blogs.msdn.com/pranavwagh/archive/2006/08/30/How-To-Load-Win32-dlls-Dynamically-In-VBA.aspx
Fondamentalement, vous écrivez une procédure qui crée un module de code en VBA cours de l'exécution. Ce module doit créer une référence à la dll et il doit créer un mannequin de la fonction (ou procédure) dans le cadre de ce module qui appelle la dll. Puis, à partir de votre code, vous pouvez utiliser l'Application.Exécuter(dummyfunction(), arg1, arg2...). Cela est nécessaire parce que sinon, le projet ne compile pas car dummyfunction n'est pas encore une fonction.
Vous remarquerez que dans son code, il utilise InputBox() pour obtenir l'emplacement de l' .dll, mais évidemment, vous pourriez obtenir de l'emplacement à partir d'une plage dans la feuille de calcul. L'extrait de code suivant peut être utile.
'decString" et "funcString' étaient juste des cordes j'ai construit comme de son "ss". L'extrait montre comment vous pouvez renommer le module de code de sorte que vous pouvez supprimer plus tard si nécessaire. Évidemment, cela supprime tout juste après elle est créée, et vous ne voudriez probablement pas à le faire, mais au moins il vous montre comment faire.
Après avoir dit tout cela, nous avons surtout il suffit d'écrire .exe est maintenant et shell. Si vous avez besoin de VBA à attendre sur la coque pour finir, il existe des solutions pour ce problème.
Voici ce que j'ai fait, à l'aide de Pranav Wagh méthodologie du lien ci-dessus et de code C Pearson site (http://www.cpearson.com/excel/vbe.aspx). Ce code invite l'utilisateur à sélectionner le chemin d'accès à la dll à l'aide d'une fenêtre Ouvrir le Fichier, crée un nouveau module avec un Déclarer une Fonction à l'entrée du chemin et une fonction pour exécuter une poignée de main avec la dll. Le but de construction fonction dans la dll retourne 1 en cas de succès:
Cependant, une fois que j'ai tourné le classeur (xlsm) dans un addin (xlam), j'ai trouvé que Excel ne laissez pas la macro créer de nouveaux modules, donc mon LinkToDll ne fonctionnerait pas. La solution était de mettre le Déclare une Fonction de retour en LinkToDll avec juste le nom de fichier dll ("Geo_DLL.dll") comme la Lib avec le runthisfunc sous. J'ai trouvé avoir à l'utilisateur il suffit de sélectionner le fichier dll via la fenêtre Ouvrir le Fichier était assez pour le point d'Excel pour la dll, même avec uniquement le nom de fichier dans le répertoire Lib partie de la Déclarer instruction de Fonction.
Chris