Macro avec IF ne s'arrête pas
Bonjour à toutes et tous, je viens de créer mon premier code avec IF, ELSEIF et ELSE et je suis assez fier de moi même s'il m'a l'air alambiqué. Merci pour votre aide sans laquelle je n'y serai pas arrivé. Mais il me manque tout de même quelque chose dans ce code c'est qu'il ne s'arrête pas. J'ai essayé pas mal de chose mais rien à faire. Merci pour votre aide. Cordialement, legreffier
Sub Ventiler()
Dim taille As Integer
Dim taille1 As Integer
Dim taille2 As Integer
Dim taille3 As Integer
Dim taille4 As Integer
Dim taille5 As Integer
Dim taille6 As Integer
Dim taille7 As Integer
Dim taille8 As Integer
Dim taille9 As Integer
Dim taille10 As Integer
Dim taille11 As Integer
Dim taille12 As Integer
Dim taille13 As Integer
Dim taille14 As Integer
Dim taille15 As Integer
Dim taille16 As Integer
Dim taille17 As Integer
Dim taille18 As Integer
Dim taille19 As Integer
Dim taille20 As Integer
Dim taille21 As Integer
Dim taille22 As Integer
Dim taille23 As Integer
Dim taille24 As Integer
Dim max As Integer
taille = Range("P1")
taille1 = Range("Q1")
taille2 = Range("R1")
taille3 = Range("S1")
taille4 = Range("T1")
taille5 = Range("U1")
taille6 = Range("V1")
taille7 = Range("W1")
taille8 = Range("X1")
taille9 = Range("Y1")
taille10 = Range("Z1")
taille11 = Range("AA1")
taille12 = Range("AB1")
taille13 = Range("AC1")
taille14 = Range("AD1")
taille15 = Range("AE1")
taille16 = Range("AF1")
taille17 = Range("AG1")
taille18 = Range("AH1")
taille19 = Range("AI1")
taille20 = Range("AJ1")
taille21 = Range("AK1")
taille22 = Range("AL1")
taille23 = Range("AM1")
taille24 = Range("AN2")
max = Range("P41")
If max <= taille Then
Call Ventiler1
Exit Sub
ElseIf max <= taille1 Then
Call Ventiler1
Call Ventiler2
Exit Sub
ElseIf max <= taille2 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Exit Sub
ElseIf max <= taille3 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Exit Sub
ElseIf max <= taille4 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Exit Sub
ElseIf max <= taille5 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Exit Sub
ElseIf max <= taille6 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Exit Sub
ElseIf max <= taille7 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Exit Sub
ElseIf max <= taille8 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Exit Sub
ElseIf max <= taille9 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Exit Sub
ElseIf max <= taille10 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Exit Sub
ElseIf max <= taille11 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Exit Sub
ElseIf max <= taille12 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Call Ventiler13
Exit Sub
ElseIf max <= taille13 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Call Ventiler13
Call Ventiler14
Exit Sub
ElseIf max <= taille14 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Call Ventiler13
Call Ventiler14
Call Ventiler15
Exit Sub
ElseIf max <= taille15 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Call Ventiler13
Call Ventiler14
Call Ventiler15
Call Ventiler16
Exit Sub
ElseIf max <= taille16 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Call Ventiler13
Call Ventiler14
Call Ventiler15
Call Ventiler16
Call Ventiler17
Exit Sub
ElseIf max <= taille17 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Call Ventiler13
Call Ventiler14
Call Ventiler15
Call Ventiler16
Call Ventiler17
Call Ventiler18
Exit Sub
ElseIf max <= taille18 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Call Ventiler13
Call Ventiler14
Call Ventiler15
Call Ventiler16
Call Ventiler17
Call Ventiler18
Call Ventiler19
Exit Sub
ElseIf max <= taille19 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Call Ventiler13
Call Ventiler14
Call Ventiler15
Call Ventiler16
Call Ventiler17
Call Ventiler18
Call Ventiler19
Call Ventiler20
Exit Sub
ElseIf max <= taille20 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Call Ventiler13
Call Ventiler14
Call Ventiler15
Call Ventiler16
Call Ventiler17
Call Ventiler18
Call Ventiler19
Call Ventiler20
Call Ventiler21
Exit Sub
ElseIf max <= taille21 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Call Ventiler13
Call Ventiler14
Call Ventiler15
Call Ventiler16
Call Ventiler17
Call Ventiler18
Call Ventiler19
Call Ventiler20
Call Ventiler21
Call Ventiler22
Exit Sub
ElseIf max <= taille22 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Call Ventiler13
Call Ventiler14
Call Ventiler15
Call Ventiler16
Call Ventiler17
Call Ventiler18
Call Ventiler19
Call Ventiler20
Call Ventiler21
Call Ventiler22
Call Ventiler23
Exit Sub
ElseIf max <= taille23 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Call Ventiler13
Call Ventiler14
Call Ventiler15
Call Ventiler16
Call Ventiler17
Call Ventiler18
Call Ventiler19
Call Ventiler20
Call Ventiler21
Call Ventiler22
Call Ventiler23
Call Ventiler24
Exit Sub
ElseIf max <= taille24 Then
Call Ventiler1
Call Ventiler2
Call Ventiler3
Call Ventiler4
Call Ventiler5
Call Ventiler6
Call Ventiler7
Call Ventiler8
Call Ventiler9
Call Ventiler10
Call Ventiler11
Call Ventiler12
Call Ventiler13
Call Ventiler14
Call Ventiler15
Call Ventiler16
Call Ventiler17
Call Ventiler18
Call Ventiler19
Call Ventiler20
Call Ventiler21
Call Ventiler22
Call Ventiler23
Call Ventiler24
Call Ventiler25
Exit Sub
End If
End Sub
Bonjour,
Comme c'est pour les resto, je veux bien prendre un peu de temps pour comprendre !
Tout d'abord, bravo pour ton engagement
Je ne peux pas tester la macro sur mon pc, je te laisse donc faire les tests.
Comme tu as une échelle avec un pas de 39, je te propose de boucler sur ce pas en simplifiant la macro.
ce qui devrait aussi la limiter , donc l'arrêter
Sub Ventiler()
Private Const Pas As Integer = 39
Dim MAX As Integer
Dim Cbm As Long
Dim i As Long
MAX = Range("P41")
Cbm = MAX / Pas
For i = 1 To Cbm
Call Controls("Ventiler" & i)
Next i
End Sub
J'ai un doute sur la méthode d'appel de la macro en boucle. Forum
Leakim
re,
je ne comprends pas le but de cette macro, mais pour simplifier je pense à ceci
Mais il faut encore créer toutes ces autres macros.
Sub Ventiler()
Dim max As Integer
taille = Range("P1").Resize(, 25)
max = Range("P41")
For i = 1 To UBound(taille, 2)
b = (max >= taille(1, i))
If b Then
Select Case i
Case 1: Ventiler1
Case 2: Ventiler2
Case 3: Ventiler3
'Case 4: Ventiler4
'Case 5: Ventiler5
'Case 6: Ventiler6
'Case 7: Ventiler7
'Case 8: Ventiler8
'Case 9: Ventiler9
'Case 10: Ventiler10
'Case 11: Ventiler11
'Case 12: Ventiler12
'Case 13: Ventiler13
'Case 14: Ventiler14
'Case 15: Ventiler15
'Case 16: Ventiler16
'Case 17: Ventiler17
'Case 18: Ventiler18
'Case 19: Ventiler19
'Case 20: Ventiler20
'Case 21: Ventiler21
'Case 22: Ventiler22
'Case 23: Ventiler23
'Case 24: Ventiler24
'Case 25: Ventiler25
End Select
else
exit sub
End If
Next
End Sub
Sub Ventiler1()
MsgBox "1"
End Sub
Sub Ventiler2()
MsgBox "2"
End Sub
Sub Ventiler3()
MsgBox "3"
End Sub
et le reste ....
bonsoir à tous,
J'ai un doute sur la méthode d'appel de la macro en boucle. Forum Je veux bien du soutien la dessus.
pour un appel dynamique d'une procédure
run "ventiler" & i
haha H2SO4, cela simplifie encore les choses.
Sub Ventiler()
taille = Range("P1").Resize(, 25)
max = Range("P41")
For i = 1 To UBound(taille, 2)
b = (max >= taille(1, i))
If b Then
Run "Ventiler" & i
Else
Exit Sub
End If
Next
End Sub
Bonjour à toutes et tous, merci pour ce retour. Pour expliquer la macro :
>>> l'objectif est de répartir des quantités de denrées pour chaque famille de 1, 2, 3, 4, 5, 6 et 7 personnes avec ces critères :
- chaque famille doit atteindre un nombre minimal de points (F1:9, F2:12, F3:18, etc.) (H8:N8)
- tout doit être distribué (reste à ventiler P13:P40)
- le nombre de points doit être équitable entre les familles (H9:N9)
- (en option mais difficile à faire par le calcul peut-être, pour certaines denrées il faut que chaque personne d'une famille en aient (exemple : steack, fruits))
Je suis débutant avec le VBA (y'a quelque chose avant débutant ? ) et je tâtonne pas à pas, semaine après semaine pour arriver à faire cela de façon à ce que quelque soit le bénévole qui a comme prérequis la connaissance d'Excel puisse prendre en main la ventilation des produits). Pour le moment avec cette macro j'arrive à tout ventiler donc le point 2 est atteint.
Je regarde les solutions un peu plus tard et vous ferai un retour.
Merci pour votre aide.
legreffier
Bonjour à toutes et tous, merci pour votre travail.
J'ai essayé :
# le code de leakim, il me renvoie "Erreur de compilation : Attribut incorrect dans une procédure Sub ou Fonction" sur la ligne "Private Const Pas As Integer = 39"
# le code de BsALv, après avoir complété le code (joint), j'ai des messages qui s'affichent : 1, 2, 3, 4 ,5, etc. jusque 14 qui doit correspondre aux macros nécessaires pour ventiler la quantité maximale saisie mais rien n'est ventilé, les cellules restent vides mais je ne suis pas sûr d'avoir mis tout au bon endroit ?
Sub Ventiler()
Dim MAX As Integer
taille = Range("P1").Resize(, 25)
MAX = Range("P41")
For i = 1 To UBound(taille, 2)
b = (MAX >= taille(1, i))
If b Then
'Select Case i
Case 1: Ventiler1
Case 2: Ventiler2
Case 3: Ventiler3
Case 4: Ventiler4
Case 5: Ventiler5
Case 6: Ventiler6
Case 7: Ventiler7
Case 8: Ventiler8
Case 9: Ventiler9
Case 10: Ventiler10
Case 11: Ventiler11
Case 12: Ventiler12
Case 13: Ventiler13
Case 14: Ventiler14
Case 15: Ventiler15
Case 16: Ventiler16
Case 17: Ventiler17
Case 18: Ventiler18
Case 19: Ventiler19
Case 20: Ventiler20
Case 21: Ventiler21
Case 22: Ventiler22
Case 23: Ventiler23
Case 24: Ventiler24
Case 25: Ventiler25
End Select
Else
Exit Sub
End If
Next
End Sub
Sub Ventiler1()
MsgBox "1"
End Sub
Sub Ventiler2()
MsgBox "2"
End Sub
Sub Ventiler3()
MsgBox "3"
End Sub
Sub Ventiler4()
MsgBox "4"
End Sub
Sub Ventiler5()
MsgBox "5"
End Sub
Sub Ventiler6()
MsgBox "6"
End Sub
Sub Ventiler7()
MsgBox "7"
End Sub
Sub Ventiler8()
MsgBox "8"
End Sub
Sub Ventiler9()
MsgBox "9"
End Sub
Sub Ventiler10()
MsgBox "10"
End Sub
Sub Ventiler11()
MsgBox "11"
End Sub
Sub Ventiler12()
MsgBox "12"
End Sub
Sub Ventiler13()
MsgBox "13"
End Sub
Sub Ventiler14()
MsgBox "14"
End Sub
Sub Ventiler15()
MsgBox "15"
End Sub
Sub Ventiler16()
MsgBox "16"
End Sub
Sub Ventiler17()
MsgBox "17"
End Sub
Sub Ventiler18()
MsgBox "18"
End Sub
Sub Ventiler19()
MsgBox "19"
End Sub
Sub Ventiler20()
MsgBox "20"
End Sub
Sub Ventiler21()
MsgBox "21"
End Sub
Sub Ventiler22()
MsgBox "22"
End Sub
Sub Ventiler23()
MsgBox "23"
End Sub
Sub Ventiler24()
MsgBox "24"
End Sub
Sub Ventiler25()
MsgBox "25"
End Sub
# le code de h2so4 et BsALv, le code fonctionne parfaitement mais il ne s'arrête que lorsque les 25 macros sont exécutées même si les 3 premières suffisent
Voilà, cependant je peux utiliser le code de h2so4 et BsALv, il est foinctionnel.
Merci pour votre aide.
legreffier
ces macros "Ventilerx" sont vos macros pour ventiler.
pouvez-vous nos montrer un exemple ou explication de ce que cette macro doit faire.
Les macros "Ventilerx" ajoutent "1" pour toutes les lignes du TCD, famille par famille (H13:H40 puis I13:I40) si le reste à ventiler (P13:P40) est supérieur au nombre de famille (H3:N3). Je ne sais pas si c'est plus clair ?
Voici un exemple de la ventilation de ce matin pour les protéines
re, je vois cette plage, mais je ne sais pas ce que vous voulez faire. Vous commencez avec un plage vide et puis ... vous ajoutez de "1" ... ? Et vous regardez vers la colonne P et la ligne 8 ?
Bonsoir,
Merci H2so4 pour le complément sur l'appel dynamique, je le range dans un coin dans ma bibliothèque VBA, Merci !
Pour le sujet, Mr Legreffier vous êtes entre de bonnes mains.
Bonne suite à vous,
On compte sur vous !
Bonsoir @ tous !
Pareil que vous leakim, je me met ça de côté, sait-on jamais.
sinon au vu de ce qui a été fourni et proposé, je vous propose ce code qui permet de tourner de "ventiler1" à "ventiler i" autant de fois que Max est inférieur à "taille i", pour cela ajout d'une deuxième boucle "j" qui va de 1 à i :
Sub Ventiler()
Taille = Range("P1").Resize(, 25)
Max = Range("P41")
For i = 1 To UBound(Taille, 2)
If Max <= Taille(1, i) Then
For j = 1 To i
Run "Ventiler" & i
Next j
Else
Exit For
End If
Next
End Sub
Ici si Max est > à Taille(i) alors on sort de la boucle, sinon on boucle de 1 à i pour lancer les ventilations.
Une question : Qu'est ce qu'il y a derrière les "ventilerX" ? Une seule sub avec des variables ne suffirait elle pas ?
@ bientôt
LouReeD
Bonsoir BsALv, la démarche est la suivante, sachant que je ne suis pas un expert en mathématiques :
- je mets la plage H13:N40 à zéro car le fichier sert d'une semaine sur l'autre
- ensuite je copie la formule en 'feuil1' qui correspond à la première colonne de la plage H13:N40 sur la feuille 'ACCOMPAGNEMENT'
- je colle la formule en H13:H40 sur 'feuil1' puis je copie et colle en valeur cette même colonne
- je copie la colonne P13:P40 pour coller en valeur sur 'feuil1'
- et ainsi de suite jusqu'à la colonne dernière colonne de la plage H13:N40
- je copie la plage H13:N40 et la colle en valeur dans 'feuil1'
- je recommence en collant la formule 'feuil1' qui permet de mettre 2 à la place de 1 dans la colonne H13:P40
- et ainsi de suite...
J'avoue que dit comme ça, ça à l'air tordu. Mais ça marche...
Merci BsALv
legreffier
Bonsoir LooReeD, la macro ne se lance pas, il ne se passe rien.
legreffier
@ bientôt
LouReeD
je n'ai pas de feuil1 ou ACCOMPAGNEMENT
Je pense que vous voulez le faire comme je l'ai fait avec macro "Test", la vitesse d'exécution est plutôt lent parce que je voulais vous montrer les résultats intermédiaires.
On peut encore ajouter un truc aléatoire, maintenant on fais +1 dans le boucle H13:N13, puis H14:N14, etc. On peut faire cela aléatoire, si cela a un advantage (?).
Bonjour LouReed, je reviens sur le forum, j'étais en déplacement. Que dois-je faire pour mettre le test en "sens inverse" ? Merci. legreffier
Bonjour BsAlv, je vous joins un classeur avec les feuilles correspondantes. Merci. legreffier
re,
je n'ai pas encore regardé vos nouveaux fichiers, mais cette solution avec une différence de 11 à 12% entre ligne 8 et 12 et elle acceptable et est-elle mieux que votre solution ?