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 SubPS : 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 ?
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!
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.