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 -
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 :
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.
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
-
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 -
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 faisWhile 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.
-
AU fait, pour tes prochains posts, utilise la coloration syntaxique, voir ici
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
-
-
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
-
Bonjour,
Suggestion : Éviter les caractères accentué dans le code.
K -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 -
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. -
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.