Aide sur condition si + where a=x

Bonjour,

j'ai un gros probleme avec un script que je cherche a faire

je souhaite que quand je clique sur le bouton act1 (plus tard j'ajouterai les autres boutons) que le script cherche la personne qui a le compteur le plus bas mais avec la qualification act1

ensuite un popup s'ouvre et la 3 choix:

1 ok => j'incremente le compteur // ça j'y arrive

2 refus => j'incremente le compteur de refus, c'est bon, mais je ne sais pas lancer une recherche sur le suivant jusqu'au bon

3 impossible, je n'incremente pas le compteur c'est bon mais je n'arrive pas a passer au suivant jusqu'au bon

j'ai essayer de bidouiller en passant par des tableau ... et j'ai essayé des If and mais je n'arrive pas

quelque chose cloche, et je tourne en rond depuis des jours

Merci

ps: j'ai cherché dans le forum, mais je n'ai pas trouvé une aide qui ressemble a mon probleme

15script.zip (27.91 Ko)

Bonjour,

Une piste. Utiliser un tableau à deux dimensions, dans la 1 le nom et prénom et dans la 2 la valeur du compteur. Boucler sur la plage "Act1" à la recherche des "Oui" (attention, tu as des espaces parasites) puis chercher ensuite la valeur minimale. Mini est défini par défaut à une valeur assez haute mais si tu connais la valeur maxi possible tu peux l'affecter à la variable au lieu des "100" :

Sub Act1()

    Dim Tbl()
    Dim Plage As Range
    Dim Cel As Range
    Dim I As Long
    Dim J As Long
    Dim Mini As Long

    'défini la plage sur la colonne Act1
    With Worksheets("Jour")

        Set Plage = .Range(.Cells(3, 3), .Cells(.Rows.Count, 3).End(xlUp))

    End With

    'parcour la plage à la recherche des "Oui" (attention, il y a des espaces parasites...!)
    'd'où la raison de Trim, à corriger !
    For Each Cel In Plage

        If Trim(Cel.Value) = "Oui" Then

            'redimensionne le tableau
            I = I + 1
            ReDim Preserve Tbl(1 To 2, 1 To I)

            'nom et prénom
            Tbl(1, I) = Cel.Offset(, -2).Value & " " & Cel.Offset(, -1).Value

            'compteur
            Tbl(2, I) = Cel.Offset(, 4).Value

        End If

    Next Cel

    'défini au hasard une valeur assez grande pour Mini
    Mini = 100

    'recherche la valeur la plus basse en mémorisant dans J la position
    For I = 1 To UBound(Tbl, 2)

        If Tbl(2, I) < Mini Then

            Mini = Tbl(2, I)
            J = I

        End If

    Next I

    'résultat
    MsgBox "C'est '" & Tbl(1, J) & "' qui a le compteur le plus bas : " & Tbl(2, J)

End Sub

Hervé.

Merci Hervé pour ce tas de code, je me rend compte que je suis super nul en vba :s

Je vais tout decortiquer apprendre les nouvelles fonction utilisées tout en essayant d'avancer dans mon projet

je posterai ma macro si je bloque de nouveau quelque part

A tres bientot

Rebonjour,

me revoila deja, avec deux petites questions, car j'y arrive pas moi meme

1 - j'ai bien compris qu'on fait un tableau dynamique avec les oui, par contre je ne sais pas comment augmenter la valeur de la cellule compteur de +1 correspondant au nom et prenom de l'act1

2- j'ai tenté de faire une boucle que si le premier nom et prenom ne peut pas faire ce jour, que la boucle cherche celui qui est egale ou juste au dessus et me demande oui ou non, et que cette boucle soit active tant que je dis non

j'espere avoir été clair, je n'ai pas la meme logique que les programmeurs, j'ai du mal a m'imaginer comment faire des que je fait des tests j'ai toujours des erreurs ....

sinon ton aide m'a été précieuse

Merci pour votre aide

Voici a quoi ressemble ma boucle, elle est simpliste, je sais pas faire mieux

K = 1

While Tbl(3, K) < Tbl(3, J)

K = K + 1

Wend

MsgBox Tbl(1, K)

le probleme c'est que ça me donne prochaine valeur plus grande, alors qu'il y a des valeurs entre les deux

exemple dans mon cas

le compteur 90 ne peux pas, je veux passer au compteur suivant, au lieu de prendre celui qui correspond a 100, il prend celui qui correspond a 120 car

Tbl(1, 1) = 90

Tbl(1, 2) = 120

Tbl(1, 3) = 100

Comment faire ?

Merci

voila le fichier, je bloque sur les cases 1 et le 3 (sachant que le 1 et le 2 sont le meme probleme)

Merci

10script.zip (22.55 Ko)

Bonjour,

J'ai modifié le code en ajoutant une procédure de tri afin d'avoir les valeurs compteur en ordre croissant, il te suffit d'incrémenter J pour avoir le prochain. Si ils doivent être, le cas échéant, tous passés en revu, regarde du coté d'une boucle Do Loop (pour le cas 3) :

Sub Act1()

    Dim Tbl()
    Dim Plage As Range
    Dim Cel As Range
    Dim I As Long
    Dim J As Long
    Dim K As Long
    Dim L As Long

    'défini la plage sur la colonne Act1

    With Worksheets("Jour")

        Set Plage = .Range(.Cells(3, 3), .Cells(.Rows.Count, 3).End(xlUp))

    End With

    'parcour la plage à la recherche des "Oui" (attention, il y a des espaces parasites...!)
    'd'où la raison de Trim, à corriger !
    For Each Cel In Plage

        If Trim(Cel.Value) = "Oui" Then

            'redimensionne le tableau
            I = I + 1
            ReDim Preserve Tbl(1 To 4, 1 To I)

            ' nom
            Tbl(1, I) = Cel.Offset(, -2).Value

           ' prenom
            Tbl(2, I) = Cel.Offset(, -1).Value

            'compteur
            Tbl(3, I) = Cel.Offset(, 4).Value

            'stocke l'adresse de la cellule
            Tbl(4, I) = Cel.Offset(, 4).Address

        End If

    Next Cel

    'effectue un tri croissant du tableau
    Tri Tbl()

    'pour afficher la première valeur
    J = 1

    'La variable reçoit la valeur entrée dans l'InputBox
    resultat = InputBox("Le prochain sur la liste: " & _
                        Chr(10) & Chr(10) & Chr(10) & Chr(10) & Chr(9) & _
                        Tbl(1, J) & Tbl(2, J) & Chr(10) & Chr(10) & _
                        "1 :  OK" & Chr(10) & _
                        "2 :  Refus" & Chr(10) & _
                        "3 :  Impossible (on passe au suivant)", "Liste d'intershift")

    Select Case resultat

        Case 1

            'a accepté
            MsgBox "Compteur incrémenté, et action logué", vbOKOnly + vbInformation, " Il  a accepté !"

            '######### Comment incrementer le compteur de +1 ?
            Range(Tbl(4, J)).Value = Range(Tbl(4, J)).Value + 1

        Case 2

            'Le technicien refusé le remplacement
            MsgBox "Compteur de refus + compteur incrémentés, et action logué", vbOKOnly + vbInformation, " Re cliquez sur le bouton VIP"

            MsgBox "Re-cliquez sur le bouton VIP", vbOKOnly + vbInformation, ""

            '######### Augmenter le compteur de refus + le compteur de remplacement pour le penaliser.
            '######### Comment incrementer le compteur de +1 ?

            'compteur de remplacement
            Range(Tbl(4, J)).Value = Range(Tbl(4, J)).Value + 1

            'compteur de refus
            Range(Tbl(4, J)).Offset(, 1).Value = Range(Tbl(4, J)).Offset(, 1).Value + 1

        Case 3

            ' Le planning ne permet pas ce remplacement
            ' MsgBox "Le prochain est : ", vbOKOnly + vbInformation, " le suivant ..."
            ' MsgBox Tbl(3, J) '90

            '######### Comment fair en sorte que le prochain soit le nom7 et non pas le le nom1 ( je veux le compteur le plus bas) et qu'il y ai une boulce que tant que la repone est un refus ou une impossibilité, que ça donne toujours la compteur juste apres
            ' merci de votre aide

            'passe au suivant
            J = J + 1
            MsgBox Tbl(1, J)

            'ici copier coller

        Case Is <> "", 1, 2, 3 ' si la réponse est differente des choix

            MsgBox "Je n'ai pas compris le choix, Veuillez recommencer !", vbOKOnly + vbExclamation, "Erreur !"

        Case Else

    End Select

End Sub

Sub Tri(Tbl())

    Dim Tempo1, Tempo2, Tempo3, Tempo4
    Dim I As Integer
    Dim J As Integer

            'tri décroissant "<"
            'tri croissant ">"
    For I = 1 To UBound(Tbl, 2) - 1

        For J = I + 1 To UBound(Tbl, 2)

            If Tbl(3, I) > Tbl(3, J) Then
                Tempo1 = Tbl(1, J)
                Tempo2 = Tbl(2, J)
                Tempo3 = Tbl(3, J)
                Tempo4 = Tbl(4, J)

                Tbl(1, J) = Tbl(1, I)
                Tbl(2, J) = Tbl(2, I)
                Tbl(3, J) = Tbl(3, I)
                Tbl(4, J) = Tbl(4, I)

                Tbl(1, I) = Tempo1
                Tbl(2, I) = Tempo2
                Tbl(3, I) = Tempo3
                Tbl(4, I) = Tempo4

            End If

        Next J

    Next I

End Sub

Hervé.

Re,

Je viens d'intégrer une boucle Do Loop pour prendre en compte un choix différent de la liste que tu propose (1, 2 et 3). Je te re-poste le tout :

Sub Act1()

    Dim Tbl()
    Dim Plage As Range
    Dim Cel As Range
    Dim I As Long
    Dim J As Long
    Dim K As Long
    Dim L As Long

    'défini la plage sur la colonne Act1

    With Worksheets("Jour")

        Set Plage = .Range(.Cells(3, 3), .Cells(.Rows.Count, 3).End(xlUp))

    End With

    'parcour la plage à la recherche des "Oui" (attention, il y a des espaces parasites...!)
    'd'où la raison de Trim, à corriger !
    For Each Cel In Plage

        If Trim(Cel.Value) = "Oui" Then

            'redimensionne le tableau
            I = I + 1
            ReDim Preserve Tbl(1 To 4, 1 To I)

            ' nom
            Tbl(1, I) = Cel.Offset(, -2).Value

           ' prenom
            Tbl(2, I) = Cel.Offset(, -1).Value

            'compteur
            Tbl(3, I) = Cel.Offset(, 4).Value

            'stocke l'adresse de la cellule
            Tbl(4, I) = Cel.Offset(, 4).Address

        End If

    Next Cel

    'effectue un tri croissant du tableau
    Tri Tbl()

    'pour afficher la première valeur
    J = 1

'reprise ici si choix non prévu dans la liste
Reprise:

    'boucle
    Do

      'La variable reçoit la valeur entrée dans l'InputBox
      resultat = InputBox("Le prochain sur la liste: " & _
                          Chr(10) & Chr(10) & Chr(10) & Chr(10) & Chr(9) & _
                          Tbl(1, J) & Tbl(2, J) & Chr(10) & Chr(10) & _
                          "1 :  OK" & Chr(10) & _
                          "2 :  Refus" & Chr(10) & _
                          "3 :  Impossible (on passe au suivant)", "Liste d'intershift")

      Select Case resultat

          Case 1

              'a accepté
              MsgBox "Compteur incrémenté, et action logué", vbOKOnly + vbInformation, " Il  a accepté !"

              '######### Comment incrementer le compteur de +1 ?
              Range(Tbl(4, J)).Value = Range(Tbl(4, J)).Value + 1

          Case 2

              'Le technicien refusé le remplacement
              MsgBox "Compteur de refus + compteur incrémentés, et action logué", vbOKOnly + vbInformation, " Re cliquez sur le bouton VIP"

              MsgBox "Re-cliquez sur le bouton VIP", vbOKOnly + vbInformation, ""

              '######### Augmenter le compteur de refus + le compteur de remplacement pour le penaliser.
              '######### Comment incrementer le compteur de +1 ?

              'compteur de remplacement
              Range(Tbl(4, J)).Value = Range(Tbl(4, J)).Value + 1

              'compteur de refus
              Range(Tbl(4, J)).Offset(, 1).Value = Range(Tbl(4, J)).Offset(, 1).Value + 1

          Case 3

            ' Le planning ne permet pas ce remplacement
            ' MsgBox "Le prochain est : ", vbOKOnly + vbInformation, " le suivant ..."
            ' MsgBox Tbl(3, J) '90

            '######### Comment fair en sorte que le prochain soit le nom7 et non pas le le nom1 ( je veux le compteur le plus bas) et qu'il y ai une boulce que tant que la repone est un refus ou une impossibilité, que ça donne toujours la compteur juste apres
            ' merci de votre aide

            'passe au suivant
            J = J + 1
            MsgBox Tbl(1, J)

            'ici copier coller

            Case Is <> "", 1, 2, 3 ' si la réponse est differente des choix

                MsgBox "Je n'ai pas compris le choix, Veuillez recommencer !", vbOKOnly + vbExclamation, "Erreur !"

                'recommence jusqu'à la bonne réponse
                GoTo Reprise

            Case Else

                '...

    End Select

    Loop Until resultat <> 3 Or J = UBound(Tbl, 2)

End Sub

Sub Tri(Tbl())

    Dim Tempo1, Tempo2, Tempo3, Tempo4
    Dim I As Integer
    Dim J As Integer

            'tri décroissant "<"
            'tri croissant ">"
    For I = 1 To UBound(Tbl, 2) - 1

        For J = I + 1 To UBound(Tbl, 2)

            If Tbl(3, I) > Tbl(3, J) Then
                Tempo1 = Tbl(1, J)
                Tempo2 = Tbl(2, J)
                Tempo3 = Tbl(3, J)
                Tempo4 = Tbl(4, J)

                Tbl(1, J) = Tbl(1, I)
                Tbl(2, J) = Tbl(2, I)
                Tbl(3, J) = Tbl(3, I)
                Tbl(4, J) = Tbl(4, I)

                Tbl(1, I) = Tempo1
                Tbl(2, I) = Tempo2
                Tbl(3, I) = Tempo3
                Tbl(4, I) = Tempo4

            End If

        Next J

    Next I

End Sub

Hervé.

Salut Hervé,

ça marche du tonnerre

je vais l'adapter et essayer de l'ameliorer, je suis desolé de ne pas avoir poster le fichier du premier coup

Merci merci et encore Merci

bonjour,

j'ai voulu changer la maniere de repondre au choix 1,2,3 par une form sur lequel j'ai mis trois bouton, mais je ne vois pas comment faire en sorte que le clique sur le bouton acceptation ça corresponde au case 1, ...

merci

16script.zip (29.74 Ko)

Bonjour,

Il te suffit de passer le résultat en argument à la proc. Je te poste le tout :

Private Sub btnok_Click()

    '1 est passé en argument
    Act1 1

End Sub

Private Sub btnnok_Click()

    '2 est passé en argument
    Act1 2

End Sub

Private Sub btnnext_Click()

    '3 est passé en argument
    Act1 3

End Sub

Private Sub btnquitter_Click()

    Unload Me

End Sub

Sub Act1(Resultat As Integer) 'Resultat est demandé en argument

    Dim Tbl()
    Dim Plage As Range
    Dim Cel As Range
    Dim I As Long
    Dim J As Long
    Dim K As Long
    Dim L As Long

    'défini la plage sur la colonne Act1

    With Worksheets("Jour")

        Set Plage = .Range(.Cells(3, 3), .Cells(.Rows.Count, 3).End(xlUp))

    End With

    'parcour la plage à la recherche des "Oui" (attention, il y a des espaces parasites...!)
   'd'où la raison de Trim, à corriger !
   For Each Cel In Plage

        If Trim(Cel.Value) = "Oui" Then

            'redimensionne le tableau
           I = I + 1
            ReDim Preserve Tbl(1 To 4, 1 To I)

            ' nom
           Tbl(1, I) = Cel.Offset(, -2).Value

           ' prenom
           Tbl(2, I) = Cel.Offset(, -1).Value

            'compteur
           Tbl(3, I) = Cel.Offset(, 4).Value

            'stocke l'adresse de la cellule
           Tbl(4, I) = Cel.Offset(, 4).Address

        End If

    Next Cel

    'effectue un tri croissant du tableau
   Tri Tbl()

    'pour afficher la première valeur
   J = 1

'reprise ici si choix non prévu dans la liste
Reprise:

    'boucle
   Do

      Select Case Resultat

          Case 1

              'a accepté
             MsgBox "Compteur incrémenté, et action logué", vbOKOnly + vbInformation, " Il  a accepté !"

              '######### Comment incrementer le compteur de +1 ?
             Range(Tbl(4, J)).Value = Range(Tbl(4, J)).Value + 1

          Case 2

              'Le technicien refusé le remplacement
             MsgBox "Compteur de refus + compteur incrémentés, et action logué", vbOKOnly + vbInformation, " Re cliquez sur le bouton VIP"

              MsgBox "Re-cliquez sur le bouton VIP", vbOKOnly + vbInformation, ""

              '######### Augmenter le compteur de refus + le compteur de remplacement pour le penaliser.
             '######### Comment incrementer le compteur de +1 ?

              'compteur de remplacement
             Range(Tbl(4, J)).Value = Range(Tbl(4, J)).Value + 1

              'compteur de refus
             Range(Tbl(4, J)).Offset(, 1).Value = Range(Tbl(4, J)).Offset(, 1).Value + 1

          Case 3

            ' Le planning ne permet pas ce remplacement
           ' MsgBox "Le prochain est : ", vbOKOnly + vbInformation, " le suivant ..."
           ' MsgBox Tbl(3, J) '90

            '######### Comment fair en sorte que le prochain soit le nom7 et non pas le le nom1 ( je veux le compteur le plus bas) et qu'il y ai une boulce que tant que la repone est un refus ou une impossibilité, que ça donne toujours la compteur juste apres
           ' merci de votre aide

            'passe au suivant
           J = J + 1
            MsgBox Tbl(1, J)

            'ici copier coller

            Case Is <> "", 1, 2, 3 ' si la réponse est differente des choix

                MsgBox "Je n'ai pas compris le choix, Veuillez recommencer !", vbOKOnly + vbExclamation, "Erreur !"

                'recommence jusqu'à la bonne réponse
               GoTo Reprise

            Case Else

                '...

    End Select

    Loop Until Resultat <> 3 Or J = UBound(Tbl, 2)

End Sub

Sub Tri(Tbl())

    Dim Tempo1, Tempo2, Tempo3, Tempo4
    Dim I As Integer
    Dim J As Integer

            'tri décroissant "<"
           'tri croissant ">"
   For I = 1 To UBound(Tbl, 2) - 1

        For J = I + 1 To UBound(Tbl, 2)

            If Tbl(3, I) > Tbl(3, J) Then
                Tempo1 = Tbl(1, J)
                Tempo2 = Tbl(2, J)
                Tempo3 = Tbl(3, J)
                Tempo4 = Tbl(4, J)

                Tbl(1, J) = Tbl(1, I)
                Tbl(2, J) = Tbl(2, I)
                Tbl(3, J) = Tbl(3, I)
                Tbl(4, J) = Tbl(4, I)

                Tbl(1, I) = Tempo1
                Tbl(2, I) = Tempo2
                Tbl(3, I) = Tempo3
                Tbl(4, I) = Tempo4

            End If

        Next J

    Next I

End Sub

Hervé.


Bonjour,

Il te suffit de passer le résultat en argument à la proc. Je te poste le tout :

Private Sub btnok_Click()

    '1 est passé en argument
    Act1 1

End Sub

Private Sub btnnok_Click()

    '2 est passé en argument
    Act1 2

End Sub

Private Sub btnnext_Click()

    '3 est passé en argument
    Act1 3

End Sub

Private Sub btnquitter_Click()

    Unload Me

End Sub

Sub Act1(Resultat As Integer) 'Resultat est demandé en argument

    Dim Tbl()
    Dim Plage As Range
    Dim Cel As Range
    Dim I As Long
    Dim J As Long
    Dim K As Long
    Dim L As Long

    'défini la plage sur la colonne Act1

    With Worksheets("Jour")

        Set Plage = .Range(.Cells(3, 3), .Cells(.Rows.Count, 3).End(xlUp))

    End With

    'parcour la plage à la recherche des "Oui" (attention, il y a des espaces parasites...!)
   'd'où la raison de Trim, à corriger !
   For Each Cel In Plage

        If Trim(Cel.Value) = "Oui" Then

            'redimensionne le tableau
           I = I + 1
            ReDim Preserve Tbl(1 To 4, 1 To I)

            ' nom
           Tbl(1, I) = Cel.Offset(, -2).Value

           ' prenom
           Tbl(2, I) = Cel.Offset(, -1).Value

            'compteur
           Tbl(3, I) = Cel.Offset(, 4).Value

            'stocke l'adresse de la cellule
           Tbl(4, I) = Cel.Offset(, 4).Address

        End If

    Next Cel

    'effectue un tri croissant du tableau
   Tri Tbl()

    'pour afficher la première valeur
   J = 1

'reprise ici si choix non prévu dans la liste
Reprise:

    'boucle
   Do

      Select Case Resultat

          Case 1

              'a accepté
             MsgBox "Compteur incrémenté, et action logué", vbOKOnly + vbInformation, " Il  a accepté !"

              '######### Comment incrementer le compteur de +1 ?
             Range(Tbl(4, J)).Value = Range(Tbl(4, J)).Value + 1

          Case 2

              'Le technicien refusé le remplacement
             MsgBox "Compteur de refus + compteur incrémentés, et action logué", vbOKOnly + vbInformation, " Re cliquez sur le bouton VIP"

              MsgBox "Re-cliquez sur le bouton VIP", vbOKOnly + vbInformation, ""

              '######### Augmenter le compteur de refus + le compteur de remplacement pour le penaliser.
             '######### Comment incrementer le compteur de +1 ?

              'compteur de remplacement
             Range(Tbl(4, J)).Value = Range(Tbl(4, J)).Value + 1

              'compteur de refus
             Range(Tbl(4, J)).Offset(, 1).Value = Range(Tbl(4, J)).Offset(, 1).Value + 1

          Case 3

            ' Le planning ne permet pas ce remplacement
           ' MsgBox "Le prochain est : ", vbOKOnly + vbInformation, " le suivant ..."
           ' MsgBox Tbl(3, J) '90

            '######### Comment fair en sorte que le prochain soit le nom7 et non pas le le nom1 ( je veux le compteur le plus bas) et qu'il y ai une boulce que tant que la repone est un refus ou une impossibilité, que ça donne toujours la compteur juste apres
           ' merci de votre aide

            'passe au suivant
           J = J + 1
            MsgBox Tbl(1, J)

            'ici copier coller

            Case Is <> "", 1, 2, 3 ' si la réponse est differente des choix

                MsgBox "Je n'ai pas compris le choix, Veuillez recommencer !", vbOKOnly + vbExclamation, "Erreur !"

                'recommence jusqu'à la bonne réponse
               GoTo Reprise

            Case Else

                '...

    End Select

    Loop Until Resultat <> 3 Or J = UBound(Tbl, 2)

End Sub

Sub Tri(Tbl())

    Dim Tempo1, Tempo2, Tempo3, Tempo4
    Dim I As Integer
    Dim J As Integer

            'tri décroissant "<"
           'tri croissant ">"
   For I = 1 To UBound(Tbl, 2) - 1

        For J = I + 1 To UBound(Tbl, 2)

            If Tbl(3, I) > Tbl(3, J) Then
                Tempo1 = Tbl(1, J)
                Tempo2 = Tbl(2, J)
                Tempo3 = Tbl(3, J)
                Tempo4 = Tbl(4, J)

                Tbl(1, J) = Tbl(1, I)
                Tbl(2, J) = Tbl(2, I)
                Tbl(3, J) = Tbl(3, I)
                Tbl(4, J) = Tbl(4, I)

                Tbl(1, I) = Tempo1
                Tbl(2, I) = Tempo2
                Tbl(3, I) = Tempo3
                Tbl(4, I) = Tempo4

            End If

        Next J

    Next I

End Sub

Hervé.


Oups désolé, je l'ai posté deux fois

Houston, j'ai un probleme

avant tout merci !

j'ai un truc bizzare, des lors que je met en argument resultat, ça Act1 disparait en tant que macro

je sais pas pourquoi, je crois que je me suis aventuré en terrain inconnu,

de plus, si je veux faire un deuxieme bouton Act2, comment lui passer l'argument ?

je peux faire dans Private Sub btnok_Click()

Act1 1

Act2 1

Act3 1

..... ?

sinon j'ai une erreur au lancement, peux tu me dire d'ou ça vient ?

Merci encore

+++++++++++++++++++++++++++++++++++++

Private Sub btnok_Click()

    '1 est passé en argument
   Act1 1

End Sub

Private Sub btnnok_Click()

    '2 est passé en argument
   Act1 2

End Sub

Private Sub btnnext_Click()

    '3 est passé en argument
   Act1 3

End Sub

Private Sub btnquitter_Click()

    Unload Me

End Sub

Sub Act1(Resultat As Integer) 'Resultat est demandé en argument

    Dim Tbl()
    Dim Plage As Range
    Dim Cel As Range
    Dim I As Long
    Dim J As Long
    Dim K As Long
    Dim L As Long

    'défini la plage sur la colonne Act1

    With Worksheets("Jour")

        Set Plage = .Range(.Cells(3, 3), .Cells(.Rows.Count, 3).End(xlUp))

    End With

    'parcour la plage à la recherche des "Oui" (attention, il y a des espaces parasites...!)
   'd'où la raison de Trim, à corriger !
   For Each Cel In Plage

        If Trim(Cel.Value) = "Oui" Then

            'redimensionne le tableau
           I = I + 1
            ReDim Preserve Tbl(1 To 4, 1 To I)

            ' nom
           Tbl(1, I) = Cel.Offset(, -2).Value

           ' prenom
           Tbl(2, I) = Cel.Offset(, -1).Value

            'compteur
           Tbl(3, I) = Cel.Offset(, 4).Value

            'stocke l'adresse de la cellule
           Tbl(4, I) = Cel.Offset(, 4).Address

        End If

    Next Cel

    'effectue un tri croissant du tableau
   Tri Tbl()

    'pour afficher la première valeur
   J = 1

'reprise ici si choix non prévu dans la liste
Reprise:

    'boucle
   Do

      'La variable reçoit la valeur entrée dans l'InputBox
     'Resultat = InputBox("Le prochain sur la liste: " & _
                          Chr(10) & Chr(10) & Chr(10) & Chr(10) & Chr(9) & _
                          Tbl(1, J) & Tbl(2, J) & Chr(10) & Chr(10) & _
                          "1 :  OK" & Chr(10) & _
                          "2 :  Refus" & Chr(10) & _
                          "3 :  Impossible (on passe au suivant)", "Liste d'intershift")

      reponse.Show

      Select Case Resultat

          Case 1

              'a accepté
             MsgBox "Compteur incrémenté, et action logué", vbOKOnly + vbInformation, " Il  a accepté !"

              '######### Comment incrementer le compteur de +1 ?
             Range(Tbl(4, J)).Value = Range(Tbl(4, J)).Value + 1

          Case 2

              'Le technicien refusé le remplacement
             MsgBox "Compteur de refus + compteur incrémentés, et action logué", vbOKOnly + vbInformation, " Re cliquez sur le bouton VIP"

              MsgBox "Re-cliquez sur le bouton VIP", vbOKOnly + vbInformation, ""

              '######### Augmenter le compteur de refus + le compteur de remplacement pour le penaliser.
             '######### Comment incrementer le compteur de +1 ?

              'compteur de remplacement
             Range(Tbl(4, J)).Value = Range(Tbl(4, J)).Value + 1

              'compteur de refus
             Range(Tbl(4, J)).Offset(, 1).Value = Range(Tbl(4, J)).Offset(, 1).Value + 1

          Case 3

            ' Le planning ne permet pas ce remplacement
           ' MsgBox "Le prochain est : ", vbOKOnly + vbInformation, " le suivant ..."
           ' MsgBox Tbl(3, J) '90

            '######### Comment fair en sorte que le prochain soit le nom7 et non pas le le nom1 ( je veux le compteur le plus bas) et qu'il y ai une boulce que tant que la repone est un refus ou une impossibilité, que ça donne toujours la compteur juste apres
           ' merci de votre aide

            'passe au suivant
           J = J + 1
            MsgBox Tbl(1, J)

            'ici copier coller

            Case Is <> "", 1, 2, 3 ' si la réponse est differente des choix

                MsgBox "Je n'ai pas compris le choix, Veuillez recommencer !", vbOKOnly + vbExclamation, "Erreur !"

                'recommence jusqu'à la bonne réponse
               GoTo Reprise

            Case Else

                '...

    End Select

    Loop Until Resultat <> 3 Or J = UBound(Tbl, 2)

End Sub

Sub Tri(Tbl())

    Dim Tempo1, Tempo2, Tempo3, Tempo4
    Dim I As Integer
    Dim J As Integer

            'tri décroissant "<"
           'tri croissant ">"
   For I = 1 To UBound(Tbl, 2) - 1

        For J = I + 1 To UBound(Tbl, 2)

            If Tbl(3, I) > Tbl(3, J) Then
                Tempo1 = Tbl(1, J)
                Tempo2 = Tbl(2, J)
                Tempo3 = Tbl(3, J)
                Tempo4 = Tbl(4, J)

                Tbl(1, J) = Tbl(1, I)
                Tbl(2, J) = Tbl(2, I)
                Tbl(3, J) = Tbl(3, I)
                Tbl(4, J) = Tbl(4, I)

                Tbl(1, I) = Tempo1
                Tbl(2, I) = Tempo2
                Tbl(3, I) = Tempo3
                Tbl(4, I) = Tempo4

            End If

        Next J

    Next I

End Sub

Sub Act2(Resultat As Integer) 'Resultat est demandé en argument

    Dim Tbl()
    Dim Plage As Range
    Dim Cel As Range
    Dim I As Long
    Dim J As Long
    Dim K As Long
    Dim L As Long

    'défini la plage sur la colonne Act1

    With Worksheets("Jour")

        Set Plage = .Range(.Cells(3, 4), .Cells(.Rows.Count, 4).End(xlUp))

    End With

    'parcour la plage à la recherche des "Oui" (attention, il y a des espaces parasites...!)
   'd'où la raison de Trim, à corriger !
   For Each Cel In Plage

        If Trim(Cel.Value) = "Oui" Then

            'redimensionne le tableau
           I = I + 1
            ReDim Preserve Tbl(1 To 4, 1 To I)

            ' nom
           Tbl(1, I) = Cel.Offset(, -2).Value

           ' prenom
           Tbl(2, I) = Cel.Offset(, -1).Value

            'compteur
           Tbl(3, I) = Cel.Offset(, 4).Value

            'stocke l'adresse de la cellule
           Tbl(4, I) = Cel.Offset(, 4).Address

        End If

    Next Cel

    'effectue un tri croissant du tableau
   Tri Tbl()

    'pour afficher la première valeur
   J = 1

'reprise ici si choix non prévu dans la liste
Reprise:

    'boucle
   Do

      'La variable reçoit la valeur entrée dans l'InputBox
     'Resultat = InputBox("Le prochain sur la liste: " & _
                          Chr(10) & Chr(10) & Chr(10) & Chr(10) & Chr(9) & _
                          Tbl(1, J) & Tbl(2, J) & Chr(10) & Chr(10) & _
                          "1 :  OK" & Chr(10) & _
                          "2 :  Refus" & Chr(10) & _
                          "3 :  Impossible (on passe au suivant)", "Liste d'intershift")

      reponse.Show

      Select Case Resultat

          Case 1

              'a accepté
             MsgBox "Compteur incrémenté, et action logué", vbOKOnly + vbInformation, " Il  a accepté !"

              '######### Comment incrementer le compteur de +1 ?
             Range(Tbl(4, J)).Value = Range(Tbl(4, J)).Value + 1

          Case 2

              'Le technicien refusé le remplacement
             MsgBox "Compteur de refus + compteur incrémentés, et action logué", vbOKOnly + vbInformation, " Re cliquez sur le bouton VIP"

              MsgBox "Re-cliquez sur le bouton VIP", vbOKOnly + vbInformation, ""

              '######### Augmenter le compteur de refus + le compteur de remplacement pour le penaliser.
             '######### Comment incrementer le compteur de +1 ?

              'compteur de remplacement
             Range(Tbl(4, J)).Value = Range(Tbl(4, J)).Value + 1

              'compteur de refus
             Range(Tbl(4, J)).Offset(, 1).Value = Range(Tbl(4, J)).Offset(, 1).Value + 1

          Case 3

            ' Le planning ne permet pas ce remplacement
           ' MsgBox "Le prochain est : ", vbOKOnly + vbInformation, " le suivant ..."
           ' MsgBox Tbl(3, J) '90

            '######### Comment fair en sorte que le prochain soit le nom7 et non pas le le nom1 ( je veux le compteur le plus bas) et qu'il y ai une boulce que tant que la repone est un refus ou une impossibilité, que ça donne toujours la compteur juste apres
           ' merci de votre aide

            'passe au suivant
           J = J + 1
            MsgBox Tbl(1, J)

            'ici copier coller

            Case Is <> "", 1, 2, 3 ' si la réponse est differente des choix

                MsgBox "Je n'ai pas compris le choix, Veuillez recommencer !", vbOKOnly + vbExclamation, "Erreur !"

                'recommence jusqu'à la bonne réponse
               GoTo Reprise

            Case Else

                '...

    End Select

    Loop Until Resultat <> 3 Or J = UBound(Tbl, 2)

End Sub
14script.zip (28.49 Ko)

Bonjour,

Voici le classeur. J'espère que c'est ce que tu désire !

Hervé.

10script.zip (32.92 Ko)

Bonjour Hervé, c'est exactement cela !!! Un grand merci

une question, je n'arrive pas a avoir le nom et prenom dans la zone texte du dessus, si je lui donne la variable au format Tbl(1, I) il me jette

en tout cas merci, parce que tu m'as évité pas mal de nuits blanches

Bonjour,

désolé du retard, j'étais en vacance

Ce que tu m'as poster a complétement chambouler ma vision des choses, je ne savais qu'excel pouvait faire de telles choses !

c'est formidable, une dernière chose que je n'arrive pas a faire, quand le programme se lance, je voudrais que quand je clique sur acceptation il passe l'argument "resultat=1" , impossible"resultat=3" et reaffiche le nom suivant, refus "resultat=2) incrémente de 1 et reafiche le nom compteur suivant.

comme tu peux le voir j'essaie désespérément de le faire de toute les manières mais je n'ai pas les compétences pour, une aide serai la bienvenue

Merci

12script.zip (25.74 Ko)
Rechercher des sujets similaires à "aide condition where"