Filtrer un tableau en fonction de la valeur de deux cellules

Ste Barbe

XLDnaute Nouveau
Bonjour à tous,
J'ai besoin de votre aide.

J'ai un tableau : liste de produits avec info, notamment leur rangement, par labo et par armoire.
Je souhaite pouvoir filtrer ce tableau en fonction de la valeur de deux cellules : une cellule avec le nom du labo, une seconde avec le nom de l'armoire.

Ce fichier est déjà utilisé et les utilisateurs ne souhaite pas de gros changement d'interface, et surtout pas de tableau croisé dynamique.
J'ai déjà essayé une macro trouvé sur un sujet similaire en l'adaptant (là il s'agissait de filtrer selon la valeur d'une seule cellule).
Lien vers la discussion en question : https://www.excel-downloads.com/threads/pb-extraction.75576/

J'ai également essayé sans VBA avec la fonction Filtre avancé, mais dans les deux cas je n'obtiens pas de résultat.

Je vous joins mon fichier de travail "vidé" d'un grand nombre d'informations, mais j'espère avec l'essentiel.
Sur l'onglet [Listes] j'ai repris ce que je viens de vous exposer avec les valeurs des cellules à considérer.

Merci d'avance pour votre aide et vos réponses.

Bonne fin de journée,
Cordialement, Ste Barbe
 

Fichiers joints

Jacky67

XLDnaute Accro
Bonjour à tous,
J'ai besoin de votre aide.

J'ai un tableau : liste de produits avec info, notamment leur rangement, par labo et par armoire.
Je souhaite pouvoir filtrer ce tableau en fonction de la valeur de deux cellules : une cellule avec le nom du labo, une seconde avec le nom de l'armoire.

Ce fichier est déjà utilisé et les utilisateurs ne souhaite pas de gros changement d'interface, et surtout pas de tableau croisé dynamique.
J'ai déjà essayé une macro trouvé sur un sujet similaire en l'adaptant (là il s'agissait de filtrer selon la valeur d'une seule cellule).
Lien vers la discussion en question : https://www.excel-downloads.com/threads/pb-extraction.75576/

J'ai également essayé sans VBA avec la fonction Filtre avancé, mais dans les deux cas je n'obtiens pas de résultat.

Je vous joins mon fichier de travail "vidé" d'un grand nombre d'informations, mais j'espère avec l'essentiel.
Sur l'onglet [Listes] j'ai repris ce que je viens de vous exposer avec les valeurs des cellules à considérer.

Merci d'avance pour votre aide et vos réponses.

Bonne fin de journée,
Cordialement, Ste Barbe
Bonjour,

Une proposition à tester en pj,
Si toutefois... j'ai bien compris. :D
 

Fichiers joints

Dernière édition:

Ste Barbe

XLDnaute Nouveau
Bonjour @mapomme et @Jacky67 ,
Merci pour vos réponses rapides !

Désolée mapomme, mon besoin correspond plus à ce que Jacky a réalisé

Je voulais juste revenir sur certains point, pour être certaine d'avoir bien compris et ne pas exploiter votre travail sans réfléchir.

Je vous mets mon morceau de code largement inspiré de ce qu'a fait Jacky :
Sub Filtrage()
On Error Resume Next

Application.ScreenUpdating = Fasle
'Evite la mise à jour de l'écran pendant l'exécution de la macro => Gain de temps

Dim ChoixLabo
Dim ChoixArmoire
'Déclaration de variables

With Feuil1
.AutoFilterMode = False
'Retire tous les filtres => Toutes les colonnes développées en entier

ChoixLabo = Range("D2").Value
ChoixArmoire = Range("F2").Value

'MsgBox (ChoixLabo)
'MsgBox (ChoixArmoire)
'MsgBox ("plage" & ChoixLabo)
'Tests lors de la rédaction du code

Range("plage" & ChoixLabo).AutoFilter
'Va filtrer sur la plage de données correspondant au labo sélectionné en D2
Field = Application.Match(ChoixArmoire, Range("plage" & ChoixLabo).Resize(1), 0)
'Applique le filtre sur la colonne correspondant à l'armoire sélectionnée en F2
Criteria1 = "<>"
'Ne garde que les non-vides

'Application.Goto (A4)
End With

Application.ScreenUpdating = True
'Mise à jour de l'écran

End Sub


J'ai quelques questions
1) Pourquoi Feuil1 ?
2) Pourquoi Application. en début de certaines commandes ? J'ai déjà vu des Function. ou même rien, mais je connais pas la différence
3) La code tourne (pas de problème au débogage, même en pas à pas), par contre le filtre ne se fait pas. Le filtre se crée (en tête des colonnes choisies, tout bien comme il faut) mais toutes les lignes restent visibles, pas seulement les non-vides
J'ai un message d'erreur quand j'écris field:= ou criteria1:= (c'est pour ça juste =)

J'espère être assez claire,
En tout cas merci beaucoup !
Ste Barbe
 

Jacky67

XLDnaute Accro
Bonjour @mapomme et @Jacky67 ,
Merci pour vos réponses rapides !

Désolée mapomme, mon besoin correspond plus à ce que Jacky a réalisé

Je voulais juste revenir sur certains point, pour être certaine d'avoir bien compris et ne pas exploiter votre travail sans réfléchir.

Je vous mets mon morceau de code largement inspiré de ce qu'a fait Jacky :
Sub Filtrage()
On Error Resume Next

Application.ScreenUpdating = Fasle
'Evite la mise à jour de l'écran pendant l'exécution de la macro => Gain de temps

Dim ChoixLabo
Dim ChoixArmoire
'Déclaration de variables

With Feuil1
.AutoFilterMode = False
'Retire tous les filtres => Toutes les colonnes développées en entier

ChoixLabo = Range("D2").Value
ChoixArmoire = Range("F2").Value

'MsgBox (ChoixLabo)
'MsgBox (ChoixArmoire)
'MsgBox ("plage" & ChoixLabo)
'Tests lors de la rédaction du code

Range("plage" & ChoixLabo).AutoFilter
'Va filtrer sur la plage de données correspondant au labo sélectionné en D2
Field = Application.Match(ChoixArmoire, Range("plage" & ChoixLabo).Resize(1), 0)
'Applique le filtre sur la colonne correspondant à l'armoire sélectionnée en F2
Criteria1 = "<>"
'Ne garde que les non-vides

'Application.Goto (A4)
End With

Application.ScreenUpdating = True
'Mise à jour de l'écran

End Sub


J'ai quelques questions
1) Pourquoi Feuil1 ?
2) Pourquoi Application. en début de certaines commandes ? J'ai déjà vu des Function. ou même rien, mais je connais pas la différence
3) La code tourne (pas de problème au débogage, même en pas à pas), par contre le filtre ne se fait pas. Le filtre se crée (en tête des colonnes choisies, tout bien comme il faut) mais toutes les lignes restent visibles, pas seulement les non-vides
J'ai un message d'erreur quand j'écris field:= ou criteria1:= (c'est pour ça juste =)

J'espère être assez claire,
En tout cas merci beaucoup !
Ste Barbe
Re…
Hello Mapomme

1) Pourquoi Feuil1 ?
- En spécifiant la feuille le code peut-être lancé quelque soit la feuille active du moment(feuil1 étant le code name de la feuille "Liste produits"
- ".AutoFilterMode " à besoin de cette information. Le point remplace "Feuil1.AutoFilterMode" ou "Sheets("Liste produits").AutoFilterMode
-".ComboBox1.Value" également.
2) Pourquoi Application. en début de certaines commandes ?
C'est une abréviation de "Application.WorksheetFunction"
Lance une fonction de feuille Excel. (dans ce cas la fonction "EQUIV()" )
Plus d'explications ici
https://msdn.microsoft.com/fr-fr/vba/excel-vba/articles/worksheetfunction-object-excel?f=255&MSPPError=-2147217396
3) Le code
Erreur ici
Application.ScreenUpdating = Fasle ==> Application.ScreenUpdating = False
Pour le filtre, ceci devrait faire
VB:
Sub Filtrage()
On Error Resume Next

Application.ScreenUpdating = False
'Evite la mise ? jour de l'?cran pendant l'ex?cution de la macro => Gain de temps

Dim ChoixLabo
Dim ChoixArmoire
'Déclaration de variables

With Feuil1
.AutoFilterMode = False
'Retire tous les filtres => Toutes les colonnes développées en entier

ChoixLabo = .Range("D2").Value
ChoixArmoire = .Range("F2").Value

'Va filtrer sur la plage de données correspondant au labo s?lectionn? en D2
Range("plage" & ChoixLabo).AutoFilter Field:=Application.Match(ChoixArmoire, Range("plage" & ChoixLabo).Resize(1), 0), Criteria1:="<>"
End With
Application.ScreenUpdating = True
'Mise à jour de l'écran

End Sub
***Attention, il y a des plages nommées tenant compte de la feuille "Liste"
 

Ste Barbe

XLDnaute Nouveau
Re-boujour :)
Et encore merci pour ces réponses ultra rapides !
Et pour le lien Jacky :)

Solution de mapomme très intéressante, mais l'utilisateur ne souhaite pas masquer les colonnes (une zone d'impression se limite à une partie du tableau, donc sur la version numérique : on garde les colonnes et sur papier on ne les voit pas. Ok ^^)
Nouvelle demande de l'utilisateur, gérer le cas où on sélectionne un labo puis intégral.

Je crois m'en être sortie (du moins ça fait ce que j'attends) en mélangeant vos deux codes et des idées à moi.
Pas vraiment de question pour ce post, juste un grand merci pour votre aide

Je vous mets quand même mon code en entier, si jamais vous apercevez une boulette ;)
(désolée pour la mise en page...)
A bientôt !
Ste Barbe

Sub Filtrage()
On Error Resume Next

Application.ScreenUpdating = False
'Evite la mise à jour de l'écran pendant l'exécution de la macro => Gain de temps

Dim ChoixLabo
Dim ChoixArmoire
Dim i As Integer
Dim j As Integer
Dim k As Integer
'Déclaration de variables

With Feuil1

.AutoFilterMode = False
'Retire tous les filtres => Toutes les colonnes développées en entier
Cells.EntireRow.Hidden = False
'Affiche toutes les lignes masquées

ChoixLabo = Range("D2").Value
ChoixArmoire = Range("F2").Value

'MsgBox (ChoixLabo)
'MsgBox (ChoixArmoire)
'MsgBox ("plage" & ChoixLabo)
'Tests lors de la rédaction du code


If ChoixLabo = "Site entier" Then
'Besoin d'écrire quelque chose pour renvoyer à "end with" ?

Else
If ChoixArmoire = "Intégral" Then
'Afficher les lignes pour lesquelles au moins une case du labo est non vide

For i = 6 To Range("plage" & ChoixLabo).Rows.Count + 6
'Pour chacune des lignes du labo sélectionné
k = 0

For j = Range("plage" & ChoixLabo).Column To Range("plage" & ChoixLabo).Column - 1 + Range("plage" & ChoixLabo).Columns.Count
If Cells(i, j).Value <> "" Then
k = 1
End If
Next j

If k = 0 Then
Rows(i).EntireRow.Hidden = True
End If
Next i


Else
Range("plage" & ChoixLabo).AutoFilter Field:=Application.Match(ChoixArmoire, Range("plage" & ChoixLabo).Resize(1), 0), Criteria1:="<>"
'Autofilter va filtrer sur la plage de données correspondant au labo sélectionné en D2
'Field applique le filtre sur la colonne correspondant à l'armoire sélectionnée en F2
'Criteria1 ne garde que les non-vides
End If

End If

End With

Application.ScreenUpdating = True
'Mise à jour de l'écran

End Sub
 

Jacky67

XLDnaute Accro
Re…
Il est préférable de joindre un classeur exemple comme nous le faisons que du code qui nous oblige à des manipulations inutiles.
Une dernière version sans bouton valider qui devrait faire l'affaire.
Je ne doute pas que Mapomme va concocté une autre version bien meilleur.

*PJ modifiée
Inspiré par la méthode de mapomme cette version ne prend plus en compte la feuille "listes"
 

Fichiers joints

Dernière édition:

Ste Barbe

XLDnaute Nouveau
Bonjour à tous,
Désolée je suis partie en congés et j'ai plutôt bien déconnectée :)
Maintenant de retour, j'ai pu avoir le feedback des utilisateurs et cela leur convient à quelques modifications près qu'on collègue s'est chargé de réaliser pendant mon absence.
Encore merci pour votre aide,
A bientôt peut-être

Ste Barbe
 

Discussions similaires


Haut Bas