Uiliser une boucle

akyare

XLDnaute Nouveau
Bonjour,

Je débute dans la création de macro et j'espère que ma question sera comprise...

J'aimerais faire une boucle ( du genre do while ... loop) et lorsque la condition n'est plus satisfaite qu'il passe à une autre boucle avec une autre condition.

Pour mon cas, j'aimerais compléter des données du tableau1 en allant chercher les valeurs dans le tableau2.
Et comme il y a plusieurs colonnes à compléter, je voudrais lui demander de faire un vlookup pour toutes les cellules vides de la colonne E et quand il n'y a plus de cellule à compléter pour la colonne E qu'il passe à la colonne F et me fait la même chose et ainsi de suite.

voici la macro que j'ai écrite:

Range("E1").End(xlDown).Select
ActiveCell.Offset(1, 0).Select

Do While ActiveCell.Offset(0, -1).Value <> ""

ActiveCell.Formula = _
"=+VLOOKUP(RC[9],'[Sans codeblock Fichier chanse.xls]Pas dans la liste'!R9C2:R33C19,6,FALSE)"

Range("E1").End(xlDown).Select
ActiveCell.Offset(1, 0).Select

Loop


Le problème c'est que dés qu'il a fini la boucle j'ai beau ajouté une autre boucle en changeant la colonne E par F, il ne fait rien...

J'espère que je me suis fait comprendre, soyez indulgent je débute...


Merci :)
 

skoobi

XLDnaute Barbatruc
Re : Uiliser une boucle

Bonsoir akyare et bienvenue sur XLD,

tu peux raccourcir ceci:

Range("E1").End(xlDown).Select
ActiveCell.Offset(1, 0).Select

comme ça:

Range("E1").End(xlDown).Offset(1, 0).Select

Le problème c'est que dés qu'il a fini la boucle j'ai beau ajouté une autre boucle en changeant la colonne E par F, il ne fait rien...

Envoie l'autre boucle dans ce cas.
 

akyare

XLDnaute Nouveau
Re : Uiliser une boucle

Merci skoobi,

L'autre boucle que j'aimerais exécuter après qu'il en ait fini avec la 1ère est celle-ci:

Range("F1").End(xlDown).Offset(1, 0).Select

Do While ActiveCell.Offset(O, -1).Value <> ""


ActiveCell.Formula = _
"=+VLOOKUP(RC[9],'[Sans codeblock Fichier chanse.xls]Pas dans la liste'!R9C2:R33C19,5,FALSE)"



Range("F1").End(xlDown).Select
ActiveCell.Offset(1, 0).Select

Loop

Comme vous pouvez le constater il n'y que la colonne qui change, et j'aimerais faire cela pour la colonne G, H et I.
 

roro69

XLDnaute Impliqué
Re : Uiliser une boucle

Bonsoir peut etre essaye la boucle
Range("E1").End(xlDown).Select
ActiveCell.Offset(1, 0).Select

Do
ActiveCell.Offset(0, -1).Value <> ""
Loop While ActiveCell.Offset(1, 0).Select
ActiveCell.Formula = _
"=+VLOOKUP(RC[9],'[Sans codeblock Fichier chanse.xls]Pas dans la liste'!R9C2:R33C19,6,FALSE)"
 

akyare

XLDnaute Nouveau
Re : Uiliser une boucle

Bonsoir roro69,

J'ai essaié ta proposition mais ca ne va pas, j'ai une erreur de syntax en l'exécutant.

J'aimerais juste rectifier le code que je vous ai mis plus haut, voici la seconde boucle, j'ai juste oublié de changer la colonne 5 par 6

Range("F1").End(xlDown).Offset(1, 0).Select

Do While ActiveCell.Offset(O, -1).Value <> ""


ActiveCell.Formula = _
"=+VLOOKUP(RC[9],'[Sans codeblock Fichier chanse.xls]Pas dans la liste'!R9C2:R33C19,6,FALSE)"



Range("F1").End(xlDown).Select
ActiveCell.Offset(1, 0).Select

Loop
 

skoobi

XLDnaute Barbatruc
Re : Uiliser une boucle

Re,
bonsoir roro69,

je te propose ce code (si je ne me suis pas trompé) qui prend en compte les colonnes E à I et sans l'utilisation de "select" qui est inutile en VBA et qui ralentie la macro en plus.

Code:
Sub test()
For col = 5 To 9
    lig = Cells(1, col).End(xlDown).Offset(1, 0).Row
    Do While Cells(1, col).Offset(0, -1).Value <> ""
        Cells(1, col).Formula = _
        "=+VLOOKUP(RC[9],'[Sans codeblock Fichier chanse.xls]Pas dans la liste'!R9C2:R33C19,6,FALSE)"
        lig = lig + 1
    Loop
Next col
End Sub
 

akyare

XLDnaute Nouveau
Re : Uiliser une boucle

skoobi,

Ta macro tourne à l'infini, j'ai du fermer excel...

Mais je penses que je me suis mal exprimé, je vais reprendre les 2 boucles et mettre en rouge les Différences entre les 2 boucles:

la 1ère boucle

Range("E1").End(xlDown).Offset(1, 0).Select

Do While ActiveCell.Offset(O, -1).Value <> ""


ActiveCell.Formula = _
"=+VLOOKUP(RC[10],'[Sans codeblock Fichier chanse.xls]Pas dans la liste'!R9C2:R33C19,5,FALSE)"

Range("E1").End(xlDown).Select
ActiveCell.Offset(1, 0).Select

Loop

La deuxième boucle:

Range("F1").End(xlDown).Offset(1, 0).Select

Do While ActiveCell.Offset(O, -1).Value <> ""


ActiveCell.Formula = _
"=+VLOOKUP(RC[9],'[Sans codeblock Fichier chanse.xls]Pas dans la liste'!R9C2:R33C19,6,FALSE)"

Range("F1").End(xlDown).Select
ActiveCell.Offset(1, 0).Select

Loop

Ainsi de suite pour les boucles suivantes jusqu'a la colonne I.

J'espères que c'est plus clair.
 

skoobi

XLDnaute Barbatruc
Re : Uiliser une boucle

skoobi,

Ta macro tourne à l'infini, j'ai du fermer excel...

Oui je vois, essaye comme ceci:

Code:
Sub test()
For col = 5 To 9
    lig = Cells(1, col).End(xlDown).Offset(1, 0).Row
    Do While Cells([COLOR=Red][B]lig[/B][/COLOR], col).Offset(0, -1).Value <> ""
        Cells([B][COLOR=Red]lig[/COLOR][/B], col).Formula = _
        "=+VLOOKUP(RC[9],'[Sans codeblock Fichier chanse.xls]Pas dans la liste'!R9C2:R33C19,6,FALSE)"
        lig = lig + 1
    Loop
Next col
End Sub

pour forcer l'arrêt d'une macro appuie sur Ctrl+pause, désolé :(
 

akyare

XLDnaute Nouveau
Re : Uiliser une boucle

Scoobi,

Tu n'as pas à être dsl, là j'ai appris comment forcer l'arrêt d'une macro :)

Et puis je trouve sympa que tu prennes la peine de répondre et de proposer des solutions.

La macro que tu m'as proposé me complète la colonne E que la cellule soit vide ou pas, et le but est qu'elle ne complète que les cellules vides, ensuite après avoir compléter la colonne E, elle bug...

J'ai remarqué que dans la macro que tu m'as proposé , la formule est la suivante =+VLOOKUP(RC[9],'[Sans codeblock Fichier chanse.xls]Pas dans la liste'!R9C2:R33C19,6,FALSE)

Mais dans mes boucles les éléments en rouge changent et je pense que même si ta macro n'avait pas bugger, elle n'aurait pas atteint le résultat escompté.

Sur ce je vais encore y réfléchir et vous souhaite une bonne nuit.
 

skoobi

XLDnaute Barbatruc
Re : Uiliser une boucle

Bonjour,

et le but est qu'elle ne complète que les cellules vides, ensuite après avoir compléter la colonne E, elle bug...

Le mieux serait que tu envoies le fichier avec la séquence pour la formule en fonction de la colonne.
E: RC[10],....R33C19,5,FALSE
F:RC[9],....R33C19,6,FALSE
G: RC[8],....R33C19,7,FALSE ?
etc...?
 

akyare

XLDnaute Nouveau
Re : Uiliser une boucle

Bonjour,

skoobi, j'ai modifier ton code et le résultat c'est que la macro bug lorsque

Cells(1, col).End(xlDown).Offset(0, -1).Value a comme valeur #N/A (valeur sur excel je ne connais pas le code dans Vba)

voici ci-dessous la macro modifié

Sub test_cell()
For col = 6 To 8
Cells(1, col).End(xlDown).Offset(1, 0).Select

Do While Cells(1, col).End(xlDown).Offset(0, -1).Value <> ""

lig = Cells(1, col).End(xlDown).Offset(1, 0).Row

Cells(lig, col).Formula = _
"=+VLOOKUP(RC[9],'V:\SUB-DEPARTMENTS\FINANCE\bookkeeping2\Personal\Abdelkader\GSM\[Sans codeblock Fichier chanse.xls]Pas dans la liste'!R9C2:R33C19,6,FALSE)"


Loop
Next col



End Sub

Est-ce que quelqu'un a une solution pour qu'il continue la macro même si la valeur de la cellule = #N/A ?

Merci.
 

akyare

XLDnaute Nouveau
Re : Uiliser une boucle

Ci-joint, vous trouverez 2 fichiers.

Le fichier1, la feuille: fichier_original reprend le fichier tel que je le reçois chaque mois, la feuille:resultat_escompté, en rouge c'est le résultat que j'aimerais avoir grâce à la macro.

Le fichier2 c'est le fichier utilisé par vlookup.
 

Pièces jointes

  • Fichier1.xls
    21.5 KB · Affichages: 34
  • Fichier2.xls
    13.5 KB · Affichages: 36
  • Fichier1.xls
    21.5 KB · Affichages: 32
  • Fichier2.xls
    13.5 KB · Affichages: 39
  • Fichier1.xls
    21.5 KB · Affichages: 37
  • Fichier2.xls
    13.5 KB · Affichages: 40

skoobi

XLDnaute Barbatruc
Re : Uiliser une boucle

Re,

voici ce que ça donne:

Code:
Sub test()
For Each person In Range([H2], [H2].End(xlDown))
    lig = person.Row
    If person.Offset(0, -1).Value = "" Then
        For col = 3 To 7
            Cells(lig, col).FormulaLocal = _
            "=RECHERCHEV(H" & lig & ";[Fichier2.xls]Sheet1!$A$2:$H$4;" & col + 1 & ";FAUX)"
        Next
    End If
Next
End Sub
 

Statistiques des forums

Discussions
311 999
Messages
2 084 463
Membres
102 581
dernier inscrit
Michou