Problème boucle While et conditions

azzi33 Messages postés 7 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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
  2. Utilisateur anonyme
     
    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
  3. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    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
  4. Kalissi Messages postés 221 Statut Membre 20
     
    Bonjour,

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

    K
    0
    1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
       
      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
    2. Utilisateur anonyme
       
      Je l'ai expliqué dans ma réponse
      0
      1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784 > Utilisateur anonyme
         
        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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. azzi33 Messages postés 7 Statut Membre 1
     
    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
    1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
       
      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
  7. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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
  8. azzi33 Messages postés 7 Statut Membre 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.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      parfait, peux-tu alors marquer le sujet comme résolu, via la roue dentée à droite du titre?
      0