Aller au contenu

Messages recommandés

Posté(e)

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.

Posté(e)

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

Posté(e)

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...

Posté(e)

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

Posté(e)

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...

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité