Boucle Do while et If

Résolu
loicen73 Messages postés 33 Statut Membre -  
Pinzou76 Messages postés 750 Statut Membre -
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. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    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. loicen73 Messages postés 33 Statut Membre
       
      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. Pinzou76 Messages postés 750 Statut Membre 192
       
      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. Pinzou76 Messages postés 750 Statut Membre 192
     
    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. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
       
      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
      1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783 > gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Bonjour 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
      2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744 > Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention  
         
        Bonjour 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
    2. loicen73 Messages postés 33 Statut Membre
       
      Merci pour cette info
      0
  3. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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. loicen73 Messages postés 33 Statut Membre
       
      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. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
       
      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. loicen73 Messages postés 33 Statut Membre
       
      Je voudrais que la cellule contienne du texte. Est ce "*" ?
      0
    4. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
       
      Pour tester si la cellule contient du texte :
          Do While TypeName(.Cells(k, 2).Value) = "String"
      0
    5. loicen73 Messages postés 33 Statut Membre
       
      Merci beaucoup. Savez vous pourquoi le code ne fonctionne pas ? D'après @gbinforme k n'évolue pas...
      0