[VBA] Faire un boucle dans le code

ecnet Messages postés 5 Statut Membre -  
 ecnet -
Bonjour,

J'ai voulu créer un boucle capable de faire la même procédure pour chaque macro. Or je ne sais pas comment faire pour simplifier les choses et s'il y a des fautes de syntaxe. En effet, quand j'ai voulu exécuter la macro ci-dessous, les erreurs de compilation s'affichent: tableau attendu ou encore next sans for. Quelqu'un pourra-il voir ce qui n'allait pas dans mon code? Merci.

Mon code actuel:

Sub Macro1()

'Conversion du libellé GB en libellé FR
'
Dim vecteur_GB(1 To 6) As String
Dim vecteur_FR(1 To 6) As String
Dim j As Single

'Sheets("Base").Select
'Range("B2").Select

For j = 1 To 6
vecteur_GB(j) = Sheets("Base").Range("B2").Offset(j - 1, 0).Value
Next j

For j = 1 To 6
If vecteur_GB(j) = "Déjeuner" Then
vecteur_FR(j) = "Dîner"
ElseIf vecteur_GB(j) = "Matin" Then
vecteur_FR(j) = "Soir"
End If
Next j

For j = 1 To 6
Sheets("Base").Range("J2").Offset(j - 1).Value = vecteur_FR(j)
Next j

' Conversion des libellés CH en libellé PL

Dim vecteur_CH(1 To 6) As String
Dim vecteur_PL(1 To 6) As String
Dim k As Single

'Sheets("Base").Select
'Range("C2").Select

For k = 1 To 6
vecteur_CH(k) = Sheets("Base").Range("C2").Offset(k - 1, 0).Value
Next k

For k = 1 To 6
If vecteur_CH(k) = "AB" Then
vecteur_PL(k) = "CD"
ElseIf vecteur_CH(k) = "EF" Then
vecteur_PL(k) = "GH"
ElseIf vecteur_CH(k) = "IJ" Then
vecteur_PL(k) = "KL"
End If
Next k

For k = 1 To 6
Sheets("Base").Range("K2").Offset(k - 1).Value = vecteur_PL(k)
Next k

End Sub

Par ailleurs, si on veut remplacer les données d'une feuille sur une autre feuille, suffira-t-il de remplacer le mot "base" par le nom d'un autre onglet dans lequel contiennent les données de départ?

6 réponses

  1. Kobaya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   214
     
    voici les deux boucles fusionnées en une seule :
    Sub Macro1()
        Dim vecteur_GB(1 To 6)  As String
        Dim vecteur_FR(1 To 6)  As String
        Dim vecteur_CH(1 To 6)  As String
        Dim vecteur_PL(1 To 6)  As String
        Dim j                   As Single
        
        For j = 1 To 6
            vecteur_GB(j) = Sheets("Base").Range("B2").Offset(j - 1, 0).Value
            vecteur_CH(j) = Sheets("Base").Range("C2").Offset(j - 1, 0).Value
        Next j
        For j = 1 To 6
            Select Case vecteur_GB(j)
                Case "Déjeuner"
                    vecteur_FR(j) = "Dîner"
                Case "Matin"
                    vecteur_FR(j) = "Soir"
            End Select
            
            Select Case vecteur_CH(j)
                Case "AB"
                    vecteur_PL(j) = "CD"
                Case "EF"
                    vecteur_PL(j) = "GH"
                Case "IJ"
                    vecteur_PL(j) = "KL"
            End Select
        Next j
        For j = 1 To 6
            Sheets("Base").Range("J2").Offset(j - 1).Value = vecteur_FR(j)
            Sheets("Base").Range("K2").Offset(j - 1).Value = vecteur_PL(j)
        Next j
    End Sub
    


    Par contre, je ne comprends pas "si les conditions AB et 12 sont remplies". La valeur 12 est-elle contenue dans une variable ? Est-ce du texte (String) ou du numérique (Integer ou Byte) ?
    3
  2. ecnet Messages postés 5 Statut Membre 2
     
    Le code est devenu effectivement beaucoup plus léger d'un coup.

    Je reformule ma deuxième question autrement:

    Dans le code que tu vu pour la première fois, je prends l'exemple de "If vecteur_CH(k) = "AB" Then
    vecteur_PL(k) = "CD"
    ...

    Ce que je voulais faire maintenant, c'est de pouvoir ajouter une condition dans "If vecteur_CH = "AB" (et "GH" dans une cellule d'une autre colonne mais de la même ligne) Then
    vecteur_PL(k) = "CD"

    Quelle bon code dois-je entrer?

    Suffit-il d'ajouter comme suit: If vecteur_CH = "AB" and "GH"..., mais ça ne marche pas? ou alors il faudrait que je fais:

    For k=1 To 6
    vecteur _CH(k) = Sheets("Base").Range("C2" et "P2").Offset(k-1,0).Value
    Next k

    NB: "P2" étant cette "autre" colonne

    J'espère que tu pourras m'aider sur ce point.
    2
  3. Kobaya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   214
     
    salut ecnet,

    je n'ai eu eucun pb avec ton code.

    oui, en changeant le nom de la feuille (entre guillemets), tu pourras utiliser ton code pour une autre feuille.

    0
  4. ecnet Messages postés 5 Statut Membre 2
     
    Merci pour ton aide. J'ai réssayé mon code et effectivement, ça marche.

    J4ai pourtant encore une question qui reste en suspens, quel code dois-je ajouter si:

    If vecteur_CH(k) = "AB" and "12" Then
    vecteur_PL(k) = "CD"

    Traduction de ce que j'aimerais faire: si les conditions AB et 12 sont remplies, alors on remplacera la cellule k par CD.

    J'ai aussi une deuxième question: comment tu as pu voir dans mon code précédent, j'ai un certain nombre de macros qui font la même chose: for i=1 to 3000, etc. Comment écrire en une fois cette partie pour ne pas répéter à chaque fois lorsque'on écrit un macro?

    Merci beaucoup!
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Kobaya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   214
     
    dans ce cas, il faut créer un tableau supplémentaire (ex. vecteur_X() qui sera initialisé avec les valeurs contenues dans la colonne P), et le test doit avoir 2 comparaisons :
    If vecteur_CH(j) = "AB" and vecteur_X(j) = "GH' Then
       ...
    End If
    
    0
  7. ecnet Messages postés 5 Statut Membre 2
     
    Si je fais:

    Select Case vecteur_CH(j)
    Case "AB" and vecteur_X(j) = "GH'
    vecteur_PL(j) = "CH"
    ...
    End If

    Il y a un problème de définiton du vecteur_X(j).

    Apparemment, il faut définir le vecteur_X(j), mais comment si je reprends ton code que tu m'avais donné? Sous quelle synthaxe dans la boucle? En écrivant:
    vecteur_X(j) = Sheets("Base").Range("A2").Offset(j - 1, 0).Value, ça ne marche pas? Pourquoi?
    0
    1. Kobaya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   214
       
      Case "AB" and vecteur_X(j) = "GH' :
      ça, c'est pas possible !

      pour vecteur_X(), tu dois pouvoir le remplir comme tu remplis vecteur_PL(), non ?
      0
    2. ecnet
       
      Je précise encore alors.

      Ce que je voulais, c'est si dans la colonne nommée CH, on a "AB" et dans la colonne CD, on a "GH", alors dans la colonne PL, on a "LM". "AB", "GH" et "LM" sont à la même ligne.

      2ème question: tu sais comment lier les données de la plage E3 à G6 d'une feuille sur une autre de la plage K3 à M6?
      0