Problème boucle While et conditions
azzi33
Messages postés
7
Statut
Membre
-
yg_be Messages postés 24281 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 24281 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
- Je ne suis pas un robot confidentialité - conditions ✓ - Forum Mail
- Mise en forme conditionnelle excel plusieurs conditions - Guide
- Mon pc s'allume et s'éteint en boucle ✓ - Forum Matériel & Système
- Télé samsung s'éteint et se rallume en boucle - Forum Téléviseurs
- Xiaomi s'éteint tout seul et se rallume en boucle - 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
24281
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 585
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.