Boucle Do while et If

Résolu
Bonjour,

J'ai besoin de votre aide car mon code ne fonctionne pas. Il s'exécute mais rien ne s'écrit dans les cellules. Merci beaucoup

Sub bouclewhile2()

Dim k As Currency
k = 27

Do While Workbooks("Test boucles pour tronçons1.xlsm").Sheets("Bouclage").Cells(k, 2) Like " "

If Workbooks("Test boucles pour tronçons1.xlsm").Sheets("Bouclage").Cells(k, 3) = 1 Then
Workbooks("Test boucles pour tronçons1.xlsm").Sheets("Bouclage").Cells(k, 4) = Workbooks("Test boucles pour tronçons1.xlsm").Sheets("ECS").Cells(55, 2 * k - 50)
Else
Workbooks("Test boucles pour tronçons1.xlsm").Sheets("Bouclage").Cells(k, 4) = Workbooks("Test boucles pour tronçons1.xlsm").Sheets("ECS").Cells(55, 2 * k - 51)
End If

Loop

End Sub

3 réponses

  1. Bonjour,

    Il manque l'incrémentation de k !!!!

    Sub bouclewhile2()
    Dim k As Currency
    k = 27
      With Workbooks("Test boucles pour tronçons1.xlsm").Sheets("Bouclage")
        Do While .Cells(k, 2).Value Like " "
          If .Cells(k, 3).Value = 1 Then
            .Cells(k, 4).Value = .Cells(55, 2 * k - 50).Value
          Else
            .Cells(k, 4).Value = .Cells(55, 2 * k - 51).Value
          End If
          k = k + 1
        Loop
      End With
    End Sub
    1
    1. Je pensais que l'incrémentation par pas de 1 était automatique, je dois confondre avec la boucle For qui me semble fonctionne ainsi. Merci beaucoup !
      0
    2. L'incrémentation de la boucle FOR n'est pas exactement automatique;
      il faut quand même la définir dans la déclaration de la boucle.
      En vba, par défaut si vous ne la déclarez pas, elle est de 1 par défaut.

      Ainsi
      For i = 0 To 10

      fonctionnera quand même et fera exactement la même chose que
      For i = 0 To 10 Step 1

      Et si vous voulez compter de 3 en 3:
      For i = 0 To 10 Step 3

      Step correspond à l'incrémentation effectuée à chaque tour de boucle.
      Dans d'autres langages (ex: C++), vous devrez toujours déclarer le pas, même s'il est égal à 1.
      0
  2. Contributeur
    Bonjour,

    Déjà tu peux simplier ton code ainsi pour une lecture plus agréable et moins d'erreur de saisies
    Sub bouclewhile2()
    
    Dim k As Currency
    k = 27
    With Workbooks("Test boucles pour tronçons1.xlsm").Sheets("Bouclage")
        Do While .Cells(k, 2) Like " "
    
            If .Cells(k, 3) = 1 Then
                .Cells(k, 4) = .Cells(55, 2 * k - 50)
            Else
                .Cells(k, 4) = .Cells(55, 2 * k - 51)
            End If
    
        Loop
    End With
    End Sub
    

    Cependant il ne va pas mieux fonctionner car ton 'k' n'évolue pas et comme l'on n'en connais pas la finalité c'est difficile d'interpréter. Apparemment 27 est une valeur mais tu l'utilises comme un n° de ligne.
    0
    1. Bonjour,

      Merci pour cette simplification. En revanche je souhaite récupérer des valeurs de la feuille ECS pour les retranscrire dans la feuille Bouclage (le classeur reste le même).

      En effet k est le numéro de la ligne. J'aimerais qu'il varie par pas de 1 jusqu'à ce qu'il y ait du texte dans la colonne B. Je pensais que cette variation par pas de 1 se réalisait automatiquement...
      Pouvez vous me dire la procédure à suivre ?

      Merci beaucoup
      0
    2. Contributeur
      RE

      Attention à ton test
       Do While .Cells(k, 2) Like " "

      car il attend une cellule avec espace si tu veux une cellule vide c'est
       Do While .Cells(k, 2) = ""
      0
    3. Je voudrais que la cellule contienne du texte. Est ce "*" ?
      0
    4. Pour tester si la cellule contient du texte :
          Do While TypeName(.Cells(k, 2).Value) = "String"
      0
    5. Merci beaucoup. Savez vous pourquoi le code ne fonctionne pas ? D'après @gbinforme k n'évolue pas...
      0
  3. Bonjour, il me semble que la syntaxe pour affecter/récupérer la valeur d'une cellule est
    Cells(i,j).Value

    et non pas simplement
    Cells(i,j)

    Bonne journée
    0
    1. Contributeur
      Bonjour Pinzou76,

      Tu as tout à fait raison mais comme '.value' est la propriété par défaut cela fonctionne "malheureusement" sans la préciser.
      0
    2. Merci pour cette info
      0
    3. @gbinformeBonjour gb,

      Entièrement d'accord avec le "malheureusement" !
      Il est toujours préférable de préciser la propriété utilisée.

      Depuis très longtemps, certains affirment que parfois, Excel utiliserait .Text au lieu de .Valeur.
      Je n'ai jamais vu d'exemple qui le mette en évidence. En connaitrais-tu ???

      Cordialement
      Patrice
      0
    4. Contributeur
      @Patrice33740Bonjour Patrice,
      certains affirment que parfois, Excel utiliserait .Text
      Je ne t'apprendrais rien mais il ne faut pas se fier à ceux qui croient avoir découvert des failles qui souvent n'existent pas et sont dues à d'autres causes. Par contre je considère qu'en précisant la propriété utilisée, comme le suggérait Pinzou76, l'on n'a pas de surprise.
      Bonne journée
      0