Problème boucle While et conditions
azzi33
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 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.
A voir également:
- Problème boucle While et conditions
- Xiaomi s'éteint tout seul et se rallume en boucle - Forum Xiaomi
- Mise en forme conditionnelle excel plusieurs conditions - Guide
- Mon pc s'allume et s'éteint en boucle ✓ - Forum Matériel & Système
- Je ne suis pas un robot confidentialité - conditions ✓ - Forum Mail
- Problème xiaomi redmi note 8t s'allume et s'éteint vibre - Forum Xiaomi
7 réponses
Bonjour,
D'aprés ce que je crois avoir compris du besoin, voici une proposition de codage :
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
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é
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.
je ne suis pas un grand spécialiste de VBA, mais tu as déclaré
Dim CelluleTrouvée As Rangeet plus loin tu fais
While CelluleTrouvée > 0ce 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
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Bonjour,
Sans le fichier, c'est très difficile à comprendre !
Erreur :
Au lieu de :
Autre erreur :
Sans le fichier, c'est très difficile à comprendre !
Erreur :
While CelluleTrouvée > 0CelluleTrouvé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
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 :
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
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
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
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.
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.
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.