Do while.. pour une boucle

bonjour

entre mon anglais et mon niveau en vba j'ai un soucis. je voudrais modifier ma condition sur un boucle. dans partie du code ci dessous.

Est il possible d'écrire ça : Do While Cells(ligne1, 4).Value <> "4SWF" or (ou) Cells(ligne1, 4).Value <> " "

voir en créant un variable en prenant ces 2 conditions.

Sub Macro1()

Dim ligne1 As String

ligne1 = 7

'

Do While Cells(ligne1, 4).Value <> "4SWF"

'---------------------------------------------

If Cells(ligne1, 1).Value <> "" Then

Cells(ligne1, 17).Value = Cells(ligne1, 1).Value

Else

Cells(ligne1, 17).Value = Cells(ligne1 - 1, 17).Value

End If

If Cells(ligne1, 2).Value <> "" Then

Cells(ligne1, 18).Value = Cells(ligne1, 2).Value

Else

Cells(ligne1, 18).Value = Cells(ligne1 - 1, 18).Value

End If

If Cells(ligne1, 3).Value <> "" Then

Cells(ligne1, 19).Value = Cells(ligne1, 3).Value

Else

Cells(ligne1, 19).Value = Cells(ligne1 - 1, 19).Value

End If

Cells(ligne1, 20).Value = Cells(ligne1, 4).Value

Cells(ligne1, 21).Value = Cells(ligne1, 5).Value

Cells(ligne1, 22).Value = Cells(ligne1, 6).Value

Cells(ligne1, 23).Value = Cells(ligne1, 7).Value

Cells(ligne1, 24).Value = Cells(ligne1, 8).Value

Cells(ligne1, 25).Value = Cells(ligne1, 9).Value

Cells(ligne1, 26).Value = Cells(ligne1, 10).Value

Cells(ligne1, 27).Value = Cells(ligne1, 11).Value

Cells(ligne1, 28).Value = Cells(ligne1, 12).Value

Cells(ligne1, 29).Value = Cells(ligne1, 13).Value

ligne1 = ligne1 + 1

Loop

End Sub

Merci par avance pour votre aide

philippe

Bonjour

J'ai l'impression que ta condition est toujours vérifiée.

Ne te faudrait-il pas plutôt un ''And' au lieu d'un ''Or"" ?

Bye !

bonjour gmb

je veux que ma boucle se fasse tant que je ne trouve pas dans une cellule de la colonne 4 la valeur 4swf ou la cellule le à blanc .

cordialement

Philippe

Bonjour,

Une autre piste à adapter (pas testé !) mais sûrement plus rapide :

Sub Test()

    Dim Plage As Range
    Dim Cel As Range
    Dim Adr As String

    'défini la plage sur la feuille active, sur la colonne D à partir de D2
    With ActiveSheet: Set Plage = .Range(.Cells(2, 4), .Cells(.Rows.Count, 4).End(xlUp)): End With

    'recherche la valeur
    Set Cel = Plage.Find("4SWF", , xlValues, xlWhole)

    'si trouvé, boucle...
    If Not Cel Is Nothing Then

        Adr = Cel.Address

        Do

            If Cel.Offset(, -3).Value <> "" Then Cel.Offset(, 13).Value = Cel.Offset(, -3).Value Else Cel.Offset(, 13).Value = Cel.Offset(-1, 13).Value
            If Cel.Offset(, -2).Value <> "" Then Cel.Offset(, 14).Value = Cel.Offset(, -2).Value Else Cel.Offset(, 14).Value = Cel.Offset(-1, 14).Value
            If Cel.Offset(, -1).Value <> "" Then Cel.Offset(, 15).Value = Cel.Offset(, -1).Value Else Cel.Offset(, 15).Value = Cel.Offset(-1, 15).Value

            Cel.Offset(, 16).Value = Cel.Value
            Cel.Offset(, 17).Value = Cel.Offset(1).Value
            Cel.Offset(, 18).Value = Cel.Offset(2).Value
            Cel.Offset(, 19).Value = Cel.Offset(3).Value
            Cel.Offset(, 20).Value = Cel.Offset(4).Value
            Cel.Offset(, 21).Value = Cel.Offset(5).Value
            Cel.Offset(, 22).Value = Cel.Offset(6).Value
            Cel.Offset(, 23).Value = Cel.Offset(7).Value
            Cel.Offset(, 24).Value = Cel.Offset(8).Value
            Cel.Offset(, 25).Value = Cel.Offset(9).Value

            Set Cel = Plage.FindNext(Cel)

        Loop While Cel.Address <> Adr

    End If

End Sub

Bonjour Philippe,

Je te propose ce code VBA :

Option Explicit

Sub Macro1()
  Dim celX As Range, lig As Long, col As Byte: lig = 7
  Do While Not IsEmpty(Cells(lig, 4)) And Cells(lig, 4) <> "4SWF"
    For col = 1 To 3
      With Cells(lig, col)
        Set celX = .Offset(, 16)
        celX = IIf(IsEmpty(.Value), celX.Offset(-1), .Value)
      End With
    Next col
    For col = 4 To 13
      Cells(lig, 16 + col) = Cells(lig, col)
    Next col
    lig = lig + 1
  Loop
End Sub

Vérifie bien soigneusement que tu as tous les résultats attendus.

Si besoin, tu peux demander une adaptation.

Merci de me dire si ça te convient.

Cordialement,

dhany

Re,

Mon code peut être raccourci de cette façon :

Sub Test()

    Dim Plage As Range
    Dim Cel As Range
    Dim Adr As String

    'défini la plage sur la feuille active, sur la colonne D à partir de D2
    With ActiveSheet: Set Plage = .Range(.Cells(2, 4), .Cells(.Rows.Count, 4).End(xlUp)): End With

    'recherche la valeur
    Set Cel = Plage.Find("4SWF", , xlValues, xlWhole)

    'si trouvé, boucle...
    If Not Cel Is Nothing Then

        Adr = Cel.Address

        Do

            Cel.Offset(, 13).Value = IIf(Cel.Offset(, -3).Value <> "", Cel.Offset(, -3).Value, Cel.Offset(-1, 13).Value)
            Cel.Offset(, 14).Value = IIf(Cel.Offset(, -2).Value <> "", Cel.Offset(, -2).Value, Cel.Offset(-1, 14).Value)
            Cel.Offset(, 15).Value = IIf(Cel.Offset(, -1).Value <> "", Cel.Offset(, -1).Value, Cel.Offset(-1, 15).Value)

            Range(Cel.Offset(, 16), Cel.Offset(, 25)).Value = Range(Cel, Cel.Offset(9)).Value

            Set Cel = Plage.FindNext(Cel)

        Loop While Cel.Address <> Adr

    End If

End Sub
Rechercher des sujets similaires à "while boucle"