Equivalence de la fonction filtre (excel) en VBA

Bonjour,

J'ai un petit soucis, et je n'arrive pas à coder mon idée :

J'ai pour le moment :

- 3 feuilles qui corresponds à 3 communes différentes - on va les appelé com1, com2 et com3

- 1 feuille qui me permet de filtrer les données voulu (commune, mois, année) - on va l'appelé données

- 1 feuille à partir de laquelle je récupère les informations qui me serviront de filtre, et dans laquelle j'afficherais un traitement lié à ma feuille de donnée - on va l'appeler information

- 1 feuille qui détaillera la feuille précédente grace à ma feuille de données.

Ce que je souhaite => lorsque dans ma feuille information je sélectionne com1, j'ai mes données lié à com1, si je sélectionne com2, j'ai les donnée lié à com 2, ...

Le soucis, c'est que je n'arrive pas à effectuer pour le moment ma fonction FILTRE autrement qu'en renseigner la feuille dans laquelle elle doit taper.

Du coup je me retrouve avec :

SI (information = com 1;

FILTRE(COM1! ...................);

Si (information = com2 ;

FILTRE(COM2! .............................);

SI (information = com3;

FILTRE(COM! ......................);)))

CE qui est pour moi totalement indigeste, d'autant plus que ces feuilles vont augementer com4;com5;........

J'aurais souhaiter le formaliser plus simplement de façon à ce que ça récupere les données dynamiquement (si je puis dire).

Bref, si quelqu'un pouvait m'orienter sur une solution, je lui en saurais grée.

Merci d'avance.

Miri

Bonjour

Plus simple a priori à faire par PowerQuery

Bonjour,

D’accord avec Chris, sinon voir des TCD.

En VBA, 2 manières de faire :

Si l’organisation de vos données le permet, appeler la fonction AutoFilter sur vos tableaux, et récupérer les résultats.

Sinon, full code : faire des boucles et des conditions :

->pour chaque feuille,

......->Pour chaque donnée

..............->Si la donnée est dans la liste des données à récupérer, la récupérer

Mais bon comme l’indique Chris, pour ce genre de travail de filtrage vous auriez tout intéret à utiliser les outils de base qui sont plus performants que le VBA.

Pouvez-vous développer votre idée car j'avoue que je ne connais pas PowerQuery, et comment ça peut simplifier mon problème?

mon idée c'était :

au lieu d'avoir :

=SI(INDICAT_PERF!C8="MAUGUIO";FILTRE(MAUGUIO!A9:R464;(MAUGUIO!C9:C464=MOIS(DATEVAL(INDICAT_PERF!C7&"1")))*(MAUGUIO!D9:D464=(INDICAT_PERF!F7));"");SI(INDICAT_PERF!C8="SERVIAN";FILTRE(SERVIAN!A9:R464;(SERVIAN!C9:C464=MOIS(DATEVAL(INDICAT_PERF!C7&"1")))*(SERVIAN!D9:D464=(INDICAT_PERF!F7));"");"")) .............................

avoir

feuille = Sheets("INDICAT_PERF").Cells(8, 3).Value

FILTRE(feuille!A9:R464;(feuille!C9:C464=MOIS(DATEVAL(INDICAT_PERF!C7&"1")))*(feuille!D9:D464=(INDICAT_PERF!F7));

Bonjour

Pouvez-vous développer votre idée car j'avoue que je ne connais pas PowerQuery, et comment ça peut simplifier mon problème?

Sans fichier pour analyser concrètement je ne peux pas donner du concret

Re,

Comme je vois que vous etes attaché à la fonction FILTRE, puisque vous avez écrit vos fonctions avec. Je vous propose ci-après une alternative VBA UDF quasiment identique : FILTREVBA

L’unique différence est que vous devez préciser en dernier argument si votre table est verticale (mettez VRAI, ou horizontale (FAUX).

Càd que si vous avez une colonne de filtre, vous mettez VRAI, sinon FAUX. Je vous joins un mini exemple.

9prefilter.xlsm (19.60 Ko)

Attention, il faut l’entrer en formule matricille (ctrl+maj+entrée) puisque ca renvoie un tableau.

Ci-après le code VBA, probablement améliorable mais il fonctionne.

EDIT : VOIR MESSAGE CI-DESSOUS

Petite update, utilisez plutot la fonction ci-dessous qui permet de se passer du 3e argument, et un peu plus intelligente pour la gestion ligne/colonne.

Public Function FILTREVBA(arr As Range, filter As Variant) As Variant
  On Error GoTo quitFunc

  Dim inputDim(0 To 1) As Long
  inputDim(0) = arr.Rows.Count
  inputDim(1) = arr.Columns.Count

  Dim dimensions(0 To 1) As Long, vertical As Boolean
  Select Case UBound(filter) - LBound(filter) + 1
  Case inputDim(0)
    vertical = True
    filter = Application.Transpose(filter)
    dimensions(0) = arr.Rows.Count
    dimensions(1) = arr.Columns.Count
  Case inputDim(1)
    vertical = False
    dimensions(0) = arr.Columns.Count
    dimensions(1) = arr.Rows.Count
  Case Else
    FILTREVBA = "Entrées invalides"
    Exit Function
  End Select

  Dim filteredValues As Object
  Set filteredValues = CreateObject("System.Collections.ArrayList")

  Dim evaluation As Variant, i As Long
  For i = 1 To dimensions(0)
    If filter(i) Then
      If vertical Then
        filteredValues.Add arr.Rows(i)
      Else
        filteredValues.Add Application.Transpose(arr.Columns(i))
      End If
    End If
  Next i

  If vertical Then
    FILTREVBA = filteredValues.toArray
  Else
    FILTREVBA = Application.Transpose(filteredValues.toArray)
  End If

quitFunc:
End Function

RE

Rappel un tableau structuré ne doit jamais contenir de ligne vide. Il s'agrandit naturellement en propageant formats, formules, liste déroulantes...

Les lignes vides font perdre 95% des avantages d'un tableau structuré...

Tu avais des erreurs dans 3 tableaux sur 4 qui se référaient au 4ème et non au tableau concerné

Il suffit de nommer correctement les tableaux et de créer 3 formules nommées et on a une unique formule pour récupérer Données

=FILTRE(Cible;(Cible_Mois=MOIS(DATEVAL(INDICAT_PERF!C7&"1"))*(Cible_An=INDICAT_PERF!F7)))

Wouooo... C'est exactement ce que je voulais, mais je ne sais pas comment vous avez fait?!

Où faites-vous en sorte que "cible" pointe sur la bonne feuille?

Bonjour

Je l'ai dit

Il suffit de nommer correctement les tableaux et de créer 3 formules nommées et on a une unique formule pour récupérer Données

Donc regarde le gestionnaire de noms

Oh mais c'est génial ça. Je ne connaissais pas cette possibilité de "jouer" avec le gestionnaire de nom.

Excel est merveilleux. Moi qui commençait à me prendre la tête à vouloir coder des formules, avec qu'excel me permet déjà de mettre ça en place.

Merci beaucoup.

Rechercher des sujets similaires à "equivalence fonction filtre vba"