Vba excel: boucle for qui ne boucle pas

Fermé
jean guy - 3 févr. 2010 à 10:32
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 - 3 févr. 2010 à 14:15
Bonjour,

je débute actuellement en vba, et dois faire une macro qui récupère des données dans une suite de tableaux (fichier source) mis les uns à la suite des autres dans une feuille excel, afin de les classer dans un tableau (fichier cible)

Mon problème est que ma boucle for ne boucle pas lorsqu'elle est inséré dans le reste du code
alors que lorsque je la teste séparement, elle fonctionne bien.

Cette boucle doit récupérer un code RRF en ligne 3 du fichier source, le placer dans la ligne 2 du fichier cible, puis s'incrémenter pour aller chercher ce code RRF 2, 51 lignes plus bas dans le fichier source le placer en ligne 3 du fichier cible, et ainsi de suite, récupérer ce code RRF3, encore 51 lignes plus bas ....

Je ne comprend ce qui ne va pas. Si vous avez des idées...

Je vous remercie

Cordialement

voici mon code, sans les déclarations de variable:


'j'ouvre le fichier de consolidation (fichier cible)

ChDir "C:\Documents and Settings\p051398\Desktop\macro2"
Workbooks.Open Filename:="C:\Documents and Settings\p051398\Desktop\macro2\Consolidation PLR.xls"

'je définis ma plage de recherche dans le fichierconcatene (fichier source)
Windows("fichierconcatene.xls").Activate
Set plage = Range("A65536")

'je selectionne ma première cellule pour extraire le code RRF
m = Range("A1").End(xlUp).Row + 2
valeur = ActiveSheet.Cells(m, 1).Value
entetedefichier = Left(valeur, 62)
entetedefichierfin = Right(entetedefichier, 10)
codeRRF = Right(entetedefichierfin, 5)
Selection.Copy

'je colle le code RRF dans consolidation PLR
Windows("Consolidation PLR.xls").Activate
j = 2
Cells(j, 1).Value = codeRRF

'je selectionne les autres cellules pour extraire le code RRF
Windows("fichierconcatene.xls").Activate
For Each cellule In plage
If valeur = " " Then Exit For

m = m + 51
valeur = ActiveSheet.Cells(m, 1).Value
entetedefichier = Left(valeur, 62)
entetedefichierfin = Right(entetedefichier, 10)
codeRRF = Right(entetedefichierfin, 5)
Selection.Copy



'je colle les code RRF dans consolidation PLR
Windows("consolidation PLR.xls").Activate
n = Range("A1").End(xlUp).Row
j = n + 2
Range("A" & j).Select
Cells(j, 1).Value = codeRRF

i = i + 1

Next cellule


End sub
A voir également:

2 réponses

tompols Messages postés 1273 Date d'inscription jeudi 29 juillet 2004 Statut Contributeur Dernière intervention 25 novembre 2013 435
3 févr. 2010 à 11:19
Bonjour,
premieres reamarques :
- Set plage = Range("A65536") => tu ne sélectionne qu'une seule cellule dans ta plage, du coup ta boucle For Each cellule in plage ne s'execute qu'un seule fois....
- m = Range("A1").End(xlUp).Row + 2 => sera toujours égal à 3, Range("A1").end(xlup) renvioyant forcement 1 (tu cherches à remonter vers les haut -xlup- depuis la cellule 1)
- meme remarque que précédemment pour n = Range("A1").End(xlUp).Row / j = n + 2
- i = i + 1 => i n'est pas utilisé dans ton code.....
sui j'ai bien compris, tu recuperes la valeur de cellule en A toutes les 51 lignes dans le fichier source et tu la mets ds ton fichier cible en colonne A également ? A quelle ligne doit-on commencer dans le fichier source (3?) ? le fichier cible contient-il déjà des lignes ? Il faudrait aussi faire attention à la feuille sur laquelle tu travailles si il y en a plusieurs dans le classeur...
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
3 févr. 2010 à 14:15
Bonjour,
une approche un peu plus simple !!
Sub CopierLigne()
Dim Source As Worksheet
Dim Copie As Worksheet
Dim Lig As Long, LigStep As Long
    'initialiser la feuille source
    Set Source = Workbooks("LeNomClasseur").Sheets("NomDeLaFeuille")
    'initialiser la feuille copie
    Set Copie = Workbooks("LeNomClasseur").Sheets("NomDeLaFeuille")
    Lig = 3
    For LigStep = 3 To Source.Range("A65536").End(xlUp).Row Step 51
        Source.Rows(LigStep).Copy Copie.Rows(Lig)
        Lig = Lig + 1
    Next LigStep
End Sub

J'ai pas tester et il est possible qu'il faudra scinder la ligne
Source.Rows(LigStep).Copy Copie.Rows(Lig)

par..
Source.Rows(LigStep).Copy 
Copie.Rows(Lig).paste

A+
0