[VBA] Faire un boucle dans le code

Fermé
ecnet Messages postés 5 Date d'inscription dimanche 2 juillet 2006 Statut Membre Dernière intervention 3 juillet 2006 - 2 juil. 2006 à 22:08
 ecnet - 4 juil. 2006 à 09:59
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 vendredi 28 mai 2004 Statut Membre Dernière intervention 10 janvier 2008 214
3 juil. 2006 à 14:31
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 dimanche 2 juillet 2006 Statut Membre Dernière intervention 3 juillet 2006 2
3 juil. 2006 à 17:13
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 vendredi 28 mai 2004 Statut Membre Dernière intervention 10 janvier 2008 214
2 juil. 2006 à 22:55
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 dimanche 2 juillet 2006 Statut Membre Dernière intervention 3 juillet 2006 2
3 juil. 2006 à 12:16
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 vendredi 28 mai 2004 Statut Membre Dernière intervention 10 janvier 2008 214
3 juil. 2006 à 17:24
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 dimanche 2 juillet 2006 Statut Membre Dernière intervention 3 juillet 2006 2
3 juil. 2006 à 21:33
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 vendredi 28 mai 2004 Statut Membre Dernière intervention 10 janvier 2008 214
4 juil. 2006 à 00:33
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
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