VBA Problème de boucle

Résolu
onra -  
 onra -
Bonjour,

J'essaye de faire un code me permetant de chercher dans une colonne un mot: "Lot1". Et quand il me trouve "Lot1" il copie des cellules de la meme ligne vers une feuille 3.
Le truc, c'est que dans la colonne "Lot", il y a plusieurs lot dans un ordre aléatoire. El il faut ressortir les cellules associés à Lot 1 à chaque fois qu'il tombe dessus.

Mon code marche presque . Il lit bien Lot 1 à chaque fois qu'il passe dessus, mais il ne copie pas les cellules vers ma feuille 3.
Alors a mon avis soit il ne copie pas , soit il n'arrive pas à se décaler vers la première ligne vide... A voir.

Je vous laisse mon code:

Ligne = 2
i = 3
Do Until Worksheets("Bdd").Cells(Ligne, 4).Value = ""
If Worksheets("Bdd").Cells(Ligne, 4).Value = "Lot1" Then
While (Worksheets(3).Cells(i, 1).Value = "")
Worksheets(3).Cells(i, 1) = Worksheets(1).Cells(Ligne, 5)
Worksheets(3).Cells(i, 2) = Worksheets(1).Cells(Ligne, 6)
Wend
Else
End If
Ligne = Ligne + 1
MsgBox (Ligne)
Loop
Columns("A:L").EntireColumn.AutoFit

End Sub
Configuration: Windows 2000
Internet Explorer 6.0

8 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    Quel est le but de While (Worksheets(3).Cells(i, 1).Value = "") ?
    0
    1. onra
       
      C'est la boucle qui me permet de copier les valeurs des cellules sur la première ligne vide de la feuille 3
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > onra
       
      Je propose de supprimer les lignes while et wend
      0
    3. onra > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Le problème si je fait ca , c qu'il ne cherchera pas la première ligne vide pour copier et copira sur la même ligne que la où il l'a trouver le mot chercher
      0
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > onra
       
      tu devrais sans doute donc faire :

      While (Worksheets(3).Cells(i, 1).Value = "")
      i = i+1
      wend
      Worksheets(3).Cells(i, 1) = Worksheets(1).Cells(Ligne, 5)
      Worksheets(3).Cells(i, 2) = Worksheets(1).Cells(Ligne, 6)
      0
    5. onra > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      J'ai essayé, mais ca ne change rien....

      Donc toujours pas de solution

      Merci quand meme
      0
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    si tu cherches la première cellule vide ce n'est pas : While (Worksheets(3).Cells(i, 1).Value = "") qu'il faut faire mais
    While Worksheets(3).Cells(i, 1).Value <> "" ... ici tu incrémentes bien i à chaque ligne non vide trouvée et tu sors du While à la première cellule vide trouvée.

    ;o)
    0
    1. onra
       
      Merci beaucoup, c'est nettement mieux - en tout cas ca me redonne espoir.
      Donc avec cette boucle ca me eprmet de copeir sur la première ligne vide.
      Mais le problème c'est que c'est une boucle infinie
      et au lieu de me copier toutes les lignes qui comporte le Lot 1 ca me copie seulement la première ligne indéfiniment.

      Je cherche toujours..............
      0
      1. onra > onra
         
        je vous remet le code entier, peut être y a t'il certaines erreurs que je n'ai pas vu:

        Ligne = 1
        i = 1
        Do Until Worksheets("Bdd").Cells(Ligne, 4).Value = ""
        If Worksheets("Bdd").Cells(Ligne, 4) = "Lot1" Then
        While Worksheets(3).Cells(i, 1).Value <> ""
        Worksheets(3).Cells(i + 1, 1) = Worksheets(1).Cells(Ligne, 5)
        Worksheets(3).Cells(i + 1, 2) = Worksheets(1).Cells(Ligne, 6)
        MsgBox ("i" & i)
        Wend
        i = i + 1
        End If
        Ligne = Ligne + 1
        MsgBox ("ligne" & Ligne)
        Loop
        Columns("A:L").EntireColumn.AutoFit
        0
  3. Polux31 Messages postés 7219 Statut Membre 1 204
     
    re

    Essaies comme ça:
    Ligne = 1 
    i = 1 
    While Worksheets("Bdd").Cells(Ligne, 4).Value <> "" 
       If Worksheets("Bdd").Cells(Ligne, 4) = "Lot1" Then 
          While Worksheets(3).Cells(i, 1).Value <> "" 
             Worksheets(3).Cells(i + 1, 1) = Worksheets(1).Cells(Ligne, 5) 
             Worksheets(3).Cells(i + 1, 2) = Worksheets(1).Cells(Ligne, 6) 
             'MsgBox ("i" & i)
          i = i + 1
          Wend 
       End If 
    Ligne = Ligne + 1 
    'MsgBox ("ligne" & Ligne) 
    Wend


    et dis ce que ça donne...

    ;o)
    0
    1. onra
       
      Ca m'enmerde de te dire ca, mais.... c'est pas encore ca.
      Quand je test ta boucle ca me copie indéfiniement la première ligne comportent le lot1 de la feuille 1 vers la feuille 3.

      Alors le premier probleme , c'est que c'est une boucle infinie

      Je vais donc aussi essayé de réespliquer ce dont j'ai besoin

      J'ai une feuille1 avec un tableau dont une colonne comporte une série de lot
      Par exemple: Lot1
      Lot2
      Lot5
      Lot8
      Lot1
      Lot3
      A ces cellule sont associées d'autre cellules avec certaines valeurs définissant ces lots

      Mon but est de trier ce tableau, en prenant toutes les valeurs associées à un lot (lot1 par exemple) pour les copier lignes par ligne dans un aure tableau feuille3

      Voila pour les explications....


      Maintenant, je comprend vraiement pas pourquoi cette boucle ne fonctionne pas
      0
  4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    et ceci ?

    Ligne = 1
    i = 1
    While Worksheets("Bdd").Cells(Ligne, 4).Value <> ""
    If Worksheets("Bdd").Cells(Ligne, 4) = "Lot1" Then
    Worksheets(3).Cells(i + 1, 1) = Worksheets(1).Cells(Ligne, 5)
    Worksheets(3).Cells(i + 1, 2) = Worksheets(1).Cells(Ligne, 6)
    'MsgBox ("i" & i)
    i = i + 1
    End If
    Ligne = Ligne + 1
    'MsgBox ("ligne" & Ligne)
    Wend
    0
    1. onra
       
      Oui je suis d'accord ca serait plus simple, mais pour mon tableau ce n'est pas possible.
      La petite boucle while au mileu me permet de chercher la première ligne vide du tableau de la feuille 3 et c'est indispensable.
      En fait elle a un peu la meme fonction que la première boucle while, qui engendre l'action demandée tant que le code ne rencontre pas une cellule vide.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Polux31 Messages postés 7219 Statut Membre 1 204
     
    re

    Ligne = 1 
    i = 1 
    While Worksheets("Bdd").Cells(Ligne, 4).Value <> "" 
       If Worksheets("Bdd").Cells(Ligne, 4) = "Lot1" Then 
          While Worksheets(3).Cells(i, 1).Value <> "" 
             i = i + 1
          wend
             Worksheets(3).Cells(i + 1, 1) = Worksheets(1).Cells(Ligne, 5) 
             Worksheets(3).Cells(i + 1, 2) = Worksheets(1).Cells(Ligne, 6) 
             'MsgBox ("i" & i)
       End If 
    Ligne = Ligne + 1 
    'MsgBox ("ligne" & Ligne) 
    Wend


    pitete comme ça
    0
  7. onra
     
    mais je suis sur ne piste.
    Je vous tiens au courant!!!!
    0
    1. Polux31 Messages postés 7219 Statut Membre 1 204
       
      j'ai fait un test et ça marche avec le bout de code ci dessus

      ;o)
      0
      1. onra > Polux31 Messages postés 7219 Statut Membre
         
        Oui, ca marche...ou presque.
        Ca me copie bien tout comme il faut: a chaque fois qu'il passe sur lot 1 il copie ls cellules associées.
        Le problème c'est que ca copie toujours sur la meme ligne.

        En tout cas merci, pour ton aide, c'est cool
        0
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > onra
         
        Ligne = 1
        i = 1
        While Worksheets("Bdd").Cells(Ligne, 4).Value <> ""
        If Worksheets("Bdd").Cells(Ligne, 4) = "Lot1" Then
        While Worksheets(3).Cells(i, 1).Value <> ""
        i = i + 1
        wend
        Worksheets(3).Cells(i + 1, 1) = Worksheets(1).Cells(Ligne, 5)
        Worksheets(3).Cells(i + 1, 2) = Worksheets(1).Cells(Ligne, 6)
        'MsgBox ("i" & i)
        i=i+1
        End If
        Ligne = Ligne + 1
        'MsgBox ("ligne" & Ligne)
        Wend
        0
  8. onra
     
    en fait le truc c'est que i ne s'incrémente pas: il reste à i=3
    0
    1. onra
       
      Ca y est!!!! enfin Merci à vous deux le dernier code est le bon.

      Je vous remercie beaucoup pour votre aide. Je vais pouvoir avancer un peu....

      Certainement à bientôt pour plein d'autre questions que j'aurais à vous poser.

      Et bon Week End à vous
      0
  9. Polux31 Messages postés 7219 Statut Membre 1 204
     
    ok j'ai compris, tu copies sur la ligne vide trouvée + 1 :
    Worksheets(3).Cells(i + 1, 1) = Worksheets(1).Cells(Ligne, 5)

    est-ce normal ?

    Si oui, alors rajoute après :
    ligne = ligne + 1
    i = 1

    ;o)

    EDIT: il ne faut pas que tu ais des lignes vides dans worksheets(3) à partir de la première ligne renseignée jusqu'à la dernière ligne rensignée.
    0