Boucle Do while et If

Résolu
loicen73 Messages postés 32 Date d'inscription   Statut Membre Dernière intervention   -  
Pinzou76 Messages postés 614 Date d'inscription   Statut Membre Dernière intervention   -
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

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