Question d'un utilisateur : Je veux extraire "dynamiquement" des enregistrements (lignes) d'une base de données mais que cela reste compatible avec les anciennes versions Excel, permettant ainsi un partage du fichier dans environnement mixte (différentes versions d'Excel) !
Sur des versions récentes d'Excel, nous avons l'excellente fonction FITRE (voir L'impressionnante fonction de calcul FILTRE) mais dans ce cas on va devoir faire autrement. Je vous propose 3 solutions différentes.
Données de départ

Solution 1 : Avec un tableau croisé dynamique

On utilise de manière détournée un tableau croisé dynamique.
- On place tous les champs en zone de dépôt Lignes (1).
- Ici pas de synthèse, aucun champ en zone de dépôt Valeurs (2).
- Le filtrage est obtenu soit en plaçant le champ cible en zone de dépôt Filtres (3) ou en filtrant la colonne (4).
Pour obtenir cette présentation, on applique ces paramètres d'affichage :
- Disposition du rapport (ruban Création) : Afficher sous forme tabulaire et Répéter toutes les étiquettes d'éléments.
- Sous-totaux (ruban Création) : Ne pas afficher les sous-totaux.
- Totaux généraux (ruban Création) : Désactiver pour les lignes et les colonnes.
- Boutons +/- (ruban Analyse du tableau croisé dynamique) : les désactiver.
Remarque :
- La mise à jour de données n'est pas dynamique, il faudra penser à utiliser la commande Actualiser en cas de modification des données de la source de données.
Solution 2 : Avec des formules de calculs

A2 () : = PETITE.VALEUR(SI(Tableau1[Produit]=$F$2;
LIGNE(Tableau1[Produit]));
LIGNE(A1))
───────────────────────────────────────────────────────────────────────
B2 (Date) : = SI(ESTERR(A2);
"";
INDEX(Tableau1[[#Tout];[Date]];A2))
Formule A2 à valider en mode matriciel par Ctrl + Maj + Enter (Version ancienne).
Interprétation rapide des formules
- La formule en colonne A permet de déterminer les lignes de la base de données à afficher.
- Par soucis d'optimisation, cette formule est placée en colonne A (colonne à masquer) mais pourrait être intégrée dans les formules de colonnes B et C (évite à Excel de refaire le même calcul à chaque colonne).
- Tableau1[Produit]=$F$2 => Renvoie une matrice de VRAI/FAUX correspondant à la présence de la valeur cherchée ("B" dans l'exemple).
=> { VRAI ; VRAI ; FAUX ; VRAI ; FAUX ... }. - SI( ... ; LIGNE(Tableau1[Produit]) ) => Renvoie une matrice correspondant aux n° de ligne où est présent la valeur cherchée.
Attention : L'argument "Valeur si faux" de la fonction SI n'étant pas précisé, on obtient la valeur implicite FAUX quand la condition n'est pas vérifiée (<> F2).
=> { 2 ; 3 ; FAUX ; 5 ; FAUX ... }. - PETITE.VALEURS(... ; LIGNE(A1)) permet d'extraire les valeurs séquentiellement (1ere, 2eme, 3eme...).
- Le valeur FAUX ne sont pas prisent en compte par la fonction PETITE.VALEURS.
- PETITE.VALEURS sera en erreur après l'"extraction" du dernier n° de ligne (d'où la partie SI( ESTERR( ... ); "" ) des formules en colonne B et C).
- Les formules des colonnes B et C récupèrent, à partir de la valeur de la colonne A, les valeurs "DATE" et "Nom de famille" avec une classique fonction INDEX en ignorant les valeurs en erreurs de la colonne A.
Remarques :
- On bénéficie ici de la mise à jour automatique des résultats des formules.
- Nécessite d'avoir recopier les formules sur une plage suffisamment grande pour être en mesure d'afficher tous les résultats dans tous les cas de filtrage.
Solution 3 : Avec PowerQuery
Avec Excel 2010 et 2013, il faudra penser à ajouter et activer PowerQuery dans Excel.

Principe
- On crée une 1ère requête pour récupérer la valeur du critère pour le filtre.
- On crée une 2ème requête pour récupérer toutes les données puis on utilise la valeur de la 1ère requête comme critère dynamique de filtrage.
1ère requête : Valeur du critère pour le filtre
- Dans Excel :
- On nomme la cellule I3 en "CelluleValeurFiltre" (ruban Formules > Définir un nom).
- On importe la valeur de la cellule dans PowerQuery.
- Sélection de la cellule > ruban Données > A partir de Tableau ou d'une Plage (groupe Récupérer et transformer des données).
- Dans PowerQuery :
- On supprime les 2 dernières étapes inutiles ("Type modifié" et "En-têtes promus") => croix rouge ou clic droit.
- On convertit la requête : Clic droit sur la valeur > Drill-down.
- On retourne à Excel
- Ruban Accueil > Fermer et charger dans ...
- Pour la destination du résultat de la requête, on choisit de ne créer que la connexion (= pas de retour de valeur).
- Ruban Accueil > Fermer et charger dans ...
- On supprime les 2 dernières étapes inutiles ("Type modifié" et "En-têtes promus") => croix rouge ou clic droit.
2ème requête : Récupérer les données filtrées
- Dans Excel :
- On passe la base de données en tableau structuré (ruban Insertion > Tableau).
- On importe les données dans PowerQuery
- Sélection d'une cellule de la base de données > ruban Données > A partir de Tableau ou d'une Plage (groupe Récupérer et transformer des données).
- Dans PowerQuery :
- On applique un filtre sur la colonne cible (1 et 2)
- On remplace dans la barre de formule la valeur (ici "A") par le nom de la 1ère requête (3).
On rend ainsi dynamique le critère de filtrage en remplaçant la valeur fixe par la valeur de la 1ère requête. - On retourne à Excel
- Ruban Accueil > Fermer et charger dans ...
- Pour la destination du résultat de la requête, on choisit la feuille et la cellule de destination.
- On applique un filtre sur la colonne cible (1 et 2)
Remarque :
- Comme pour le tableau croisé dynamique, la mise à jour de données n'est pas dynamique, il faudra penser à utiliser la commande Actualiser en cas de modification du critère de filtre (ici cellule I2) ou des données de la source de données.
Et c'est terminé !
Merci pour votre attention bienveillante.