Filtre élaboré avec critère sur colonne contenant formule datdif.

fred777

XLDnaute Junior
Bonjour à tous,

Voici mon problème.

J'ai une bdd de mes salariés avec une colonne AN où la formule "=DATEDIF(J2;AUJOURDHUI();"Y")" me renvoie l'ancienneté du salarié en année.

J'ai un formulaire qui me permet de filtrer mes salariés selon différents critères (type de contrat, age, lieu de travail, etc ...)

Ce formulaire fonctionne très bien sauf pour mon critère relatif à l'ancienneté. Il me renvoie systématiquement 0 résultat.

La comboBox relatif au critère d'ancienneté est alimenté comme ça :

ComboBox3.AddItem "5" (pour filtrer les salariés ayant plus de "5" ans d'ancienneté)
ComboBox3.AddItem "10"
ComboBox3.AddItem "20"

Mon formulaire de critère de selection se présente comme suit :

Private Sub CmdVoir_Click()


'Nom jeune fille
If ComboBox2.ListIndex <> -1 Then
jeunefille = ComboBox2.Value
Criteres = Criteres & "(bdd!AQ2 = """ & jeunefille & """) * "
End If

'Statut
If CboStatut.ListIndex <> -1 Then
statut = CboStatut.Value
Criteres = Criteres & "(bdd!H2 = """ & statut & """) * "
End If

'Type de contrat
If CboNatcontrat.ListIndex <> -1 Then
contrat = CboNatcontrat.Value
Criteres = Criteres & "(bdd!AA2 = """ & contrat & """) * "
End If

'Affectation
If CboAffectation.ListIndex <> -1 Then
Affectation = CboAffectation.Value
Criteres = Criteres & "(bdd!X2 = """ & Affectation & """) * "
End If

'Horaire
If CboHorairecont.ListIndex <> -1 Then
Horairecont = CboHorairecont.Value
Criteres = Criteres & "(bdd!Q2 = """ & Horairecont & """) * "
End If

'Ancienneté
If ComboBox3.ListIndex <> -1 Then
ancienneté = ComboBox3.Value
Criteres = Criteres & "(bdd!AN2 >= """ & ancienneté & """) * "
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 inter^rété de la même façon par excel.
Criteres = "=" & Criteres & "1"
Sheets("filtre").Range("A2").Value = Criteres

'on utilise ensuite les critères de choix dans un filtre élaboré sur une feuille masquée
Sheets("filtre").Activate
Range("zonebdd").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("A1:A2"), CopyToRange:=Range("A4:AV4"), Unique:=False


'Si aucun nom ne correspond aux critères
If Range("filtre!A5").Value = "" Then
MsgBox ("Aucun nom ne répond à tous vos critères")
'S'il y a plus d'un nom répondant au critère autrement dit si A5 non vide
'on réaffiche les recettes dans une zone de liste pour en faire choisir une à l'utilisateur
'pour cela on nomme "Fiches Filtrées" la plage contenant les noms sélectionnés.
'Il y a plusieurs façons de faire pour indiquer les coordonnées de cette plage. Ici j'ai choisi
'la fonction décaler (offset en VBA)

ElseIf Range("filtre!A5").Value <> "" Then
ActiveWorkbook.Names.Add Name:="Fiche", RefersToR1C1:= _
"=OFFSET(filtre!R5C2,,,COUNTA(filtre!C2)-1)"
Unload frmCriteres
frmSelect.Show

'sinon on récupère son numéro de ligne et on affiche la fiche salarié dans le userform frmFiche
Else
nom = Range("A5").Value
With Sheets("bdd").Range("A:A")
Set c = .Find(Titre, LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then Lig = c.Row
End With
frmFiche.Show
End If

End Sub

Je ne comprend pas pourquoi tous les autres critères fonctionnent et pas celui-ci. Je cherche depuis des semaines et m'arrache les cheveux.

Merci de vos lumières.
 

Caillou

XLDnaute Impliqué
Re : Filtre élaboré avec critère sur colonne contenant formule datdif.

Bonjour,

Je n'ai pas tout regardé, mais ne s'agirait-il pas d'un problème de type de données : la colonne AN fournit par la fonction DATEDIF est de type Numérique et les tranches d'ages du ComboBox de type Texte ?

Caillou
 

Caillou

XLDnaute Impliqué
Re : Filtre élaboré avec critère sur colonne contenant formule datdif.

Re,

C'est bien ce que je pensais, un problème de conversion.
Dans la procédure Private Sub CmdVoir_Click()
il faut modifier les 2 lignes suivantes :
Code:
anciennete = CInt(ComboBox3.Value)
Criteres = Criteres & "(bdd!AN2 >= " & anciennete & ") * "
Pour la première, CInt pour convertir la valeur sélectionné en Integer
Et pour la 2ème, ne plus encadrer anciennete par des guillemets

Caillou
 

fred777

XLDnaute Junior
Re : Filtre élaboré avec critère sur colonne contenant formule datdif.

Bonjour Caillou,

Merci beaucoup, cela fonctionne à merveille ! T'es trop fort.

Au risque de paraître exigeant, j'aurai une autre demande. En fait l'ancienneté des agents figure en colonne K (toujours avec DATEDIF mais sous la forme (1 an, 1 mois, 1 jour). Est-il possible de filtrer cette colonne ? J'ai essayé avec ta formule, mais cela ne fonctionne pas.

Par ailleurs, comment alimenter mon comboBox3 mais avec des valeurs du genre "supérieur ou égale à 20 ans" et non pas simplement "20".

Merci d'avance.

Cordialement.

fred777
 

Caillou

XLDnaute Impliqué
Re : Filtre élaboré avec critère sur colonne contenant formule datdif.

Re,

Pour la 1ère partie, je ne sais pas

Pour la 2ème :
dans la procédure Private Sub UserForm_Initialize()
tu modifies les 3 lignes suivantes
Code:
ComboBox3.AddItem ">=5"
ComboBox3.AddItem ">=10"
ComboBox3.AddItem ">=20"

Ce qui t'obliges à re-modifier dans la procédure Private Sub CmdVoir_Click() les lignes du filtre comme suit :
Code:
If ComboBox3.ListIndex <> -1 Then
anciennete = ComboBox3.Value
Criteres = Criteres & "(bdd!AN2 " & anciennete & ") * "
End If
Car du coup, il ne faut plus faire la conversion.

Caillou
 

fred777

XLDnaute Junior
Re : Filtre élaboré avec critère sur colonne contenant formule datdif.

Bonjour Caillou,

Merci encore pour ton aide.

Je rencontre un nouveau problème que je ne parviens pas à résoudre.

En effet, j'ouvre mon usf critères puis en cliquant dans la liste j'obtiens la fiche agent (frmFiche). Si depuis cet usf je clique sur "modifier la fiche", les données s'affichent correctement, mais lorsque je valide la modification, j'ai l'erreur suivante : "erreur 400 Feuille déjà affichée, affichage modal impossible".

Merci encore de ton aide.
 

Caillou

XLDnaute Impliqué
Re : Filtre élaboré avec critère sur colonne contenant formule datdif.

Bonjour,

Désolé, mais chez moi cela fonctionne lorsque je vais cette manipulation.

Caillou
 

Pièces jointes

  • 1.PNG
    1.PNG
    13.2 KB · Affichages: 97
  • 2.PNG
    2.PNG
    10 KB · Affichages: 78
  • 1.PNG
    1.PNG
    13.2 KB · Affichages: 107
  • 2.PNG
    2.PNG
    10 KB · Affichages: 94
  • 1.PNG
    1.PNG
    13.2 KB · Affichages: 96
  • 2.PNG
    2.PNG
    10 KB · Affichages: 97

fred777

XLDnaute Junior
Re : Filtre élaboré avec critère sur colonne contenant formule datdif.

Re,

En fait lorsque j'ouvre le formulaire Fiche et que je le modifie, cela fonctionne.
Le problème c'est lorsque j'ouvre selection agent et je filtre par les critères (par exemple par "Nom de jeune fille") lorsque je clique sur un nom dans le usf résultat du filtre j'arrive sur la fiche et c'est lorsque je veux modifier cette fiche que j'ai cette erreur.

J'espère être clair.
 

Caillou

XLDnaute Impliqué
Re : Filtre élaboré avec critère sur colonne contenant formule datdif.

oui, c'est clair !
j'ai fait le test, effectivement ça plante.
une procedure évenementielle tente d'afficher (méthode show) un userform qui est déja affiché (d'où le plantage)
il faudrait surement rajouté un test pour que cette proc ne s'exécute pas dans ce cas là (mais là il y a trop de code pour que je puisse effectuer les tests)

caillou
 

Discussions similaires

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 813
dernier inscrit
kaiyi