blink35
Messages postés1Date d'inscriptionmardi 14 avril 2009StatutMembreDernière intervention22 avril 2009
-
22 avril 2009 à 17:35
caronmaxime
Messages postés1Date d'inscriptionlundi 14 avril 2008StatutMembreDernière intervention12 mai 2009
-
12 mai 2009 à 00:05
Bonjour à tous,
Je bosse sur des macros qui me permettront d'automatiser une procédure, pour l'instant manuelle, dans un logiciel de CAO (SolidWorks). Je n'ai que de simples notions de programmation sous visual basic.
Depuis plusieurs jours, je n'arrive pas à trouver la solution à mon problème : j'aimerais écrire dans les cases d'une feuille excel, les caractéristiques d'un outil choisi en fonction de valeurs rentrées manuellement dans d'autres cases.
Pour l'instant j'ai 3 informations à donner : le rayon_roulant, le rayon_bout et la distance_outil. Le problème c'est que je dois parer à toute éventualité : la macro doit fonctionner s'il n'y a pas de valeur, si la valeur est 0 ou si la valeur est <> de 0. Il doit ensuite rechercher automatiquement dans un autre classeur les caractéristiques de l'outil correspondant et les écrire dans la feuille du début.
J'ai essayé plein de trucs, dans plusieurs sens : SI valeur <> 0 ALORS ... SINON ... et aussi SI valeur IS NUL ALORS ... SINON ...
Bref j'ai l'impression d'avoir fais le tour des possibilités, mais lorsque j'exécute la macro, elle reste sur "exécution en cours" ! Cela veut-il dire que je lui en demande trop ? Je lui laisse pas mal de temps mais quedal, je suis obligé de le forcer à fermer !
Par moment je chope aussi des incompatibilités de types ... Même si j'ai depuis trouvé ce que cela voulait dire, je commence à douter des mes formulations ...
Je ne vais pas poster tout mon code car j'ai déjà fais un bon pavé, mais voici un exemple de ma procédure :
caronmaxime
Messages postés1Date d'inscriptionlundi 14 avril 2008StatutMembreDernière intervention12 mai 2009 12 mai 2009 à 00:05
Salut tertous ( tertous ch'est du ch'ti ), salut blink35.
Premièrement, pour voir une "couille" dans ton code il faut se servir de l'éditeur visual basic en mode pas à pas ( ce n'est pas différent d'un programme d'automatisme ). Pour ce faire un petit clic droit en haut de la fenêtre de l'éditeur visual basic, cliques sur Personnaliser, Débogage, Cliques et glisses sur l'icône Pas à pas détaillée pour le déposer à coté de l'icône exécuter, ferme la fénêtre de dialogue Personnaliser. Clique plusieurs fois sur Pas à pas détaillée et observes la petite flêche jaune. Ce pointeur d'indique ou cela en est dans le déroulement de ton code. A ce sujet tu peux mettre des points d'arrêt ( marrons ) dans ton code en cliquant dans la colonne ou se déplace le pointeur ou taper l'instruction 'Stop' la ou tu veux dans ton code. Cela te permettra de voir si "l'aiguillage" est correct. Tu peux aussi, lors de l'éxécution stoppée, pointer dans ton code sur le nom d'une variable; l'éditeur te renverra dans une info bulle la valeur de celle-ci. Tu peux également te servir d'espion, cliquer sur un mot clé et appuyer sur F1 pour de l'aide, etc ... .
Deuxièmement, déclarer tes variables ( byte, boolean, integer, simple ou double précision, variant, objet, string ... ) serait une très bonne chose. Personnellement, les integer me plaisent à tous moins 100 c'est cent mais pas 99,999999999999 en double précision. C'est peut être la ou la "couille se trouve.
Exemple de déclaration en début de code : Dim R_bout As Integer ' valeur entière de -32000 à 32000 ( 10 puissance ?? ).
Un extrait de ton code : If rayon_bout <> "0" Then .... Si l'on veut une compatibilté des types, il faut obligatoirement que la variable 'rayon_bout' soit déclarée comme chaine de caractères ( car "0" en est une ) donc voir en début de programme la déclaration suivante :
Dim rayon_bout As String ' chaine de caractère alphanumérique
A moins que l'on est à faire à des valeurs numériques, dans ce cas on verra :
Dim rayon_bout As Integer ' entier
....
....
If rayon_bout <> 0 Then ' 0 <> Empty
et pour rester cohérent il faudra que les cellules comparées avec rayon_bout soit déclarées comme nombre ( clique droit sur la ou les cellules, format, nombre, nombre entier donc sans décimal )
Troisièmement, pour rendre plus lisible ton code et éviter trop de secrétariat, tu peux utiliser les mots clés With ........ End With :
For e68 = 1 To 8
With Decomposition_excel.Sheets(niveau_langue & " " & niveau)
If .Cells(4 + e68, 6) = gris_langue Then rayon_roulant .Cells(4 + e68, 7) : rayon_bout .Cells(4 + e68, 8) : distance_outil = .Cells(4 + e68, 9) ' .Value facultatif ?
End if
....
......
End With
Next e68
Quatrièment, la boucle 'For e68 = 1 To 8' fait appel à une base de données figée. l'intruction d'Excel 'DECALER' et 'NBVAL' te permet de définir une liste nommée et évolutive exemple 'DECALER($Listes.$C$1:$C$65536;1;0;NBVAL($Listes.$C$1:$C$65536)-1;1) sous Open Office et 'DECALER(C:C;1;0;NBVAL(C:C)-1;1)' sous Excel ( la colonne est titrée ). Pour 'déclarer' une liste tu mets un titre à ta colonne C puis quelques valeurs sous le titre. Tu cliques sur Insertion, Nom, Définir. Dans la boite de dialogue 'Définir des noms', tu tapes le nom donné à la liste et puis l'expression 'DECALER( ... )' que l'on aura pu aussi copier coller, puis ajouter. Si tu cliques à nouveau sur Insertion, Nom, Définir puis sur DECALER( ... ) alors un trait pointillé défilant entoure la liste histoire de contrôler les limites de cette liste grâce à la bonne intruction ( toujours modifiable ). Une fois les listes définies, tu peux utiliser du code tel que celui ci-dessous :
With ListBox1 .Top 45: .Left 145: .Visible = False: .Clear
End With
With Workbooks("Saisie des roulements").Worksheets("Listes")
If .[A2] = "" Then GoTo suite01 ' la liste "NomEtPrénomRemplaçants" est vide
For Each Lign In .Range("NomEtPrénomRemplaçants")
ListBox1.AddItem (Lign)
Next Lign
suite01:
End With
Pour finir ce qui serait le top autrement dit à inscrire dans une démarche industriel c'est d'avoir accés aux bases de données des dimensions de familles d'outils des fournisseurs sous excel ou même sous SolidWorks ou autre non? Bon ça c'est la prochaine étape !!