Problème boucle While et conditions

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

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    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. 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.
    2. 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


      1. Bonjour,

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

        K
        1. Bonjour K

          D'où vient cette phobie ?
          Je les utilise très fréquemment et je n'ai jamais eu le moindre problème !
        2. Je l'ai expliqué dans ma réponse
        3. @Utilisateur anonymeCe serait le cas si on pouvait écrire le code en Unicode mais c'est de l'ASCII et Le code ASCII est international.
      2. 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
        1. 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 !
      3. Contributeur
        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.
        1. 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.
          1. Contributeur
            parfait, peux-tu alors marquer le sujet comme résolu, via la roue dentée à droite du titre?