Boucle Do while et If

Résolu/Fermé
loicen73 Messages postés 32 Date d'inscription mardi 27 mars 2018 Statut Membre Dernière intervention 16 avril 2018 - 5 avril 2018 à 09:29
Pinzou76 Messages postés 609 Date d'inscription dimanche 17 septembre 2017 Statut Membre Dernière intervention 25 février 2019 - 5 avril 2018 à 15:11
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 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
5 avril 2018 à 09:46
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 mardi 27 mars 2018 Statut Membre Dernière intervention 16 avril 2018
5 avril 2018 à 14:50
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 609 Date d'inscription dimanche 17 septembre 2017 Statut Membre Dernière intervention 25 février 2019 190
Modifié le 5 avril 2018 à 15:11
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 609 Date d'inscription dimanche 17 septembre 2017 Statut Membre Dernière intervention 25 février 2019 190
5 avril 2018 à 09:36
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 lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
5 avril 2018 à 09:45
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 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775 > gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020
5 avril 2018 à 10:04
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 lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684 > Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023
5 avril 2018 à 10:26
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 mardi 27 mars 2018 Statut Membre Dernière intervention 16 avril 2018
5 avril 2018 à 09:52
Merci pour cette info
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
5 avril 2018 à 09:41
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 mardi 27 mars 2018 Statut Membre Dernière intervention 16 avril 2018
Modifié le 5 avril 2018 à 09:55
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 lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
5 avril 2018 à 10:31
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 mardi 27 mars 2018 Statut Membre Dernière intervention 16 avril 2018
5 avril 2018 à 10:45
Je voudrais que la cellule contienne du texte. Est ce "*" ?
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
5 avril 2018 à 11:10
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 mardi 27 mars 2018 Statut Membre Dernière intervention 16 avril 2018
5 avril 2018 à 11:38
Merci beaucoup. Savez vous pourquoi le code ne fonctionne pas ? D'après @gbinforme k n'évolue pas...
0