2010-11-17 4 views
7

J'ai été en mesure d'exécuter avec succès mon propre code .Net en suivant les étapes affichées ici Execute .NET 3.0 code from Office 2003Utilisation de bibliothèques standard .Net avec VBA

Est-il possible d'utiliser les bibliothèques standard .Net sans avoir à écrire une enveloppe ? De cette façon, nous pouvons éviter d'avoir à enregistrer et installer une DLL personnalisée dans le GAC sur la machine du client.

J'ai déjà trouvé des fichiers tlb dans les dossiers C: \ Windows \ Microsof.NET \ Framework, et j'ai pu ajouter une référence à mscorlib.dll. En regardant la documentation pour RijndaelManaged, cette classe semble être COM visible.

Je suis capable de créer une instance, mais dès que j'essaie de travailler avec elle, j'obtiens des erreurs (par exemple, "Type mismatch").

Sub Macro1() 
    Dim aesImplementation As New RijndaelManaged 

    Set key = aesImplementation.GenerateKey() 
    Set iv = aesImplementation.GenerateIV() 
End Sub 

Je suis prêt à accepter tous les hacks que vous avez à offrir!

+2

Je ne dispose pas d'une nouvelle réponse: à l'aide. NET sans wrapper, mais si vous êtes nouveau sur VBA, vous devez savoir que déclarer quelque chose comme "As New" n'instancie pas réellement quelque chose à ce point comme il le fait dans .NET. Ce n'est pas clair pour moi si votre erreur est soulevée sur l'instanciation ou sur le 'Set'. (Je suppose que vous avez déclaré votre variable 'clé' comme le type correct, etc.) Voir http://stackoverflow.com/questions/2478097/vba-difference-in-two-ways-of-declaring-a -new-object-essay-to-understand-why/2480559 # 2480559 – jtolle

+0

C'est fou Pourquoi avoir une nouvelle syntaxe valide si elle n'instancie pas un nouvel objet ?! Cela semble créer une instance dans ce cas, cependant, je me souviendrai au moins que "As New" n'est pas la meilleure pratique. La raison pour laquelle je n'ai pas déclaré explicitement l'objet clé est parce que j'obtiens l'erreur "Can not assign to array" si je le fais. Apparemment, cette erreur se produit lorsque vous essayez et affecter à un tableau d'un type différent. –

+1

N'est-ce pas beaucoup de travail pour économiser un peu de travail? Je veux dire, si votre utilisateur vous permet d'exécuter une macro, pourquoi ne pas exécuter une application .NET réelle? L'interopérabilité du bureau en .NET semble assez bonne, donc vous pouvez manipuler les documents de manière égale ou supérieure! –

Répondre

1

Pas encore possible. VBA (VB pour Applications) n'est pas VB, mais plutôt un accord séparé imitant toute la syntaxe de base en tant qu'anciennes versions de VB. C'est presque comme si vous utilisiez une version très épurée de VB plus ancien. En fait, VBScript est la plus proche de VBA. Peut-être un jour, Microsoft va construire des méthodes pour travailler directement avec le GAC, mais jusque-là (et ce jour-là signifiera probablement la mort de COM je suis sûr), vous êtes bloqué en utilisant la méthode COM CreateObject(), en ajoutant une référence à un COM bibliothèque enregistrée dans votre projet Office ou référençant directement un fichier DLL ou un fichier TLB compatible VBA/COM dans votre projet Office.

Il existe un certain nombre de bibliothèques compatibles COM dans le GAC par défaut, mais pour la plupart, vous êtes bloqué en créant d'abord un Com Callable Wrapper dans VB.Net ou C#. Inversement, à peu près toutes les applications MS Office sont appelables COM, de sorte que vous pouvez travailler avec les applications Office installées à travers les projets VB.Net tout ce que vous voulez.

+3

En ajoutant une référence à 'mscorlib.dll', vous pouvez créer un objet de n'importe quelle classe ayant un constructeur public sans paramètre dans les bibliothèques .net standard. Vous trouverez cela très limitant. – AndASM

+1

"VBScript est la plus proche de VBA" - VBA est * beaucoup * plus proche de VB6 classique que de VBScript: https://msdn.microsoft.com/fr-fr/library/ms970436.aspx – Joe

1

Vous devriez pouvoir utiliser les classes ComVisible .NET de cette manière. Cependant, les méthodes GenerateKey et GenerateIV n'ont pas de valeur de retour. Essayez:

Sub Macro1() 
    Dim aesImplementation As New RijndaelManaged 

    aesImplementation.GenerateKey 
    Key = aesImplementation.Key 
    aesImplementation.GenerateIV 
    IV = aesImplementation.IV 
End Sub 

ou mieux, notamment parce que lors du débogage, vous pouvez voir si une erreur se produit lors de la construction ou lorsque vous appelez la méthode:

Sub Macro1() 
    Dim aesImplementation As RijndaelManaged 
    Set aesImplementation = New RijndaelManaged 

    aesImplementation.GenerateKey 
    Key = aesImplementation.Key 
    aesImplementation.GenerateIV 
    IV = aesImplementation.IV 
End Sub 
Questions connexes