Problème boucle While et conditions

Fermé
azzi33 Messages postés 5 Date d'inscription mardi 19 avril 2016 Statut Membre Dernière intervention 7 août 2018 - Modifié le 3 août 2018 à 20:21
yg_be Messages postés 22701 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 - 7 août 2018 à 19:53
Bonjour,

j'ai mis en place un programme de calcul auto qui va chercher les valeurs dans une feuille Excel, or en le testant plusieurs problèmes apparaissent :

- boucle infinie
- toujours la même valeur qui est calculée (comme si VBA calculait toujours la 1ère ligne...)


Voici mon programme :
Public Sub Qtté_Poussières()

Dim numéro As Integer
Dim CelluleTrouvée As Range
Dim lig As Integer
Dim col As Integer
Dim PoussNéc As Long
Dim i As Integer
Dim compteur As Integer

compteur = 1

For i = 1 To compteur
numéro = Cells(3 + compteur, 5)
 
Set CelluleTrouvée = Range("J3:J81").Find(numéro, lookat:=xlWhole)

    While CelluleTrouvée > 0
    compteur = compteur + 1

        If CelluleTrouvée Is Nothing Then
        MsgBox ("Problème de codage..." & i)
            Else
        lig = CelluleTrouvée.Row
        col = CelluleTrouvée.Column
        PoussNéc = Cells(lig, (col + 3))
        MsgBox "Niveau trouvé : poussière nécessaire : " & PoussNéc & ". Courage"
        Cells(3 + i, 7) = PoussNéc

        End If
    Wend
Next

End Sub



Avant, je n'avais pas mis de boucle While, et donc la boucle For allait de 1 à 100. Il fonctionnait bien. Mais je voulais étoffer mon programme pour qu'il soit davantage autonome.


D'autre part ma condition est sûrement mauvaise. J'aimerai que CelluleTrouvée soit comprise entre 1 et 40 mais je ne sais pas comment faire les intervalles.

Merci d'avance.

Bonne journée.

7 réponses

pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
6 août 2018 à 14:36
Bonjour,

D'aprés ce que je crois avoir compris du besoin, voici une proposition de codage :
Public Sub Qtté_Poussières()

Dim numéro As Integer
Dim CelluleTrouvée As Range
Dim lig As Integer
Dim col As Integer
Dim PoussNéc As Long
Dim compteur As Integer
Dim Continuer As Boolean

compteur = 1
Continuer = True

While Continuer
    numéro = Cells(3 + compteur, 5)
    Set CelluleTrouvée = Range("J3:J81").Find(numéro, lookat:=xlWhole)
    If CelluleTrouvée Is Nothing Then
        MsgBox ("Problème de codage..." & 3 + compteur)
        Continuer = False
    Else
        If CelluleTrouvée.Value >= 1 And CelluleTrouvée.Value <= 40 Then
            lig = CelluleTrouvée.Row
            col = CelluleTrouvée.Column
            PoussNéc = Cells(lig, (col + 3))
            MsgBox "Niveau trouvé : poussière nécessaire : " & PoussNéc & ". Courage"
            Cells(3 + compteur, 7) = PoussNéc
            compteur = compteur + 1
        Else
            MsgBox ("Problème de valeur..." & 3 + compteur)
            compteur = compteur + 1
        End If
    End If
Wend
End Sub


J'ai intégré le test sur les valeurs de 1 à 40 et j'ai supposé que la cellule vide était la condition d'arrêt.
A corriger si besoin
1
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 929
3 août 2018 à 18:58
Bonjour

je ne suis pas un grand spécialiste de VBA, mais tu as déclaré
Dim CelluleTrouvée As Range
et plus loin tu fais
While CelluleTrouvée > 0 
ce qui impliquerait que CelluleTrouvée soit un nombre, à mon avis, c'est là qu'il faut chercher.

Par contre, il ne faut jamais utiliser de diacritique (accents, cédille, tilde, etc...) en programmation.
Admettons que tu fournisses ton fichier à un anglophone, ça va buguer, les accents n'existant pas en Anglais.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 929
3 août 2018 à 18:59
AU fait, pour tes prochains posts, utilise la coloration syntaxique, voir ici
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
Modifié le 3 août 2018 à 19:05
Bonjour,

Sans le fichier, c'est très difficile à comprendre !

Erreur :
While CelluleTrouvée > 0
CelluleTrouvée est un objet (une cellule ou rien), il faudrait tester sa valeur, mais pas sans savoir si elle à été trouvée !

Au lieu de :
lig = CelluleTrouvée.Row
col = CelluleTrouvée.Column
PoussNéc = Cells(lig, (col + 3))
mettre :
PoussNéc = CelluleTrouvée.Offset(0,3).Value


Autre erreur :
For i = 1 To compteur
'...
compteur = compteur + 1


0
Kalissi Messages postés 218 Date d'inscription jeudi 2 mai 2013 Statut Membre Dernière intervention 15 juillet 2019 20
3 août 2018 à 19:14
Bonjour,

Suggestion : Éviter les caractères accentué dans le code.

K
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
3 août 2018 à 19:20
Bonjour K

D'où vient cette phobie ?
Je les utilise très fréquemment et je n'ai jamais eu le moindre problème !
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 929
3 août 2018 à 20:13
Je l'ai expliqué dans ma réponse
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775 > Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024
3 août 2018 à 20:35
Ce serait le cas si on pouvait écrire le code en Unicode mais c'est de l'ASCII et Le code ASCII est international.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
azzi33 Messages postés 5 Date d'inscription mardi 19 avril 2016 Statut Membre Dernière intervention 7 août 2018
4 août 2018 à 22:57
Bonsoir,

merci pour vos réponses très rapides.

Si je comprends bien, je dois faire analyser la valeur de CelluleTrouvée à l'aide d'une fonction de VBA. Je peux faire ça :
While CelluleTrouvée.Value > 0
?

Pour la 2e erreur, il faut que je mette le compteur au-dessus de la boucle For ?

Merci pour vos réponses.
Je transmettrai le programme modifié, selon vos retours.

Bonne soirée
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
5 août 2018 à 18:16
1) probablement
2) en augmentant compteur à chaque boucle, la boucle For i = 1 To compteur est infinie.

Expliques ce que ta macro devrait faire, c'est difficilement compréhensible !
0
yg_be Messages postés 22701 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
5 août 2018 à 09:58
bonjour, tu ne modifies pas la condition de la boucle (CelluleTrouvée) dans la boucle while, il me semble donc assez prévisible que la boucle soit infinie.
as-tu bien "option explicit" en début de module?
pourquoi ne pas nous présenter le programme qui fonctionnait bien? cela nous permettrait de comprendre ce que tu veux faire, difficile à deviner avec un programme sans commentaire et qui ne fonctionne pas correctement.
0
azzi33 Messages postés 5 Date d'inscription mardi 19 avril 2016 Statut Membre Dernière intervention 7 août 2018
Modifié le 7 août 2018 à 16:49
Bonjour, merci à tous pour votre aide. :)

Le programme que pilas31 propose correspond exactement à ce que j'essayais de faire. Merci énormément à toi.

Je viens de le tester, il fonctionne à merveille sauf quand le valeur vaut 39,5. Il met en application la ligne 18 du programme...

Auriez-vous une solution à ce problème ?

Cordialement

EDIT : j'ai pu résoudre ce problème en modifiant la type de la variable numéro, il était en Integer, je l'ai mis en Single et le problème est résolu.

Encore merci à tous et à pilas31.
0
yg_be Messages postés 22701 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
7 août 2018 à 19:53
parfait, peux-tu alors marquer le sujet comme résolu, via la roue dentée à droite du titre?
0