[VBA] Faire un boucle dans le code

ecnet Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
 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?
A voir également:

6 réponses

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
ecnet Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   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
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
ecnet Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
ecnet Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   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
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
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