VBA Boucle Do While

Jub

XLDnaute Nouveau
Bonjour,

Je me permets de venir vers vous, suite à plusieurs semaines à tester toutes les formulations possibles pour que ça fonctionne.

Le but étant de comparer sur 2 feuilles différentes des cellules et si certaines conditions sont remplies, de remplir certaines cellules.
En gros, je dis je regarde pour la ligne iRow colonne 7 ed la feuille HAB si la cellule est vide.
si c'est le cas, je regarde la cellule de la ligne iRow colonne 3 et je regarde si elle est égale à une des cellules de la colonne 2 de la feuille Matrice Hab-For.
donc je balaye en itérant iRow2 (ligne de cette feuille).

une fois la cellule trouvée, je balaye cette ligne iRow2 et je regarde si une des cellules sur la ligne = 1, donc je balaye iCol.

une fois, la cellule trouvée, je renvoie l'intitulé de la colonne (qui se trouve donc ligne 2, iCol) dans la cellule ligne iRow colonne 7 de la feuille HAB.

et ma boucle foire complétement, elle renvoie que dalle... ou m'envoie pas le bon intiutlé ou est en mode infini (obligé de faire ECHAP).

Merci de votre aide.
Je ne sais pas si je raisonne à l'envers pour la boucle ou pas. je vous mets 2 versions de mon code.

Je desespère !

Code:
Sub Recherche_Stages()
Dim iRow As Long
Dim iRow2 As Long
Dim iCol As Long

Dim ws As Worksheet
Dim ws2 As Worksheet

Set ws = Worksheets("Matrice Hab - For")
Set ws2 = Worksheets("HAB")

iCol = 3
iRow2 = 3
iRow = 1
Do While ws.Cells(iRow2, iCol).Value <> 1
    Do While ws2.Cells(iRow, 3) <> ws.Cells(iRow2, 2).Value
        Do While ws2.Cells(iRow, 7).Value <> ""
        iRow = iRow + 1
        Loop
    iRow2 = iRow2 + 1
    Loop
iCol = iCol + 1
Loop
    

End Sub

2eme code :
Code:
Sub Recherche_Stages()
Dim iRow As Long
Dim iRow2 As Long
Dim iCol As Long

Dim ws As Worksheet
Dim ws2 As Worksheet

Set ws = Worksheets("Matrice Hab - For")
Set ws2 = Worksheets("HAB")
iRow = 1
Do While ws2.Cells(iRow, 7).Value <> ""
    iRow2 = 3
    iCol = 3
    Do While ws2.Cells(iRow, 3) <> ws.Cells(iRow2, 2).Value
       Do While ws.Cells(iRow2, iCol).Value <> 1
        iCol = iCol + 1
        Loop
        ws2.Cells(iRow, 7).Value = ws.Cells(2, iCol).Value
    iRow2 = iRow2 + 1
    Loop
iRow = iRow + 1
Loop
End Sub

encore merci pour votre expertise et de votre temps.
 

Jub

XLDnaute Nouveau
Re : VBA Boucle Do While

je mettrais un exemple quand j'aurais le temps.
ça marche, mais ça reste bloqué sur la premiere valeur, ça ne continue pas, comme si l'itération pour passer à la ligne suivante ne fonctionnait pas...

bizarre...
 

Si...

XLDnaute Barbatruc
Re : VBA Boucle Do While

Bonsoir

si tu veux utiliser la boucle Do ... Loop, essaie :
Code:
Sub Recherche_Stages()
  Dim Irow As Long
  Dim iRow2 As Long
  Dim iCol As Long

  Dim ws As Worksheet
  Dim ws2 As Worksheet

  Set ws = Worksheets("Matrice Hab - For")
  Set ws2 = Worksheets("HAB")
  [B]Do[/B]
    Irow = Irow + 1
    If Irow > 65000 Then End
  [B]Loop While ws2.Cells(Irow, 7) <> ""[/B]
  [B]Do[/B]
    iRow2 = iRow2 + 1
    If iRow2 > 65000 Then End
  [B]Loop While ws2.Cells(Irow, 3) <> ws.Cells(iRow2, 2).Value
  Do[/B]
    iCol = iCol + 1
    If iCol > 256 Then End
  [B]Loop While ws.Cells(iRow2, iCol).Value <> 1[/B]
  ws2.Cells(Irow, 7) = ws.Cells(2, iCol)
End Sub

Tu peux mélanger :
Code:
Sub Recherche_Stages()
  Dim L As Long
  Dim R As Range, Un As Range  'plages de recherche
  Do
    L = L + 1
  Loop Until Sheets("HAB").Cells(L, 7) = ""
  With Sheets("Matrice Hab - For")
    Set R = .[B:B].Find(Cells(L, 3))
    If Not R Is Nothing Then
      Set Un = .Rows(R.Row).Find(1)
      If Not Un Is Nothing Then Sheets("HAB").Cells(L, 7).Value = .Cells(2, Un.Column)
    End If
  End With
End Sub
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : VBA Boucle Do While

Salut Jub et le forum
Quant à ta proposition, Garfael, il me t systématiquement le "PAs de valeur" et en rouge pour la cellule précédent la cellule vide.
Comme je l'ai dit, je n'ai pas testé.
Un fichier d'essais est facile à faire : mais si c'est les dépanneurs ça peut correspondre ou pas au fichier original (Murphy nous prévenant que se sera vraisemblablement le "ou pas" qui l'emportera.

On a besoin de quoi :
Première feuille : 4/5 lignes dont les colonnes C et G ont des valeurs
Deuxièmefeuille : 4/5 lignes comportant une valeur en B, un 1 dans la ligne et 3 ou 4 titres en ligne 2

Un fichier d'essai est toujours fourni par le demandeur : il n'y a que lui qui connaît les problèmes à solutionner. Si je fais un fichier, il correspondra à la réponse demandée, forcément.
A+
 

Jub

XLDnaute Nouveau
Re : VBA Boucle Do While

Bonjour,
merci pour vos réponses.
Voici donc le fichier en exemple.

j'ai mis le résultat qu'on devrait obtenir en colonne 7 de l'onglet HAB.
je souhaite que la boucle tourne jusqu'à ce que la colonne de la ligne X, colonne 2 de l'onglet HAB n'est pas vide.

je vous en parle maintenant, car ça peut orienter le code.
Il est vraisemblable que sur une meme ligne il y ait plusieurs 1, comment est il possible de renvoyer le titre de chacune des colonnes dont les cellules sont concernés ?

Merci d'avance.
J'apprends bcp avec vous !
 

Pièces jointes

  • Exemple pour boucle_Jub.xls
    14.5 KB · Affichages: 87

Robert

XLDnaute Barbatruc
Repose en paix
Re : VBA Boucle Do While

Bonjour le fil, bonjour el forum,

Je pensais qu'il y avait des données au départ dans la colonne G avec parfois des trous à remplir. Mais d'après ton exemple la colonne est vide. Donc voici ci-dessous mon code modifié qui ne tient plus compte de la dernière ligne éditée de la colonne G pour savoir le nombre de cellules à remplir mais de la dernière ligne éditée de la colonne C.
Pour ta deuxième question (plusieurs 1 dans la ligne), comment mettre dans une seule cellule le contenu éventuel de plusieurs cellules ? À la suite ? Avec une séparation (tiret, slash) ? Je pourrais me pencher sur le code quand tu seras plus précis...

Sinon pour en revenir aux remarques de plusieurs personnes sur ton post... Tu pouvais pas le faire avant ton p... de fichier exemple !!! Au lieu d'invoquer un soi-disant professionnalisme qui nous a fait perdre tant de temps...

Code:
Sub Macro1()
Dim oo As Worksheet 'déclare la variable oo (Onglet Origine)
Dim oc As Worksheet 'déclare la variable oc (Onglet Cible)
Dim cel1 As Range 'déclare la variable cel1 (CELlule 1)
Dim cel2 As Range 'déclare la variable cel2 (CELlule 2)
Dim r As Range 'déclare la variable r (Recherhe)
Dim li As Long 'déclare la variable li (Ligne)
 
Set oo = Worksheets("HAB") 'définit l'onglet origine
Set oc = Worksheets("Matrice Hab - For") 'définit l'onglet cible
 
'boucle 1 : sur toute les cellules éditées cel1 de la colonne 7 de l'onglet "HAB" (en partant de la seconde)
For Each cel1 In oo.Range("G2:G" & oo.Range("[COLOR=red]C[/COLOR]65536").End(xlUp).Row)
    If cel1 = "" Then 'condition 1 : si la cellule est vide
        'définit la rechereche r (recherche la valeur de la cellule correspondante de la colonne C dans la colonne 2 de l'onglet "Matrice Hab - For")
        Set r = oc.Columns(2).Find(cel1.Offset(0, -4), , xlValues, xlWhole)
        If Not r Is Nothing Then li = r.Row 'condition : si il existe au moins une occurrence trouvée, définit la ligne li
        For Each cel2 In oc.Rows(li).Cells 'boucle 2 : sur toute les cellules de la ligne li de l'onglet "Matrice Hab - For"
            If cel2.Value = 1 Then 'condition 2 : 'si la valeur de la cellule cel2 est égale à 1
                cel1.Value = oc.Cells(2, cel2.Column) 'place en cel1 l'intitulé de la colonne de cel2
                Exit For 'sort de la boucle 2
            End If 'fin de la condition 2
        Next cel2 'prochaine cellule de la boucle 2
    End If 'fin de la condition 1
Next cel1 'prochaine cellule de la boucle 1
End Sub
 
Dernière édition:

Jub

XLDnaute Nouveau
Re : VBA Boucle Do While

Bonjour,

Robert, pas besoin de s'exciter, je pensais que mon explication était claire. j'ai jamais parlé de trous a remplir. Bref.

je vous mets mon code qui fonctionne, ça peut tjrs aider.
de plus il recherche aussi les autres 1 de la ligne concernée dans l'onglet Matrice Hab-For

Merci de votre aide. Je vais d'ailleurs ouvrir un autre sujet car je ne sais absolument pas comment m'y prendre pour le coup. et je vais mettre un fichier d'exemple !

Code:
Sub Recherche_Stages2()

Dim F1 As Worksheet
Dim F2 As Worksheet
Dim j, k, l, m, o, p As Double
Dim nom, code, code2, code3, code4 As String

j = 2
k = 2
l = 3
m = 3
Set F2 = Worksheets("Matrice Hab - For")
Set F1 = Worksheets("HAB")

F1.Activate
While Cells(j, 2).Value <> ""
    j = j + 1
Wend

For k = 2 To j
    
    code = ""
    code2 = ""
    code3 = ""
    code4 = ""
        nom = Cells(k, 3).Value
        F2.Activate
        For l = 3 To 89
        
            If Cells(l, 2).Value = nom Then
                For m = 3 To 40
                    If Cells(l, m).Value = 1 Then
                        If code = "" Then
                            code = Cells(2, m).Value
                        Else
                            If code2 = "" Then
                                code2 = Cells(2, m).Value
                            Else
                                If code3 = "" Then
                                    code3 = Cells(2, m).Value
                                Else
                                    code4 = Cells(2, m).Value
                                End If
                            End If
                        End If
                    Cells(l, m).Value = 2
                    End If
                Next m
            End If
        Next l
        
        F1.Activate
        Cells(k, 7).Value = code
        Cells(k, 9).Value = code2
        Cells(k, 11).Value = code3
        Cells(k, 13).Value = code4
F2.Activate
o = 3
p = 3
For o = 3 To 50
    For p = 3 To 100
        If Cells(p, o).Value = 2 Then
            Cells(p, o).Value = 1
        End If
    Next p
Next o
F1.Activate
    
Next k
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : VBA Boucle Do While

Bonjour le fil, bonjour le forum,

Robert, pas besoin de s'exciter.
Ben si la peine, la preuve tu as enfin compris qu'il fallait mettre une pièce jointe... Tu sais, on ne compte plus le nombre de fois où les gens disent : "mon fichier est trop lourd" ou "je ne peux pas le mettre pour des raisons de confidentialité". Finalement c'est surtout par flemme de reproduire un fichier exemple. Avec la même structure et une poignée de données qui nous permettent de comprendre et de répondre rapidement et efficacement à leur problème. Au lieu de ça le post s'éternise avec des réponses qui ne conviennent pas... Et c'est vrai ça m'énerve un peu et le fait de le dire en secouant un peu les gens ça leur fait prendre conscience (et ça me fait passer aussi pour un casse-c... mais c'est pas grave j'en suis un de toute manière).
je pensais que mon explication était claire. j'ai jamais parlé de trous a remplir. Bref.
Ha alors relis ton tout premier post...
En gros, je dis je regarde pour la ligne iRow colonne 7 ed la feuille HAB si la cellule est vide.
Pour moi, si signifie que ce n'est pas une obligation... mais comme tu le dis : Bref ! L'essentiel c'est que ton problème soit résolu et que tu saches comment procéder les prochaines fois.
 

Gorfael

XLDnaute Barbatruc
Re : VBA Boucle Do While

Salut Robert et le forum
Au lieu de ça le post s'éternise avec des réponses qui ne conviennent pas... Et c'est vrai ça m'énerve un peu et le fait de le dire en secouant un peu les gens ça leur fait prendre conscience (et ça me fait passer aussi pour un casse-c... mais c'est pas grave j'en suis un de toute manière).
Ça fait du bien de voir qu'on n'est pas un cas unique :), je commençai à douter de moi et de ma "bonne volonté"...
Surtout quand après avoir galéré à résoudre un problème, c'est pour s'apercevoir que le fichier de test ne correspond en rien au fichier réel...
A+
 

Statistiques des forums

Discussions
312 682
Messages
2 090 866
Membres
104 680
dernier inscrit
AvPi26