Do while.. pour une boucle
- Messages
- 230
- Excel
- 2007
- Inscrit
- 28/10/2012
- Emploi
- coordinateur planning de production
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 !
- Messages
- 230
- Excel
- 2007
- Inscrit
- 28/10/2012
- Emploi
- coordinateur planning de production
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