Bonjour à tous,
Avant toute chose je tiens à vous dire que je suis nouvel inscrit sur ce forum mais que j'ai déjà trouvé ici énormément de réponses à des problèmes que j'ai pu rencontrer lors de développements de diverses macros VBA, et que c'est bien la première fois que je ne trouve pas de sujet similaire à ce que je rencontre (ou la première fois que je cherche mal). J'espère donc que vous allez pouvoir m'aider 
Autre petite précision, je ne suis absolument pas développeur de formation. Je suis normalement plutôt rigoureux dans mes codes mais désolé par avance si je n'utilise pas les bons termes techniques.
Tout d'abord un peu de contexte:
J'ai développé une macro (complexe pour mon niveau) qui est assez longue en temps de calcul mais que j'ai déjà réussi à optimiser par rapport à mes débuts à l'aide de connaissance développeurs. Pour avoir un ordre d'idée pour traiter environ 35.000 lignes je suis passé de 1h30 à moins de 2 minutes. Maintenant j'aurais besoin d'aller encore plus loin dans l'optimisation (pour traiter au moins 5 fois plus de lignes), et une idée que j'ai eu a été de "convertir" la plupart de ma macro en fichier DLL pour accélérer le temps de traitement.
J'utilise Windows 10, Microsoft Excel 2016 (64bits) et Microsoft Visual Studio 2015 (32 bits je pense).
J'ai trouvé ici un tuto me détaillant toutes les étapes au préalable nécessaires pour rendre un fichier .dll reconnaissable par VBA:
http://www.joseouin.fr/logiciels/cre...xcel-en-vb-net
Avant de l'appliquer à mon code plus complexe que ses exemples, j'ai justement tenté de refaire ses exemples dans une feuille de calcul vide:
Côté Visual Studio le code suivant (mon Assembly name est "ClassLibrary1", surnommée "ExempledeLibrairiedeClasse"):
1 2 3 4 5 6 7
| Public Class Class1
Public Function MaNorme(ByVal x As Double, ByVal y As Double) As Double
Dim z As Double
z = (x ^ 2 + y ^ 2) ^ 0.5
Return z
End Function
End Class |
Côté VBA le code suivant:
1 2 3 4 5 6 7 8 9 10 11 12
| Public Sub test_liaison_dll()
Dim MaClasse As New ClassLibrary1.Class1
Dim x As Double
Dim y As Double
Dim z As Double
z = MaClasse.MaNorme(x, y)
Debug.Print z
End Sub |
A l'exécution, j'obtiens cette erreur:
"Erreur d'exécution 4029 - Un composant ActiveX ne peut pas créer d'objet" et VBA me surligne la ligne "z = MaClasse.MaNorme(x, y)"
Pour information j'ai bien suivi le tuto dont le lien est ci-dessus, donc toutes les coches "Make assembly COM-Visible" et "Register for COM interop" sont cochées dans Visual Studio.
Côté VBA, "ExempledeLibrairiedeClasse" apparaît bien dans les références disponibles, et la case est cochée.
Je ne trouve pas d'information sur pourquoi est-ce que VBA ne reconnaît pas ma fonction "MaNorme". Pour information lorsque je déclare la variable "MaClasse" la saisie semi-automatique me propose bien tout ce qu'il y a ensuite.
J'ai essayé de fouiller un peu plus et je suis allé dans l'explorateur d'objets de VBA:

De ce que j'en comprends VBA reconnaît bien ma classe "Class1" mais n'arrive pas à aller plus loin et voir la fonction qui est à l'intérieur.
Je sais que la compatibilité Excel 64bits/Visual Studio 32bits va me poser problème à un moment, mais il ne me semble pas que cela me donnerait ce genre de message. Dans le doute j'ai essayé de déclarer la fonction dans VBA grâce à cette commande (en ayant copié la dll dans system32
Public Declare PtrSafe Function norme Lib "ClassLibrary1.dll" Alias "Class1.MaNorme" (x As Double, y As Double) As Double
Lorsque j'essaie de lancer le Sub (en appelant bien la fonction "norme"), j'obtiens le message d'erreur suivant:
"Point d'entrée Class1.MaNorme" d'une DLL introuvable dans ClassLibrary1.dll".
Tout cela me fait penser que j'ai mal fait quelque chose côté Visual Studio, mais je ne trouve pas...
Est-ce que vous auriez des idées pour m'aider à résoudre ce problème svp ? Cela me paraît simple mais en même temps je ne trouve aucune info supplémentaire sur internet...
Merci d'avance à tous ceux qui pourront me lire et me répondre, et bonne journée.
Partager