Filtre et date VBA

Bonjour à tous,

J'ai un petit problème sur vba pour filtrer une base de donnée à partir de date.

Je souhaite à partir d'une colonne de date (dans une base de donnée), filtrer les lignes correspondantes à la date choisie.

Le filtre est également utilisé pour filtrer par rapport à d'autres critères (type, zone etc...) --> Pour ces critères, le filtre fonctionne trés bien, mais pour les dates il ne me trouve pas de solutions, alors que j'utilise la même méthode que pour les autres.

C'est certainement un autre type d'écriture pour les dates et je souhaite avoir de l'aide.

A savoir que les colonnes de date sont au format "date"

La variable utilisée est "DateP"

Voici le programme :

Dim F

Private Sub UserForm_Initialize()

' Activation liste cascade
Set F = Sheets("Zone") 'Menu cascade pour zone/equip
  Set mondico = CreateObject("Scripting.Dictionary")
  For Each c In Range(F.[A2], F.[A65000].End(xlUp))
    mondico(c.Value) = c.Value
  Next c
  Me.CboSecteur.List = mondico.items

    'préparation liste des numéros déjà enregistrés
    ListNuméros.RowSource = ("Archives!Numéros")

    'préparation liste des demandeurs potentiels
    CboDemandeur.RowSource = ("Code!Demandeur")
    CboDemandeur.ListIndex = -1

 CboDate.RowSource = ("Code!Date")
   CboDate.ListIndex = -1

    'préparation liste des services potentiels
End Sub

Private Sub CboSecteur_Change()
  Set mondico = CreateObject("Scripting.Dictionary")
  For Each c In Range(F.[A2], F.[A65000].End(xlUp))
    If c = Me.CboSecteur Then mondico(c.Offset(, 1).Value) = c.Offset(, 1).Value
  Next c
  Me.CboZone.List = mondico.items
  Me.CboZone.ListIndex = -1
  Me.CboEquipement.ListIndex = -1
End Sub

Private Sub CboZone_Change()
  Set mondico = CreateObject("Scripting.Dictionary")
  For Each c In Range(F.[A2], F.[A65000].End(xlUp))
    If c = Me.CboSecteur And c.Offset(, 1) = Me.CboZone Then mondico(c.Offset(, 2).Value) = c.Offset(, 2).Value
   Next c
   Me.CboEquipement.List = mondico.items
   Me.CboEquipement.ListIndex = -1
End Sub

Private Sub CboDate_Change()

CboDate.Value = Format(CboDate.Value, "dd/mm/yyyy")

End Sub

Private Sub ListNuméros_Click()
    'si clic sur un numéro, lance Usfaffiche avec les données de cette demande
    Numtravaux = ListNuméros.Value

    With Sheets("archives").Range("a:a")
        'recherche dans la table de données le N° de ligne
        'correspondant au numéro sélectionné
        Set c = .Find(Numtravaux, LookIn:=xlValues, lookat:=xlWhole)
        'la variable Lig, correspondant au numéro de la ligne trouvée, est définie comme une variable
        'publique dans le module général déclarations. Ceci permet de passer sa valeur d'un userform à un autre.
        If Not c Is Nothing Then Lig = c.Row
    End With

    'décharger (sera réinitialisé au prochain appel de procédure)
    Unload UsfSélection

    'afficher la demande
    UsfAffiche.Show
End Sub

Private Sub CmdVoir_Click()
    'création du(des) critère(s)
    Dim Critere As String
    Dim Demandeur As String
    Dim Secteur As String
    Dim Zone As String
    Dim DateP As Date
    Dim Equipement As String
    Dim Terminé As String
    Dim EnCours As String
    Dim Titre As String

    'récupération des différents critères de choix demandés et construction d'un critère composé
    'qui sera utilisé dans un filtre élaboré,
    'NB: dans la construction du critère, bien indiquer sur quelle feuille est la base de données
    'NB: dans un filtre on fait référence à l'adresse de la première valeur de la colonne et non
    'à celle de l'étiquette. La table est en feuille "Archives" avec les
    'étiquettes de champ en ligne 1 et la première fiche en ligne 2.
    'Le critère fera référence à "Archives!C2" pour un critère portant sur le demandeur.

    'dans la construction du critère, on cherche tous les champs remplis et on va multiplier les
    'critères entre eux pour imposer que toutes les conditions demandées soient remplies. d'où
    'le signe * en fin de critère pour préparer le suivant.

    'Demandeur
    If CboDemandeur.ListIndex <> -1 Then
        Demandeur = CboDemandeur.Value
        Critere = Critere & "(archives!F2 = """ & Demandeur & """) * "
    End If

    'Secteur
    If CboSecteur.ListIndex <> -1 Then
        Secteur = CboSecteur.Value
        Critere = Critere & "(archives!G2=""" & Secteur & """) * "
    End If

    'Zone
    If CboZone.ListIndex <> -1 Then
        Zone = CboZone.Value
        Critere = Critere & "(archives!H2=""" & Zone & """) * "
    End If

    'Date
    If CboDate.ListIndex <> -1 Then
        DateP = CboDate.Value
        CboDate.Value = Format(CboDate.Value, "dd/mm/yyyy")
        Critere = Critere & "(archives!D2=""" & DateP & """) * "
    End If

    'Equipement
    If CboEquipement.ListIndex <> -1 Then
        Equipement = CboEquipement.Value
        Critere = Critere & "(archives!I2=""" & Equipement & """) * "
    End If

    'Terminé
    If ChkTerminé = True Then Terminé = "oui"
        If Terminé = "oui" Then
            Critere = Critere & "(archives!AB2=""" & Terminé & """) * "
        End If

    'EnCours
    If ChkEnCours = True Then EnCours = "non"
        If EnCours = "non" Then
            Critere = Critere & "(archives!AB2=""" & EnCours & """) * "
        End If

    'à ce stade le critère se termine par *... On ajoute donc un 1. Un critère renvoie normalement
    'vrai ou faux. En le multipliant par 1 il renvoie 1 ou 0 ce qui est interprété de la même façon par excel.
    Critere = "=" & Critere & "1"
    Sheets("filtre").Range("A2").Value = Critere

    'on utilise ensuite les critères de choix dans un filtre élaboré sur la feuille Filtre

    Sheets("Filtre").Activate
    Range("zonebdd").AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Range("A1:A2"), CopyToRange:=Range("A4:AA4"), Unique:=False

    'Si aucune demande ne correspond aux critères
    If Range("Filtre!B5").Value = "" Then
        MsgBox ("Aucune demande ne répond à tous vos critères")
        Unload UsfSélection
        UsfSélection.Show

    'S'il y a plus d'une demande répondant au critère (=si qqch dans A6)
    'on réaffiche les demandes dans une zone de liste pour en faire choisir une à l'utilisateur
    'la plage "Fiches Filtrées" (plage nommée avec Décaler) servira de base à la liste
    ElseIf Range("filtre!B6").Value <> "" Then
        Unload UsfSélection
        UsfSelect2.Show

    'sinon on récupère son numéro de ligne et on affiche la demande dans le userform UsfAffiche
    Else
        Titre = Range("A5").Value
        With Sheets("archives").Range("A:A")
            Set c = .Find(Titre, LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then Lig = c.Row
        End With
        Unload UsfSélection
        UsfAffiche.Show
    End If

End Sub

PS : Le fichier utilisé est professionnel, et je ne peux pas le transmettre, j'ai repéré en rouge les lignes qui correspondent aux dates

Merci d'avance !

EDIT : Je pense que le problème est qu'on ne peut pas filtrer des noms et des dates en même temps, non ?

1f basededonnee cbo

Bonjour Furor,

Pour plus de lisibilité de ton post, utilise les balises de code (que tut trouveras juste au dessus de la zone dans laquelle tu tapes ton message, à gauche, juste après les "Quote")

Edite ton message, ça sera plus facile à lire...

Et sinon, les dates se comportent un peu spécifiquement dans VBA, et sont assez souvent affichées ou stockées en texte, tu peux utiliser la fonction CDate ou Format (si tu sais comment sont présentées tes dates) pour récupérer la valeur!

DateP = CDate(CboDate.Value)

essaye quelque chose dans ce genre là...

Je repasserai bientôt pour relire tout ça quand j'aurais plus de temps! (la j'y suis au boulot! )

Merci, j'ai actualisé

Personne ne sait où est mon erreur ?

Bonjour Furor,

Tu as essayé le CDate? je crois qu'il y a d'autres formules du genre mais j'ai plus en tête!

Pour le critère, ta construction a l'air de s'appuyer sur du texte mais si tu filtres sur une feuille Excel, tes dates sont en chiffres affichés dans un certain format, donc avec la conversion de CDate, ça me paraît être au moins un bon début même si t'auras ptet à retoucher au critère (pas sûr...)

Excel stocke les dates en chiffres, mais pas VBA et surtout pas en userform, donc il faut que tu fasses bien la conversion à chaque utilisation, dans un sens comme dans l'autre (CStr pour convertir en texte)

Et si le problème ne vient pas de là, c'est très probablement soit dans la construction de ton dico ou de tes critères que ça pêche.

Rechercher des sujets similaires à "filtre date vba"