Google+

Macros : les bases ...

Apprendre à programmer avec le VBA

Modérateurs: xavierb, annwn

Macros : les bases ...

Messagepar annwn » Mar 24 Juil 2012 13:19

PREFACE
Bonjour à tous

Voici un topic à but pédagogique. Comme je ne sais pas quel niveau possède chacun de vous, je vais essayer d'expliquer le plus simplement possible les macros et leurs secrets (enfin certains de leurs secrets !).
Vous m'arrêtez si un point n'est pas compris. Je ne suis pas prof. alors je vais faire de mon mieux pour structurer le "dossier".
Ce dossier sera donc en 4 parties (4 topics) pour pas se noyer sous les infos:
[1] les bases
[2] la recherche de nouvelles fonctions
[3] l'interface graphique
[4] lien avec autre logiciel (type Excel)

PS : ceux qui connaissent bien les macros peuvent sans problème m'indiquer quand je m'égare ou quand c'est faux !
PS' : je commence aujourd'hui mais je ferais cela en plusieurs fois pour que cela ne soit pas indigeste et aussi parce que j'ai une famille et un boulot ...;)
Programmer, c'est bien; programmer utile, c'est mieux ...
Avatar de l’utilisateur
annwn
Maestro
 
Messages: 938
Inscription: Dim 1 Juil 2012 18:40
Localisation: Lyon
Version de SolidWorks et SP: SW 2012 SP 5.0

Share On:

Partagez sur Facebook Facebook Partagez sur Twitter Twitter

Re: Macros : les bases ...

Messagepar annwn » Mar 24 Juil 2012 13:40

Allons-y !
La macro SW fait partie intégrante de SW, c'est à dire (cad) qu'elle ne peut être démarrée que quand SW est ouvert !
L'extension du fichier correspondant à la macro (code + interface graphique) est .SWP
Mais on peut importer/exporter des .FRM (formulaires ou interfaces graphiques) et des .BAS (lignes code)

Comment démarrer une macro à partir de rien ?

Dans SW faire Outils / Macro / Nouvelle... . Vous lui donner un nom...
Cela vous ouvre une nouvelle fenêtre Visual basic. Y'a déjà des chose de marquer :
Image
Par exemple: sub main() ->c'est le début du programme; par déduction End Sub [/]en est la fin !! ;)
main pour programme [i]principal
(Mais on pourrait l'appeler "SOLIDAGORA" ou "TOTO" ;) par contre pas d'espace remplacez- les par un sous-tiret ->touche 8 du clavier central, à gauche du "ç")
Dim swApp As Object est un dimensionnement de variable; cad que l'on va l'utiliser plus tard dans la macro. En l'occurrence, c'est pour dire qu'on va utiliser SW.
Cette variable appartient au Sub main. On peut d'ailleurs l'intégrer au sub main
Et pour être encore plus réglo, il faudrait mettre Dim swApp As SldWorks.SldWorks[i]
pour ce faire, copier coller la ligne [i]Dim swApp As Object
après la ligne sub main(); puis mettez votre curseur en fin de ligne après Object. Supprimer tous les caractères jusqu'au "s" de As. Taper un espace et là :shock: apparait une liste de ce que vous pouvez écrire...
Taper "sl" et vous pouvez valider en tapant sur la touche Tab à gauche sur votre clavier.
NOTA: Pour ceux qui sont allés trop vite et qui ont validé par la touche Entrer, c'est pas grave vous êtes juste aller à la ligne. Revener donc à la fin de la ligne qu'on était en train d'écrire... :lol:
Taper donc ensuite un "." (point !). vous avez à nouveau la liste. un "sl" puis Tab
Vous devez obtenir :
Syntax: [ Download ] [ Hide ]
Using Visual Basic Syntax Highlighting
Sub main()

Dim swApp As SldWorks.SldWorks

Set swApp = Application.SldWorks

End Sub
Parsed in 0.002 seconds, using GeSHi 1.0.8.10


Set swApp = Application.SldWorks
Avec cette ligne on ouvre les hostilités; ça y est la macro sait qu'on va travailler dans SW ! 8-)
C'est un peu long comme début mais j'ai essayé de bien expliquer pour comprendre la philosophie de la chose ! :roll:

Enregistrer votre macro en cliquant sur le carré plein bleu (Initialiser) puis la disquette (Enregistrer)
Initialiser vous permettra plus tard de sortir du mode de déboguage !
Si vous avez déjà fermé Visual basic voire SW, il faut avoir SW de réouvert et faire Outils / Macro / Editer et choisir la votre. :)
Pour faire vos premières lignes de commande, on afficher le nom du document ouvert dans SW.
Sous la ligne Dim swApp As SldWorks.SldWorks, écrivez Dim swModel as SldWorks.ModelDoc2
Sous la ligne Set swApp = Application.SldWorks, écrivez Set swModel = swApp.ActiveDoc
Là on a dimensionné une variable "swModel" et on lui a désigné le document actif dans SW !

NOTA: ne vous préoccupez pas trop des espaces ni des majuscules sauf quand on dimensionne les variables. Si vous écriver dim TOTO as string[i] puis tapez Entrer
vous aurez le "D" majuscule et le "S" de string en majuscule. Par contre TOTO restera en majuscule car c'est là qu'on détermine la variable exacte
Ensuite si vous tapez [i]toto = "Bonjour"
puis Entrer, "toto" deviendra "TOTO"

Tapez ensuite après la ligne Set swModel = swApp.ActiveDoc:
MsgBox "Bonjour, le document actif est :" & vbCr & swModel.GetPathName
Vous obtiendrez :
Syntax: [ Download ] [ Hide ]
Using Visual Basic Syntax Highlighting
Sub main()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2  

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

MsgBox  "Bonjour, le document actif est :" & vbCr & swModel.GetPathName

End Sub
Parsed in 0.002 seconds, using GeSHi 1.0.8.10


Pour essayer votre macro, assurez-vous d'avoir un document (pièce, assemblage ou MEP) d'ouvert dans SW. Enregistrez votre macro. Puis cliquez sur le triangle plein bleu (Exécuter)
Programmer, c'est bien; programmer utile, c'est mieux ...
Avatar de l’utilisateur
annwn
Maestro
 
Messages: 938
Inscription: Dim 1 Juil 2012 18:40
Localisation: Lyon
Version de SolidWorks et SP: SW 2012 SP 5.0

Re: Macros : les bases ...

Messagepar annwn » Mar 24 Juil 2012 13:49

On a parlé des variables. Elles peuvent être de différents type :
string (chaine de caractères)
integer (un nombre entier)
boolean (vrai ou faux)
variant (sorte de tableau à 1 colonne)
...etc
il vaut mieux les utiliser à bon escient. Comme par exemple un integer quand il s'agit d'incrémenter un nombre pour un boucle.
Syntax: [ Download ] [ Hide ]
Using Visual Basic Syntax Highlighting
Dim i as Integer
For i=0 to 10
'-->ligne pour une opération quelconque
next i
Parsed in 0.002 seconds, using GeSHi 1.0.8.10


Reprenons la macro précédente, nous aurions pu aussi taper ceci:
Syntax: [ Download ] [ Hide ]
Using Visual Basic Syntax Highlighting
Option Explicit
Sub main()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim montexte As String

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

montexte = "Bonjour, le document actif est :" & vbCr & swModel.GetPathName
MsgBox montexte

End Sub
Parsed in 0.002 seconds, using GeSHi 1.0.8.10


le Option Explicit exige la déclaration explicite des variables. donc nous indique par un message d'erreur qu'une variable n'a pas été correctement déclarée (dimensionnée)

Cad ceci ne marchera pas
Syntax: [ Download ] [ Hide ]
Using Visual Basic Syntax Highlighting
Dim i as string
For i = 0 to 10
Next i
Parsed in 0.002 seconds, using GeSHi 1.0.8.10


Bon allons plus loin avec notre macro. Nous avons obtenu le chemin complet de notre document actif. Mais comment faire pour n'avoir que le nom du fichier (sans son chemin, ni l'extension).
Je vais vous décevoir mais il n'y a pas de ligne de commande qui vous le donnera comme ça ! :?
Alors nous allons travailler le string qui nous est renvoyé par le GetPathName.
On va le couper en prenant l'antislach "\" pour séparateur.Puis en enlevant les 7 derniers caractères du string intermédiaire.
Ecrivez ceci dans votre macro.
Syntax: [ Download ] [ Hide ]
Using Visual Basic Syntax Highlighting
Option Explicit
Sub main()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim monTexte As String, Interm As String, monTab As Variant

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

monTab = Split(swModel.GetPathName, "\", -1)
Interm = monTab(UBound(monTab))
monTexte = Mid(Interm, 1, Len(Interm) - 7)
monTexte = "Bonjour, le document actif est :" & vbCr & monTexte
MsgBox monTexte

End Sub
Parsed in 0.003 seconds, using GeSHi 1.0.8.10

Voilà essayez votre macro ! Admirez votre beau travail :D

PS : Donnez des noms assez explicites et courts pour vos variables. C'est plus pratique et moins long a taper ;)


Quelques précisions tout de même ! :|
UBound(monTab) donne un chiffre qui correspond au nombre de parties de mon Variant monTab
Donc quand j'écris Interm = monTab(UBound(monTab)) , je mets dans mon string Interm la chaine de caractère qui correspond à la dernière partie de mon tableau...donc mon nom de fichier avec l'extension.
Ensuite pour faire sauter l'extention j'utilise Mid qui me renvoie une chaine de caractère (un string !) commençant au caractère n°1 et de longueur :la longueur de mon string -7 caractères (qui correspondent au point plus les 6 lettre d'extension ) ;)

Mid est une fonction issu de Visual basic et non de SW ! Il y en a d'autres pour "manipuler" les strings (dans l'aide de Visual basic tapez mid lcase et vous aurez 2 articles vous les expliquant très bien, en tout cas mieux que moi par écrit !).

VbCr est aussi issu de Visual basic, c'est un "code qui permet d'aller à la ligne dans un string.
Programmer, c'est bien; programmer utile, c'est mieux ...
Avatar de l’utilisateur
annwn
Maestro
 
Messages: 938
Inscription: Dim 1 Juil 2012 18:40
Localisation: Lyon
Version de SolidWorks et SP: SW 2012 SP 5.0

Re: Macros : les bases ...

Messagepar annwn » Mar 24 Juil 2012 13:49

Avec ça vous êtes déjà capable de faire beaucoup de chose. Si, si...

Imaginons que vos fichiers pièce soient enregistrés de cette manière : 1000_10_01 Axe butée.
Avec seulement le nom du fichier vous pouvez enregistrer 4 variables que vous pourrez ensuite réutiliser dans vos MEP par l'intermédiaire de Propriétés personnalisées.
Dans l'ordre, vous mettez dans un string nom du fichier comme nous venons de le faire.
Ensuite vous couper à nouveau ce string en 2 par le 1er espace.
Puis vous coupez en 3 la première partie du résultat précédent par les sous-tirets
Ainsi vous obtenez votre n° machine, n° poste, n° pièce et sa désignation.
Ce qui donne :
Syntax: [ Download ] [ Hide ]
Using Visual Basic Syntax Highlighting
Option Explicit
Sub main()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim monTexte As String, Interm As String, monTab As Variant
Dim monTab2 As Variant, monTab3 As Variant

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

monTab = Split(swModel.GetPathName, "\", -1)
Interm = monTab(UBound(monTab))
monTexte = Mid(Interm, 1, Len(Interm) - 7)
monTab2 = Split(monTexte, " ", 2)
monTab3 = Split(monTab2(0), "_", 3)
monTexte = "N° machine : " & monTab3(0) & vbCr & "N° poste   : " & monTab3(1) & vbCr & "N° pièce : " & monTab3(2) & vbCr & "Désignation : " & monTab2(1)
MsgBox monTexte

End Sub
Parsed in 0.004 seconds, using GeSHi 1.0.8.10


ATTENTION: cela implique que tous vos dessinateurs enregistrent de la même façon les fichiers, pour pouvoir lancer la macro dessus ! Rigueur, rigueur quand tu nous tiens ... ;)

Voilà, il ne reste plus qu'à les "insérer" dans des propriétés personnalisées qui elles sont enregistrées avec le fichier SW.
Par soucis de "propreté" du code et de "faut que ça marche à tous les coups" :P , il est préférable de supprimer la propriétés personnalisée qui pourrait déjà exister ! Et seulement après écrire la nouvelle.
En effet, l'API ne sait pas écrire par dessus. Après cela permet aussi de ne pas faire de bêtises si on doit créer la propriété personnalisée seulement si elle est vide. Comme par exemple une date de création de MEP...
pour le code ça pourrait donner ça
Syntax: [ Download ] [ Hide ]
Using Visual Basic Syntax Highlighting
Option Explicit
Sub main()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim monTexte As String, Interm As String, monTab As Variant
Dim monTab2 As Variant, monTab3 As Variant
Dim myBool As Boolean

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

monTab = Split(swModel.GetPathName, "\", -1)
Interm = monTab(UBound(monTab))
monTexte = Mid(Interm, 1, Len(Interm) - 7)
monTab2 = Split(monTexte, " ", 2)
monTab3 = Split(monTab2(0), "_", 3)

myBool = swModel.DeleteCustomInfo2("", "Nmachine")
myBool = swModel.DeleteCustomInfo2("", "Nposte")
myBool = swModel.DeleteCustomInfo2("", "Nposte")
myBool = swModel.DeleteCustomInfo2("", "Description")

If monTab3(0) <> "" Then
    myBool = swModel.AddCustomInfo3("", "Nmachine", 30, monTab3(0))
End If
If monTab3(1) <> "" Then myBool = swModel.AddCustomInfo3("", "Nposte", 30, monTab3(1))
If monTab3(2) <> "" Then myBool = swModel.AddCustomInfo3("", "Npiece", 30, monTab3(2))
If monTab2(1) <> "" Then myBool = swModel.AddCustomInfo3("", "Description", 30, monTab2(1))

monTexte = "Propriétés écrites dans le fichier ..."
MsgBox monTexte

End Sub
Parsed in 0.006 seconds, using GeSHi 1.0.8.10

Astuce: Quand vous taperez vous même vos codes, n'oubliez pas de vous vérifier à chaque étape du code avec un msgbox d'une variable String.

Autre astuce : au lieu d'une boite de dialogue msgbox on peut utiliser :
Syntax: [ Download ] [ Hide ]
Using Visual Basic Syntax Highlighting
Debug.Print swModel.GetPathName
Parsed in 0.001 seconds, using GeSHi 1.0.8.10


Par contre il faut regarder le résultat dans une fenêtre Exécution qui apparait quand on tape CTRL G ou avec le menu Affichage / Fenêtre exécution
Programmer, c'est bien; programmer utile, c'est mieux ...
Avatar de l’utilisateur
annwn
Maestro
 
Messages: 938
Inscription: Dim 1 Juil 2012 18:40
Localisation: Lyon
Version de SolidWorks et SP: SW 2012 SP 5.0

Re: Macros : les bases ...

Messagepar annwn » Mar 24 Juil 2012 13:49

Petite parenthèse sur les décalage des départs de ligne.

En effet les départs décalés servent à la lisibilité du code.
Pour ceci sélectionnez la ligne en entier (soit en surlignant soit en cliquant à gauche de la ligne : la flèche du curseur doit se symétriser !) et appuyez sur la touche TAB autant de fois que vous voulez de décalages.

A l'inverse si vous voulez réduire le décalage sélectionnez de nouveau la ligne entière et appuyez sur la combinaison SHIFT + TAB.


Autre conseil : quand vos codes sont long, prenez le temps de mettre des commentaires (en bout de ligne par exemple).
ça permet de se repérer facilement et rapidement dans un programme
Pour cela taper sur l'apostrophe du clavier (les codeurs appellent ça une "cote" :) ) touche 4 du clavier principal réglé en minuscules.
Le commentaire apparait en vert ...

exemple:
Syntax: [ Download ] [ Hide ]
Using Visual Basic Syntax Highlighting
Sub Main ()
myBool = swModel.DeleteCustomInfo2("", "Nmachine")  '-->Suppression des propriétés perso.
End Sub
Parsed in 0.002 seconds, using GeSHi 1.0.8.10
Programmer, c'est bien; programmer utile, c'est mieux ...
Avatar de l’utilisateur
annwn
Maestro
 
Messages: 938
Inscription: Dim 1 Juil 2012 18:40
Localisation: Lyon
Version de SolidWorks et SP: SW 2012 SP 5.0

Re: Macros : les bases ...

Messagepar annwn » Mar 24 Juil 2012 13:49

Pour finir les bases et pour être un peu autonome sur les macros, il reste à voir les variables publiques.
Bien sur il n'y a pas que ça : les fonctions, ... et bien d'autres encore... que vous découvrirez par vous même !

Donc jusqu'à présent nos variables étaient dimensionnées pour le Sub dans lequel elles étaient écrites.
Mais quand on veut prendre des infos définies dans le Sub (partie Module) et les utiliser dans une interface graphique (Partie Userform), il faut des variables publiques.
On les déclare en début de programme avant le Sub (question pratique !)
Syntax: [ Download ] [ Hide ]
Using Visual Basic Syntax Highlighting
Option Explicit

Public myNoMac As String, myNoPos As String,, unAss As Boolean
Public myMat As String,PBTest As Integer, CutAnglais As Variant

Sub Main()
      'lignes de code
End Sub
Parsed in 0.002 seconds, using GeSHi 1.0.8.10

On les utilise de la même manière que d'autres variables dans le Sub.
Et quand on est dans le code de l'interface graphique, on les réutilise tout aussi simplement.
Bon je sens que l'on trépigne d'impatience pour aborder les interfaces graphiques (ou boites de dialogue). Je crois qu'il est temps de s'y mettre.

Pour conclure cette petite ;) explication sur les bases des macros, je voulais vous dire que tout ce que je sais, je l'ai appris sur les tas, donc qu'il y a peut-être (surement ) des interprétations hasardeuses ou pas très juste...
Mais dans l'ensemble, quand on fait des macros, on doit souvent la tester et re-tester avant d'avoir le résultat attendu !
Alors patience, acharnement, et volonté du résultat sont les maitre-mots de la réussite.

Bonne poursuite...
Programmer, c'est bien; programmer utile, c'est mieux ...
Avatar de l’utilisateur
annwn
Maestro
 
Messages: 938
Inscription: Dim 1 Juil 2012 18:40
Localisation: Lyon
Version de SolidWorks et SP: SW 2012 SP 5.0

Re: Macros : les bases ...

Messagepar annwn » Jeu 26 Juil 2012 12:45

Réservé ... là ça devrait suffire ;)
Programmer, c'est bien; programmer utile, c'est mieux ...
Avatar de l’utilisateur
annwn
Maestro
 
Messages: 938
Inscription: Dim 1 Juil 2012 18:40
Localisation: Lyon
Version de SolidWorks et SP: SW 2012 SP 5.0

Re: Macros : les bases ...

Messagepar Pierro » Mar 31 Juil 2012 14:21

C'est excellent ! :D
Je trouve tout dont j'ai besoin... merci ;)
Bienvenue sur SolidAgora -> Pensez à aller vous présenter ici
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Avatar de l’utilisateur
Pierro
Grand sage
 
Messages: 1549
Inscription: Mer 4 Juil 2012 09:24
Localisation: en Flandre
Version de SolidWorks et SP: SW 2020 SP2.0 x64

Re: Macros : les bases ...

Messagepar 8wd » Ven 3 Aoû 2012 09:15

Woo, c'est complet, et propre avec ça !! :D
" Plus j'apprends plus je m'aperçois que je ne sais pas " (Galilée)
Avatar de l’utilisateur
8wd
Citoyen
 
Messages: 61
Inscription: Mer 25 Juil 2012 13:35
Localisation: Marseille
Version de SolidWorks et SP: SolidWorks 2011 SP5

Re: Macros : les bases ...

Messagepar fneves » Ven 3 Aoû 2012 11:24

Cool, partir avec de bonnes bases c'est toujours important :P
Le bonheur c'est le voyage, pas la destination.
Avatar de l’utilisateur
fneves
Maestro
 
Messages: 675
Inscription: Ven 27 Juil 2012 09:57
Localisation: Val d'oise (95)
Version de SolidWorks et SP: SolidWorks 2012 SP2.0

Re: Macros : les bases ...

Messagepar domdom » Ven 3 Aoû 2012 11:38

Toujours aussi bon travail, Annwn... :shock:
Avatar de l’utilisateur
domdom
Citoyen
 
Messages: 50
Inscription: Ven 3 Aoû 2012 08:52
Version de SolidWorks et SP: SolidWorks 2010 SP4..0


Retourner vers Apprentissage

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités

cron