Problème macro choix de valeurs

blink35 Messages postés 1 Date d'inscription mardi 14 avril 2009 Statut Membre Dernière intervention 22 avril 2009 - 22 avril 2009 à 17:35
caronmaxime Messages postés 1 Date d'inscription lundi 14 avril 2008 Statut Membre Dernière intervention 12 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 :

For e68 = 1 To 8
            If Decomposition_excel.Sheets(niveau_langue & " " & niveau).Cells(4 + e68, 6).Value = gris_langue Then
                rayon_roulant = Decomposition_excel.Sheets(niveau_langue & " " & niveau).Cells(4 + e68, 7).Value
                rayon_bout = Decomposition_excel.Sheets(niveau_langue & " " & niveau).Cells(4 + e68, 8).Value
                distance_outil = Decomposition_excel.Sheets(niveau_langue & " " & niveau).Cells(4 + e68, 9).Value
               
                ' Cas où valeur de rayon_roulant
               
                If rayon_roulant <> 0 Then
                   
                    ' Cas où rayon_bout = 0
                   
                    If rayon_bout = "0" Then
                   
                        ' Cas où pas de valeur de distance_outil
                       
                        If distance_outil = Empty Then
                            e75 = numero_derniere_ligne_fraises_2T
                            While e76 <> 7
                                If outils_excel.Sheets("Fraises 2T").Cells(e75, 3).Value = rayon_roulant Then
                                    Decomposition_excel.Sheets(niveau_langue & " " & niveau).Cells(4 + e68, 10).Value = outils_excel.Sheets("Fraises 2T").Cells(e75, 5).Value
                                    Decomposition_excel.Sheets(niveau_langue & " " & niveau).Cells(4 + e68, 11).Value = outils_excel.Sheets("Fraises 2T").Cells(e75, 6).Value
                                    e76 = 7
                                Else
                                    e75 = numero_derniere_ligne_fraises_2T - 1
                                End If
                            Wend
                                   
                        ' Cas où valeur de distance_outil (<> 0)
                                   
                        Else
                            e75 = numero_derniere_ligne_fraises_2T
                            While e76 <> 7
                                If outils_excel.Sheets("Fraises 2T").Cells(e75, 5).Value = distance_outil Then
                                    Decomposition_excel.Sheets(niveau_langue & " " & niveau).Cells(4 + e68, 10).Value = outils_excel.Sheets("Fraises 2T").Cells(e75, 5).Value
                                    Decomposition_excel.Sheets(niveau_langue & " " & niveau).Cells(4 + e68, 11).Value = outils_excel.Sheets("Fraises 2T").Cells(e75, 6).Value
                                    e76 = 7
                                Else
                                    e75 = numero_derniere_ligne_fraises_2T - 1
                                End If
                            Wend
                        End If
                       
                    ' Cas où valeur de rayon_bout <> 0
                   
                    Else
                        If rayon_bout <> "0" Then
                       
                            ' Cas où rayon_bout = rayon_roulant
                           
                            If rayon_bout = rayon_roulant Then
                           
                                ' Cas où pas de valeur de distance_outil
                           
                                If distance_outil = Empty Then
ETC ...

Si quelqu'un voit une couille, je lui serais très reconnaissant de me la signaler.
Merci d'avance.

1 réponse

caronmaxime Messages postés 1 Date d'inscription lundi 14 avril 2008 Statut Membre Dernière intervention 12 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 !!


Bonne prog
Rejoignez-nous