[Résolu] Boucle qui ne fonctionne pas

DonBeuBeu

XLDnaute Junior
Salut à tous!

J'ai un petit souci sur une boucle:

Do While M <> N = True

Les lettres M et N ont pour valeur: N=0 (au début), et M soit 1 soit 4 (fixe), la lettre N va venir être incrémenté en fin de programme de +1 et je veux que lorsque N=M il passe à autre chose... Or là la boucle ne s'active pas et le programme saute la boucle directement... j'pige pas ^^'

Merci d'avance ;)
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : [VBA] Boucle qui ne fonctionne pas

Bonjour
Enlevez le "= True"
Il aurait été complètement absurde, même si la priorité des opérateurs avait été telle que vous le pensiez.
Mettez vous bien dans la tête qu'une comparaison constitue en elle même une expression de type Boolean.
L'expression M <> N vaut soit True soit False. Elle n'est pas seulement utilisable dans un If: vous pouvez aussi l'affecter à une variable déclarée As Boolean. Inversement vous pouvez utiliser une telle variable comme condition dans un If, il n'y a pas lieu d'utiliser d'opérateur de comparaison avec.
Car il est toujours absurde de comparer une expression Boolean à True, parce que ça vaut toujours exactement la même chose que l'expression elle même !
(True = True) vaut True, et
(False = True) vaut False, donc
((M <> N) = True) vaut (M <> N) tout simplement. Et là en plus il évaluait
(M <> (N = True)) (pour que vous compreniez pourquoi ça ne marchait pas)
Un Boolean est converti en numérique quand il est comparé à un numérique. False donne 0 et True donne -1 !
Cordialement.
 
Dernière édition:

DonBeuBeu

XLDnaute Junior
Re : [VBA] Boucle qui ne fonctionne pas

Re!

Merci pour vos réponse... Mais sa ne marche pas =\ Le fichier pèse 9 Mo j'vais vous mettre le code entier au fur et à mesure:

Pas important

Sub bilan_machine_1()
'sub qui sert dans userform2

'**** Mise en page du graphique *******************************************************************************

'Si le mois est composé de 4 semaines rajoutez les 4 lignes ci-dessous (sans le ' )en fin de mois, l'enlever si mois de 5 semaines
'Range("H3").Select
'ActiveCell.ClearContents
'ActiveCell.Offset(A, 0).Select
'Range(ActiveCell, ActiveCell.Offset(1,0)).ClearContents

'Définition numéro de semaine
X = Range("CK52").Value

Début de la boucle + programme à répéter tant que la condition n'est pas vérifier
(La variable A est défini autre part ;) )

'Boucle globale bilan
Do While B <> N

Select Case X

Case 1 To 5

'Définition du nom du mois
M = "JANVIER"

'Recopie les mois en haut du suivi ro îlot machines
Range("BR30:BV30").Copy
Range("C3").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

'Insertion des valeurs depuis le tableau de droite vers le tableau SUIVI RO îlot machines
Range("M3").Select
ActiveCell.Offset(A, 1).Select
Range(ActiveCell, ActiveCell.Offset(1, 4)).Copy
Range("D3").Select
ActiveCell.Offset(A, 0).PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

'Si 4 semaines dans le mois, suppression de la cinquème semaine



Case 6 To 9

M = "FEVRIER"

Range("BR31:BV31").Copy
Range("C3").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("M3").Select
ActiveCell.Offset(A, 6).Select
Range(ActiveCell, ActiveCell.Offset(1, 4)).Copy
Range("D3").Select
ActiveCell.Offset(A, 0).PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("H3").Select
ActiveCell.ClearContents
ActiveCell.Offset(A, 0).Select
Range(ActiveCell, ActiveCell.Offset(1, 0)).ClearContents


Case 10 To 13

M = "MARS"

Range("BR32:BV32").Copy
Range("C3").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("M3").Select
ActiveCell.Offset(A, 10).Select
Range(ActiveCell, ActiveCell.Offset(1, 4)).Copy
Range("D3").Select
ActiveCell.Offset(A, 0).PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("H3").Select
ActiveCell.ClearContents
ActiveCell.Offset(A, 0).Select
Range(ActiveCell, ActiveCell.Offset(1, 0)).ClearContents


Case 14 To 17

M = "AVRIL"

Range("BR33:BV33").Copy
Range("C3").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("M3").Select
ActiveCell.Offset(A, 14).Select
Range(ActiveCell, ActiveCell.Offset(1, 4)).Copy
Range("D3").Select
ActiveCell.Offset(A, 0).PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("H3").Select
ActiveCell.ClearContents
ActiveCell.Offset(A, 0).Select
Range(ActiveCell, ActiveCell.Offset(1, 0)).ClearContents


Case 18 To 22

M = "MAI"

Range("BR34:BV34").Copy
Range("C3").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("M3").Select
ActiveCell.Offset(A, 18).Select
Range(ActiveCell, ActiveCell.Offset(1, 4)).Copy
Range("D3").Select
ActiveCell.Offset(A, 0).PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False


Case 23 To 26

M = "JUIN"

Range("BR35:BV35").Copy
Range("C3").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("M3").Select
ActiveCell.Offset(A, 23).Select
Range(ActiveCell, ActiveCell.Offset(1, 4)).Copy
Range("D3").Select
ActiveCell.Offset(A, 0).PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("H3").Select
ActiveCell.ClearContents
ActiveCell.Offset(A, 0).Select
Range(ActiveCell, ActiveCell.Offset(1, 0)).ClearContents


Case 27 To 31

M = "JUILLET"

Range("BR36:BV36").Copy
Range("C3").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("M3").Select
ActiveCell.Offset(A, 27).Select
Range(ActiveCell, ActiveCell.Offset(1, 4)).Copy
Range("D3").Select
ActiveCell.Offset(A, 0).PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("H3").Select
ActiveCell.ClearContents
ActiveCell.Offset(A, 0).Select
Range(ActiveCell, ActiveCell.Offset(1, 0)).ClearContents


Case 32 To 35

M = "AOUT"

Range("BR37:BV37").Copy
Range("C3").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("M3").Select
ActiveCell.Offset(A, 32).Select
Range(ActiveCell, ActiveCell.Offset(1, 4)).Copy
Range("D3").Select
ActiveCell.Offset(A, 0).PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False


Case 36 To 39

M = "SEPTEMBRE"

Range("BR38:BV38").Copy
Range("C3").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("M3").Select
ActiveCell.Offset(A, 36).Select
Range(ActiveCell, ActiveCell.Offset(1, 4)).Copy
Range("D3").Select
ActiveCell.Offset(A, 0).PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("H3").Select
ActiveCell.ClearContents
ActiveCell.Offset(A, 0).Select
Range(ActiveCell, ActiveCell.Offset(1, 0)).ClearContents


Case 40 To 44

M = "OCTOBRE"

Range("BR39:BV39").Copy
Range("C3").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("M3").Select
ActiveCell.Offset(A, 40).Select
Range(ActiveCell, ActiveCell.Offset(1, 4)).Copy
Range("D3").Select
ActiveCell.Offset(A, 0).PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False


Case 45 To 48

M = "NOVEMBRE"

Range("BR40:BV34").Copy
Range("C3").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("M3").Select
ActiveCell.Offset(A, 45).Select
Range(ActiveCell, ActiveCell.Offset(1, 4)).Copy
Range("D3").Select
ActiveCell.Offset(A, 0).PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("H3").Select
ActiveCell.ClearContents
ActiveCell.Offset(A, 0).Select
Range(ActiveCell, ActiveCell.Offset(1, 0)).ClearContents


Case 49 To 52

M = "DECEMBRE"

Range("BR41:BV41").Copy
Range("C3").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("M3").Select
ActiveCell.Offset(A, 49).Select
Range(ActiveCell, ActiveCell.Offset(1, 4)).Copy
Range("D3").Select
ActiveCell.Offset(A, 0).PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Range("H3").Select
ActiveCell.ClearContents
ActiveCell.Offset(A, 0).Select
Range(ActiveCell, ActiveCell.Offset(1, 0)).ClearContents


End Select

'Incrément coordonées
A = A + 5

'Incrément compteur
N = N + 1

Loop

La fin est intéressante avec l'incrément des coordonées (A) et du N

Puis une 2 ème partie qui ne concerne pas mon problème... Pour l'instant ^^'

'Nom mois
Range("CK53").Value = M

'If pour ne pas faire de bilan ilot si bilan par machine et inversement
If Range("CF45") = "" Then

'Pour suivi hebdo RO pour l'ilot entier
'Pour retrouver la semaine en cours
Range("N3").Select
Do While ActiveCell.Value <> X = True
ActiveCell.Offset(0, 1).Select
Loop

'Pour suivi hebdo RO pour l'ilot
'RO ilot réalisé, pour le feu tricolore
Range("CQ61").Value = ActiveCell.Offset(A, 0).Value
'RO ilot réalisé S-1, pour la tendance
Range("CQ63").Value = ActiveCell.Offset(A, -1).Value
'RO ilot objectif
Range("D3").Select
Do While ActiveCell.Value <> X = True
ActiveCell.Offset(0, 1).Select
Loop
Range("CQ62").Value = ActiveCell.Offset(A + 3, 0).Value

'Suppressin des valeurs du petit tableau hebdo pour empêcher la construction de graphique hebdo par machine
Range("CA46:CE48").ClearContents
Range("CQ61:CQ63").ClearContents

Else:
'Pour se remettre sur les bonnes coordonnées
A = A - 5

'Pour retrouver la semaine en cours
Range("N3").Select
Do While ActiveCell.Value <> X = True
ActiveCell.Offset(0, 1).Select
Loop

'Pour suivi hebdo RO par machine
'RO machine réalisé, pour le feu tricolore
Range("CQ58").Value = ActiveCell.Offset(A + 2, 0).Value
'RO machine réalisé S-1, pour la tendance
Range("CQ60").Value = ActiveCell.Offset(A + 2, -1).Value
'RO machine objectif
Range("D3").Select
Do While ActiveCell.Value <> X = True
ActiveCell.Offset(0, 1).Select
Loop
Range("CQ59").Value = ActiveCell.Offset(A + 3, 0).Value

Range("D3").Select
ActiveCell.Offset(A, 0).Select
Range(ActiveCell, ActiveCell.Offset(2, 4)).Copy
Range("CA46").PasteSpecial _
Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

End If

End Sub


En amont de ce programme une userbox dont voici le programme:
(La partie "Introduction des IF" est particulièrement importante...)

Private Sub CommandButton1_Click()

Dim X As Byte
X = TextBox1.Value

Range("CK52") = X

If X > 53 Then
MsgBox "cette année 2009 ne compte que 53 semaines"

Else:
Select Case X
Case 1, 6, 10, 14, 18, 23, 27, 31, 36, 40, 45, 49
Range("CP57").Value = Range("I24").Value
End Select

'********************************************************************************************
'***** introduction des if **************************************************************
'********************************************************************************************
If machine1.Value = True Then
Range("CF45") = "ABC BOL"
A = 1
N = 0
B = 1
Run ("bilan_machine_1")
Unload UserForm2
'********************************************************************************************
ElseIf machine2.Value = True Then
Range("CF45") = "G160"
A = 6
N = 0
B = 1
Run ("bilan_machine_1")
Unload UserForm2
'********************************************************************************************
ElseIf machine3.Value = True Then
Range("CF45") = "G200a"
A = 11
N = 0
B = 1
Run ("bilan_machine_1")
Unload UserForm2
'********************************************************************************************
ElseIf machine4.Value = True Then
Range("CF45") = "G200b"
A = 16
N = 0
B = 1
Run ("bilan_machine_1")
Unload UserForm2
'********************************************************************************************
ElseIf ilotméca2.Value = True Then
Range("CF45").ClearContents
A = 1
N = 0
B = 4
Run ("bilan_machine_1")
Unload UserForm2
'********************************************************************************************
Else: MsgBox ("Sélectionnez au moins une machine!")

End If

End If

End Sub

Private Sub Frame1_Click()

End Sub

Private Sub ilotméca2_Click()

End Sub

Private Sub machine1_Click()

End Sub

Private Sub machine4_Click()

End Sub

Private Sub TextBox1_Change()

End Sub

Private Sub UserForm_Click()

End Sub

Voilà vous savez tout! Je coince toujours autant surtout que j'avais testé ce genre de boucle sur des petits programmes et sa marchait parfaitement bien (y compris en rajoutant le "= True" à la fin)
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : [VBA] Boucle qui ne fonctionne pas

Mettez un point d'arrêt sur le Do While et des espions sur M, sur N et sur M <> N, qu'est ce que vous voulez que je vous dise
ou juste avant le Do While un MsgBox "M = " & M &vblf & "N = " & N & vblf & "M <> N = " & (M <> N)
 

DonBeuBeu

XLDnaute Junior
Re : [VBA] Boucle qui ne fonctionne pas

J'ai changé les M en B, je me suis rendu compte que j'utilisais 2 fois M pour 2 choses différentes...

Le MsgBox c'est pas trop possible, en ce qui concerne les espions et points d'arrêts je ne vois de quoi tu parle sorry =\
 

Orodreth

XLDnaute Impliqué
Re : [VBA] Boucle qui ne fonctionne pas

Re,

Dans VBE, quand tu es dans ton code, si tu sélectionnes une variable, le menu contextuel (clic droit de la souris) t'offre la possibilité d'ajouter un espion.

L'espion s'affiche dans une fenêtre qui te permet, en débogage, et donc en éxécution pas à pas, de savoir où en est la valeur de ta variable à tout instant dans ta procédure.
Très pratique.

Petit conseil: nomme tes variables correctement. A, B, M, N, ça va 5 minutes, mais quand tu veux faire un code propre et maintenable, il vaut mieux préférer des variables au nom explicite.
On s'y retrouve beaucoup plus facilement, et ça évite le problème que tu viens d'avoir.
 

DonBeuBeu

XLDnaute Junior
Re : [VBA] Boucle qui ne fonctionne pas

J'ai renommé mes variables, le soucis n'a pas l'air de venir de la... Petite question est-ce que les variables dans la userform sont conservés lorsque je passe sur le module?

Sans titre.jpg

Je vais tenter d'alléger le fichier et de l'envoyer...

Merci pour votre aide!

Edit: Fichier allégé joint ;)
 

Pièces jointes

  • Sans titre.jpg
    Sans titre.jpg
    34.2 KB · Affichages: 47
  • Sans titre.jpg
    Sans titre.jpg
    34.2 KB · Affichages: 50
  • RO.xlsm
    122.5 KB · Affichages: 33
Dernière édition:

Jam

XLDnaute Accro
Re : [Résolu] Boucle qui ne fonctionne pas

Salut DonBeuBeu, le forum,

Point important à ne surtout pas négliger dans un programme: les variables ! Ce sont elles qui "véhiculent" l'information. Leur définition et leur portée (où elles sont accessibles -> le programme, le module, la procédure, etc...) est particulièrement important. Non seulement leur nommage comme le souligne Orodreth est important pour s'y retrouver dans un listing, mais leur définition est tout aussi important.
N'hésite pas à jeter un œil dans l'aide (Dim, Public, Static...).

Bon courage.
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 183
dernier inscrit
karelhu35