Macro avec IF ne s'arrête pas

6fichier.xlsm (252.27 Ko)

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 et bravo pour ta macro. Je ne suis pas sur qu'à la fin elle ne s'arrête pas un jour mais comme boucle sur chaque valeur inférieure ou égale à max t'en as pour un moment puisque qu'à chaque fois tu appelles des actions...

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 Je veux bien du soutien la dessus.

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 :

  1. chaque famille doit atteindre un nombre minimal de points (F1:9, F2:12, F3:18, etc.) (H8:N8)
  2. tout doit être distribué (reste à ventiler P13:P40)
  3. le nombre de points doit être équitable entre les familles (H9:N9)
  4. (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

8exemple.xlsm (139.11 Ko)

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 :

  1. je mets la plage H13:N40 à zéro car le fichier sert d'une semaine sur l'autre
  2. ensuite je copie la formule en 'feuil1' qui correspond à la première colonne de la plage H13:N40 sur la feuille 'ACCOMPAGNEMENT'
  3. je colle la formule en H13:H40 sur 'feuil1' puis je copie et colle en valeur cette même colonne
  4. je copie la colonne P13:P40 pour coller en valeur sur 'feuil1'
  5. et ainsi de suite jusqu'à la colonne dernière colonne de la plage H13:N40
  6. je copie la plage H13:N40 et la colle en valeur dans 'feuil1'
  7. je recommence en collant la formule 'feuil1' qui permet de mettre 2 à la place de 1 dans la colonne H13:P40
  8. 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

Bizard, je n'ai pas fait grand chose de différent que celle de BsAlv si ce n'est d'avoir repris votre test d'infériorité entre Max et Taille, mettez le test en "sens inverse"

@ 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 (?).

4exemple-6.xlsm (153.07 Ko)

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

3exemplebsalv.xlsm (261.26 Ko)

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 ?

1exemple-6.xlsm (155.31 Ko)
Rechercher des sujets similaires à "macro arrete pas"