MacStorm Posté(e) le 20 décembre 2017 Posté(e) le 20 décembre 2017 Bonjour, Voici mon problème. J'ai plein de macro VBA à exécuter directement depuis un bouton, ou depuis une dll (VB.net).La chose serait simple si je pouvais utilisé le Lisp, mais la contrainte est de NE PAS utiliser le Lisp.Et lorsque j’exécute ces macros, je n'arrive pas à faire que la commande soit la dernière exécutée et la répéter avec la touche "Enter". Dans un bouton d'une barre d'outil j'ai par exemple essayer ceci: ^C^C^P(vl-vbarun "FichierMacro.dvb!modCommande.SelectionClasseurDocument") "Structure";^P ou encore ^C^C^P-vbarun "FichierMacro.dvb!modCommande.SelectionClasseurDocument" "Structure";^P mais après avoir utilisé le bouton, la dernière commande que la touche "Enter" execute est seulement -VBARUN sans tout le reste et ceci dans les 2 cas... Donc je me suis tourner vers le .net, et crée une dll que je charge avec un script, au démarrage.Dans ma dll j'execute les macro de cett façons Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.Runtime Public Class MesCommandeAutoCAD <CommandMethod("SelectionClasseurDocument")> Public Sub SelectionClasseurDocument() Application.DocumentManager.MdiActiveDocument.SendStringToExecute("-Vbarun ""FichierMacro.dvb!modCommande.SelectionClasseurDocument"" ", True, False, False) End Sub End Class J'avais espère que la dernière commande utilisé serai la commande de la dll, cependant il n'en est rien, c'est le même problème qu'avec un bouton. C'est à nouveau le -VBARUN en solo qui est répété lorsque l'on presse la touche "Enter". Mais je me dis: Je suis en VB.net ! Et selon tout ce que je lis ci et là, c'est très puissant. Je pourrais par exemple ajouter un bout de code pour réécrire cette liste des dernières commandes utilisés ? Ou peut-être existe-il une variable, un paramètre ? ou alors encore une autre méthode pour exécuter du VBA depuis le .net ? Et voila la raison de ce poste, je cherche, mais je n'ai pas trouvé, alors je vous demande de l'aide, ou une piste à explorer. PS: au risque de me répéter, avec le Lisp je sais le faire, mais je dois le faire sans pour des raison indépendante de moi.
(gile) Posté(e) le 20 décembre 2017 Posté(e) le 20 décembre 2017 Je suis en VB.net ! Et selon tout ce que je lis ci et là, c'est très puissant. On ne peut pas vraiment dire que tu utilises .NET dans le code que tu montres. La méthode SendStringToExecute() ne fait qu'entrer une chaîne de caractère en ligne commande pour l'exécuter (comme une macro ou un script).Tu pourrais essayer avec SendCommand(), mais je pense que le résultat sera le même. Si tu veux que la commande puisse être rappelée avec Entrée comme une commande native, il faut que tu traduises ton code VBA en .NET pour l'inclure dans la méthode décorée avec CommandMethod (tu pourras ainsi exploiter la puissance de .NET). PS: Si tu veux te lancer dans l'aventure .NET, choisis C# comme langage plutôt que VB, tu trouveras plus d'exemples (et souvent de meilleure qualité) et, de l'aveu même de Microsoft, C# continuera à évoluer quand VB devrait juste être maintenu en l'état. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
MacStorm Posté(e) le 20 décembre 2017 Auteur Posté(e) le 20 décembre 2017 On ne peut pas vraiment dire que tu utilises .NET dans le code que tu montres. La méthode SendStringToExecute() ne fait qu'entrer une chaîne de caractère en ligne commande pour l'exécuter (comme une macro ou un script).Tu pourrais essayer avec SendCommand(), mais je pense que le résultat sera le même. Si tu veux que la commande puisse être rappelée avec Entrée comme une commande native, il faut que tu traduises ton code VBA en .NET pour l'inclure dans la méthode décorée avec CommandMethod (tu pourras ainsi exploiter la puissance de .NET). PS: Si tu veux te lancer dans l'aventure .NET, choisis C# comme langage plutôt que VB, tu trouveras plus d'exemples (et souvent de meilleure qualité) et, de l'aveu même de Microsoft, C# continuera à évoluer quand VB devrait juste être maintenu en l'état. Merci pour ta réponse, mais j'ai omis de dire que ça fait un moment que j'utilise le VB.net. (trop tard pour moi de me mettre au C# :unsure: ) Mais pour le projet que je doit reprendre et le temps que j'ai devant moi, il me sera impossible de tout convertir. Surtout au vu de la taille et de la complexité du développement qui à été fait. J'avais déjà remplacer tout les boutons par des appelle direct du vba lorsque mon boss est venu pour me dire de revenir en arrière car le répéter de la touche Enter ne fonctionnais plus. Du coup je suis revenu au commande lisp... cependant avec le lisp le problème est qu'il me fait de "missmatch error"... Quand il y a un ça va, mais en fonction des commande c'est tout autocad qui plante... Explication: le lisp commence une suite d'instruction et se place en mémoire. Dans ces instruction, une macro vba est exécuté et doit s’écrire aussi en mémoire, et le vba peu aussi lance un fonction lisp, etc, etc.. et très complexe. Seulement il arrive qu'entre le lisp et le vba, ils veulent utilisé la même adresse mémoire. Ce qui provoque des erreurs et des plantage. Tout fonctionnait bien lorsque tout était en 32bit. Mais des clients sont passés au 64bit, du coup nous avons du essayer de bricolé quelque chose. C'est la raison du pourquoi pas de lisp. En résumé, et bien je suis pour tout passé en .net, mais pour l'heure je veux simplement pouvoir lancer du vba depuis du .net sans pour autant qu'il enregistre le VBARUN comme dernière commande. Par exemple, j'ai pensé que la liste des dernière commande se trouvait peut-être dans le registre, alors j'aurai crée une petit fonction pour le modifié, mais je n'ai rien trouvé. Mais peut-être autre chose qui pourrai m’éviter ces mismatch error, ce qui me ferait gagné beaucoup de temps pour me concentrer sur la conversion de toute le code vba...
(gile) Posté(e) le 20 décembre 2017 Posté(e) le 20 décembre 2017 Si le problème est dû, comme tu semble le dire, au mélange de LISP et VBA, je crains que rajouter une couche de .NET ne soit pas une très bonne idée... Néanmoins, si tu cibles des versions d'AutoCAD 2015 ou ultérieures, tu peux essayer avec la méthode Editor.Command() qui fonctionne un peu comme la fonction LISP command (non testé). <CommandMethod("SelectionClasseurDocument")> Public Sub SelectionClasseurDocument() Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor ed.Command("_Vbarun", "FichierMacro.dvb!modCommande.SelectionClasseurDocument") ed.Command("structure") End Sub Pour des versions antérieures(2011-2014) tu peux utiliser la méthode d'extension implémentée par Toni Tanzillo qui fonctionne pareil. ' Toni Tanzillo ' https://forums.autodesk.com/t5/net/send-command-executes-after-exiting-command-method/td-p/3882929 Module EditorInputExtensionMethods <System.Runtime.CompilerServices.Extension> _ Public Function Command(editor As Editor, ParamArray args As Object()) As PromptStatus If editor Is Nothing Then Throw New ArgumentNullException("editor") End If Return runCommand(editor, args) End Function Dim runCommand As Func(Of Editor, Object(), PromptStatus) = GenerateRunCommand() Private Function GenerateRunCommand() As Func(Of Editor, Object(), PromptStatus) Dim method As MethodInfo = GetType(Editor).GetMethod( _ "RunCommand", BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.[Public]) Dim instance As ParameterExpression = Expression.Parameter(GetType(Editor), "editor") Dim args As ParameterExpression = Expression.Parameter(GetType(Object()), "args") Return Expression.Lambda(Of Func(Of Editor, Object(), PromptStatus)) _ (Expression.Call(instance, method, args), instance, args).Compile() End Function End Module PS: au vu de ce que tu décris, je pense qu'il serait grandement préférable de prendre le temps pour muter ce programme en .NET. Ton boss devrait comprendre qu'il est grand temps d'abandonner le VBA. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
MacStorm Posté(e) le 20 décembre 2017 Auteur Posté(e) le 20 décembre 2017 OK merci, Je vais tester cela, et je reviendrai vous redire, mais ce sera probablement l’année prochaine, car me reste 3 jours de taff avant les vacances de fin d'année, et ces 3 derniers jours je suis en déplacement chez les clients... mais que ça fonctionne ou pas, ou si je trouve une idée de contournement, je reviendrais pour le partage et finaliser le poste...
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant