Filtrer avec 2 valeurs de ComboBox
Bonsoir le forum
Je cherche à masquer un calendrier en fonction du choix fait dans 2 Combobox
CbxMDEBUT ( Mois de Début) & CbxMFIN (Mois de fin)
Explication:
Dans le Tableau "GMP" je voudrais filtrer avec CbxMDEBUT la colonne DDO et avec CbxMFIN je voudrais filter la colonne DFO,
ce qui va me donner un intervalle soit de 1 mois ou 2 ou ect.
J'ai commencé , mais je n'ai pas réussi à modifier le format des combobox en "mmm"
Puis dans le calendrier (Tableau à droite de "GMP") l'affichage sera fait suite au choix de cet intervalle. ( Il y a que 3 mois dans mon exemple)
Donc si je choisis Janvier et février le calendrier masque le mois de Mars (Initialement le calendrier va jusqu'au mois de septembre)
J'espère que je suis assez explicite.
J'ai commencé mais je but .
Merci de votre aide et bonne soirée à tous
Bonjour,
Voici, lorsque vous sélectionnez une date du mois de début, la combobox du mois de fin ne se remplira qu'avec les dates possibles. si après avoir fait votre choix , vous décidez de changer de mois, cliquez d'abord sur le bouton "Supprimer les filtres" (inclus dans le formulaire) pour réinitialiser les comboboxes.
Cdlt
Edit: après réflexion, je pense que ce n'est pas exactement ce que vous souhaitez, je vous prépare une autre solution.
ReEdit:
Voilà l'autre solution, plus adaptée à votre demande. il est inutile d'afficher le mois en lettre dans les comboboxes, sélectionnez une date quelconque du mois choisi et le code se chargera de faire la recherche sur la période entière.
Bonjour le Forum
Bonjour Arturo83 et merci.
j'ai regardé tes 2 propositions, il est vrai que la seconde, je la préfère (l'affichage du mois n'est pas forcement utile),même si je n'ai pas encore compris tout le code associé.
Une demande que je n'ai surement pas bien expliqué:
Serait-il possible que le calendrier ( à droite du tableau "GMP") n'affiche que la sélection des combobox ?
si je sélectionne:
MOIS DEBUT -> 18/01/2024
MOID FIN -> 28-02-2024
Alors je masque les autres mois et me positionne sur le début du mois?
Donc Janvier à Février
Merci de ton aide
Bonne journée à tous
Voici avec la modification demandée.
Les colonnes en dehors des mois sélectionnés sont masquées en même temps que les lignes.
Important: SI vous avez déjà fait une recherche avec le formulaire, puis que vous vouliez choisir une autre date de début ou de fin et que, vous obteniez un message d'erreur, cela est dû au fait que le mois affiché est déjà masqué par la sélection précédente, il suffit dans ce cas de "Supprimer le filtre" pour ré-afficher toutes les périodes et de recommencer la sélection, ou fermer le formulaire et recommencer.
Cdlt
Bonsoir le Forum
Re Arthuro83
Grand merci à toi,
au départ quand j'ai voulu essayer ton nouveau code, rien ne se passer au niveau du filtrage sur la tableau planning.
J'ai lu ton code et je me suis aperçu ( enfin je l’espère) que ce code ne fait pas la bonne référence de ligne pour pouvoir faire le masque.
Sub Masquage_Planning_Debut()
Dim Derlig As Long
DerCol = ActiveSheet.Range("ZZ5").End(xlToLeft).Column
'Recherche MoisDebut
If MoisDebut <> "" Then
With Range(Cells(4, "A"), Cells(4, DerCol))
Set x = .Find(UCase(Replace(Replace(MoisDebut, "é", "e"), "û", "u")) & " " & AnneeDebut, LookIn:=xlValues)
If Not x Is Nothing Then
If x.Column <> 9 Then
Set SelectedRange = Range(Cells(1, 9), Cells(Rows.Count, x.Column - 1))
SelectedRange.EntireColumn.Hidden = True
End If
End If
End With
End If
End SubJ'ai donc modifié comme cela
Sub Masquage_Planning_Debut()
Dim Derlig As Long
DerCol = ActiveSheet.Range("ZZ5").End(xlToLeft).Column
'Recherche MoisDebut
If MoisDebut <> "" Then
With Range(Cells(5, "A"), Cells(5, DerCol))
Set x = .Find(UCase(Replace(Replace(MoisDebut, "é", "e"), "û", "u")) & " " & AnneeDebut, LookIn:=xlValues)
If Not x Is Nothing Then
If x.Column <> 9 Then
Set SelectedRange = Range(Cells(1, 9), Cells(Rows.Count, x.Column - 1))
SelectedRange.EntireColumn.Hidden = True
End If
End If
End With
End If
End Suben fait c'est cette ligne, ou j'ai remplacé 4 par 5
With Range(Cells(5, "A"), Cells(5, DerCol))Par contre je ne comprend pas pourquoi :
Set SelectedRange = Range(Cells(1, 9), Cells(Rows.Count, x.Column - 1))Ligne 1 colonne 9 (Ok pour 9) mais pourquoi ligne 1
à moins que je me trompe dans mon analyse.
Pour ce soir, je vais continuer à comprendre ton code ( encore merci) et dans la semaine je vais le mettre en place dans mon fichier de travail actuel ton code.
comme je l’utilise chaque jours , il faut que je vérifie que je ne perds pas de données.
j'ai un doute sur la façon que j'ai mis :
'Pas de doublons dans la liste
If CbxMDEBUT.ListIndex = -1 Then CbxMDEBUT.AddItem Range("E" & I)Car je dois forcément avoir des doublons .
Bonne soirée Arthuro83 et je me répète mais Merci
Bonne soirée au forum
Bonjour,
Au départ quand j'ai voulu essayer ton nouveau code, rien ne se passer au niveau du filtrage sur la tableau planning. J'ai lu ton code et je me suis aperçu ( enfin je l’espère) que ce code ne fait pas la bonne référence de ligne pour pouvoir faire le masque.
Bizarre, le code doit faire la recherche sur la ligne 4 pour y rechercher le nom du mois, (ce dernier est construit dans la formule, exemple: ="JANVIER"&" "&Année1) or, le nom du mois dans la formule est en majuscules alors que dans l'extraction de la combobox, il est en minuscules accentuées.
Pour comparer le mois extrait de la date de la combobox avec celui de la formule, il faut dans un premier temps remplacer toutes les lettres accentuées par les mêmes lettres sans accents et enfin convertir le mois de la combobox en majuscules. A partir de là, on recherche ce mois dans la ligne 4.
Sur cette ligne 4, la cellule du mois cherché correspond toujours au 1er jour du mois (puisque les cellules sont fusionnées sur tout le mois), ceci nous permet de supprimer toutes les colonnes qui sont avant celle-ci, ceci c'est pour ce qui concerne les mois avant le mois de début.
Pour masquer les mois en dehors du mois de fin, on adopte le même principe sauf que cette fois-ci, il faut y ajouter le nombre de jour du mois qui est variable. ainsi on peut masquer toutes les colonnes comprises entre la date qui suit le dernier jour du mois recherché et la dernière colonne.
***************************************************************************************************************
Par contre je ne comprend pas pourquoi :
Set SelectedRange = Range(Cells(1, 9), Cells(Rows.Count, x.Column - 1))Ligne 1 colonne 9 (Ok pour 9) mais pourquoi ligne 1
Pour sélectionner un ensemble de colonne, on écrirait par exemple: Columns("A:K"), or, il se trouve que nous avons une inconnue puisque nous ne connaissons pas la dernière colonne. il faut donc lui attribuer une variable, ici: "x". Le problème c'est qu'on ne peut pas écrire la formule Column("A:K") avec une variable à la place de "K", il faut donc procéder autrement et, au lieu de sélectionner les colonnes entières, il faut sélectionner toutes les cellules de la ligne 1 à la dernière ligne et partant de là, on peut appliquer le masquage.
******************************************************************************************************************
j'ai un doute sur la façon que j'ai mis :
'Pas de doublons dans la liste
If CbxMDEBUT.ListIndex = -1 Then CbxMDEBUT.AddItem Range("E" & I)Car je dois forcément avoir des doublons .
Je ne me suis pas occupé de cette partie là, mais si vous ne voulez pas de doublons, il vaut mieux passer par un dictionnaire, ce qui pour la combobox DEBUT, donnerait quelque chose comme ceci:
Set d = CreateObject("Scripting.Dictionary")
For Each c In Range("E6:E" & DerLig)
If Not d.exists(c.Text) And c.Text <> "" Then d(c.Text) = ""
Next c
CbxMDEBUT.List = d.keysJe n'ai pas testé, je vous laisse le soin de le faire vous-même.
Cdlt
Bonjour le Forum
Bonjour Arturo83
De retour sur mon sujet la semaine dernière (Trop de contrainte avant ), j'ai mis le code dans le fichier principal.
Quelques bogues, mais rien d’insurmontable.
Donc merci au forum et Arturo83
Concernant
Set d = CreateObject("Scripting.Dictionary")
For Each c In Range("E6:E" & DerLig)
If Not d.exists(c.Text) And c.Text <> "" Then d(c.Text) = ""
Next c
CbxMDEBUT.List = d.keysJe n'ai pas su le mettre en place , mais après réflexion:
si j’enlève les doublons dans la liste -> je supprime des lignes puisque il y a forcément des dates identiques -> la synthèse est fausse.
Je me trompe ?
Bonne fin de journée à tous
Bonjour,
Le sujet commence à dater un peu, donc j'ai un peu décroché.
Pour la macro CbxMDEBUT et ne pas avoir de dates en doublons dans la combobox, essayer ceci:
Private Sub CbxMDEBUT_DropButtonClick()
Dim DerligE As Long
Dim c As Range
Dim d As Object
DerligE = ActiveSheet.Range("F" & Rows.Count).End(xlUp).Row
Set d = CreateObject("Scripting.Dictionary")
For Each c In Range("E6:E" & DerligE)
If Not d.exists(c.Text) And c.Text <> "" Then d(c.Text) = ""
Next c
CbxMDEBUT.List = d.keys
End SubVous pouvez appliquer le même principe sur la CbxMFIN.
Cdlt
Bonsoir le forum, Arturo83
J'ai essayé ton code, mais je suis bloqué par cette procédure puisque je travail avec CDate
Sub TrierMD(CbxMDEBUT)
Dim a, b, t As Integer
With CbxMDEBUT
t = .ListCount - 1
For a = 0 To t - 1
For b = a + 1 To t
If CDate(.List(a)) > CDate(.List(b)) Then
w = CDate(.List(a))
.List(a) = .List(b)
.List(b) = w
End If
Next b
Next a
End With
End SubDonc en faisant des recherche et m’appuyant sur ta proposition, j'ai écrit cela qui fonctionne
'###PROCEDURE CHARGER LA COLONNE E DS Combobox "CbxMDEBUT"
Private Sub CbxMDEBUT_DropButtonClick()
Dim DerligE As Long
Dim I As Integer
Dim dictionary
Dim d As Object
Dim c As Variant
'On Met dans une variable la dernière ligne de la colonne "E"
DerligE = ActiveSheet.Range("E" & Rows.Count).End(xlUp).Row
Rows("6:" & DerligE).Hidden = False
Columns("I:NK").Hidden = False
Set dictionary = CreateObject("Scripting.Dictionary")
For Each c In Range("E6:E" & DerligE)
dictionary.Item(c.Value) = c.Value
Next c
CbxMDEBUT.List = dictionary.items
' Mise en forme
MoisDebut = Format(CbxMDEBUT, "mmmm")
' Si la liste n'est pas vide alors aller à la procédure TRIER ASCENDANT CbxMDEBUT
If CbxMDEBUT.ListCount > -1 Then Call TrierMD(CbxMDEBUT)
'Si la liste n'est pas vide alors prendre l'année Ds CbxMDEBUT
If CbxMDEBUT.ListIndex > -1 Then AnneeDebut = Year(CbxMDEBUT)
'Aller vers procédure MASQUE PLANNING
Set dictionary = Nothing
Masquage_Planning_Debut
End Subma question est:
le code est-il correct ?
Set dictionary = CreateObject("Scripting.Dictionary")
For Each c In Range("E6:E" & DerligE)
dictionary.Item(c.Value) = c.Value
Next c
CbxMDEBUT.List = dictionary.itemset pour vider le dictionnaire
Set dictionary = Nothingj'ai vu une autre façon avec Removeall, avec des avis différents .
Serait-il possible d'avoir un avis svp
Merci
Bonne soirée à tous
Bonjour,
Pourriez-vous me retourner le fichier avec vos dernières modifications?
pour vider le dictionnaire, Set Dictionary = Nothing et Dictionary.RemoveAll n'ont pas la même utilité:
Set Dictionary = Nothingdésaffecte la variable et libère la mémoire. Dictionary est détruit, en clair, cela se met à la fin de la macro.Dictionary.RemoveAllvide le Dictionnaire existant et peut être réutilisé sans avoir besoin de re-déclarer la variable, donc utile dans une boucle si l'on doit recréer une nouvelle liste.- Cdlt