Microsoft 365 Recherche de date en VBA

Sephiro18

XLDnaute Nouveau
Bonjour tout le monde !

Je viens vers vous car je me casse les dents sur une tentative pour créer un petit script VBA. J'aimerais mettre en place :
- Une première fenêtre qui demande à l'utilisateur de renseigner "Nom d'opérateur" qui va être stocker dans une variable "OperatorName"
- Une deuxième fenêtre qui demande à l'utilisateur de renseigner "Poste opérateur" qui va être stocker dans une variable "OperatorRole"
- Faire une recherche dans la range "B3:L50" pour trouver une correspondance avec le contenu de la variable "OperatorName", si ça correspond, il suit la même ligne en direction de la colonne "A" et compare le contenu de la cellule avec la valeur de la variable "OperatorRole", si ça correspond

La but de mon fichier excel, c'est de rechercher un operateur sur un poste précis pour trouver la dernière date à laquelle il a été sur le poste. Il faut prendre la date la plus ancienne si l'opérateur a été plusieurs fois sur le poste. Il faudra donc que la recherche se fasse sur l'ensembles des feuilles du fichier excel. En sachant que la feuille la plus à gauche sera la plus ancienne, et que chaque feuille correspondra à une semaine de travail.

Je ne sais pas si j'ai été très clair, n'hésitez pas à me poser des questions, ou peut être une manière de faire différente.

Merci de votre aide en tout cas !
 

Pièces jointes

  • ESSAI PLANNING.xlsm
    35.4 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Sephiro,
Un essai en PJ avec ce que j'ai compris, avec un bouton dans BDD et :
VB:
Sub ChercheDernièreDate()
With UserForm1
    .ComboBox1.List = [Tableau1].Value  ' Remplissage avec Opérateur
    .ComboBox2.List = [Tableau2].Value  ' Remplissage avec Postes
    .Reponse = ""                       ' On efface le message
    .Show                               ' On afiche l'userform
End With
End Sub
et un userform avec :
VB:
Private Sub Chercher_Click()
Dim Name$, Role$, Poste$, Jour, JourTrouvé, C%, C2%, Feuille$, Période$, S$
Name = ComboBox1.Value  ' On récupère le nom et le poste
Role = ComboBox2.Value
JourTrouvé = 0
If Name = "" Or Role = "" Then UserForm1.Reponse = "Renseigner Nom et Role.": Exit Sub  ' Sécu s'il manque infos
For Each F In Sheets            ' Pour toutes les feuilles
    If F.Name <> "BDD" Then     ' Excepté BDD ( à enrichir si d'autres feuilles doivent être ignorées )
        UserForm1.Reponse = "Recherche dans feuille " & F.Name
        If Application.CountIf(Sheets(F.Name).[A1:L40], Name) > 0 Then      ' Si le nom est trouvé dans la feuille
            For C = 12 To 2 Step -1     ' Pour les colonnes de B à L
                With Sheets(F.Name)     ' Avec la feuille courante
                    If Application.CountIf(.Range(.Cells(1, C), .Cells(40, C)), Name) > 0 Then  ' Si nom présent dans la colonne
                        L = Application.Match(Name, .Range(.Cells(1, C), .Cells(40, C)), 0)     ' On mémorise la ligne
                        If .Cells(L, 1) = Role Then                                             ' Si le Role est ok
                            For C2 = C To C - 3 Step -1                                         ' On cherche la date ( problème des cellules fusionnées )
                                If .Cells(1, C2) <> "" Then JourTrouvé = .Cells(1, C2): _
                                Période = .Cells(2, C2): S = .Cells(1, 1): Exit For             ' Si trouvé on mémorise le jour
                            Next C2
                            If JourTrouvé > Jour Then Jour = JourTrouvé: Feuille = F.Name       ' Si ce jour est plus récent que celui mémorisé
                        End If
                    End If
                End With
            Next C
        End If
    End If
Next F
If Jour > 0 Then    ' On restitue les résultats si u jour touvé sinon on dit que c'est raté.
    UserForm1.Reponse = "La dernière date touvée en " & Feuille & "   ( " & S & " )" & Chr(10) & "où " & Name & _
                        " a occupé le poste " & Role & Chr(10) & "est le " & Jour & ".  " & _
                        "( " & Replace(Période, Chr(10), " ") & " )"
Else
    UserForm1.Reponse = "Pas de correspondance trouvée. Sorry!"
End If
End Sub
Private Sub Fermer_Click()  ' On ferme l'userform
Unload UserForm1
End Sub
 

Pièces jointes

  • ESSAI PLANNING.xlsm
    45.2 KB · Affichages: 4

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re, bonjour Patrick,
@Sephiro18,
En relisant j'ai relevé une ambiguïté dans la demande :
c'est de rechercher un operateur sur un poste précis pour trouver la dernière date à laquelle il a été sur le poste
et
Il faut prendre la date la plus ancienne si l'opérateur a été plusieurs fois sur le poste.
Pour moi " la dernière date" est la date la plus récente, donc si on a plusieurs réponses on prend la date la plus récente et non la date la plus ancienne.
C'est ce que fait ma PJ, sinon je ferais la modif.
 

Statistiques des forums

Discussions
312 209
Messages
2 086 259
Membres
103 167
dernier inscrit
miriame