Fitlre avancé et tableau VBA

Bonjour,

Je souhaiterais utiliser la fonction filtre avancé sans interagir avec une feuille excel.

L'objectif est de charger ma BDD dans un tableau VBA puis d'utiliser le filtre avancé pour alimenter un autre tableau VBA, les critères doivent également se présenter sous la forme d'un tableau VBA.

J'ai testé et je n'y arrive pas, j'ai regardé sur le WEB et il semblerait que ce n'est pas possible.

Pouvez-vous m'aider SVP, j'ai ajouté un fichier exemple pour faire le test, l'objectif et de charger la BDD A1:C8 dans une variable Tableau VBA et d'utiliser le filtre avancé pour alimenter un second tableau VBA avec uniquement les personnes âgées de plus de 18 ans.

Attention je ne veux pas interagir avec la feuille excel, la seule interaction aura lieu au moment de charger la BDD dans mon tableau VBA.

D'avance merci

Bonjour

Je ne crois pas que cela soit possible et il me semble que tu as déjà posé la question dur d'autres forums.

Les filtres sur les bases de données se font dans la majorité des cas sous forme de requêtes plus efficaces qu'une boucle même sur un array...

Bonjour et merci pour ton retour rapide.

Pourtant dans un autre topic Eriic semblait dire que c’était possible ( cf lien ci-dessous) ...

https://forum.excel-pratique.com/viewtopic.php?f=2&t=67722&p=623051#p623051

Bonsoir SouVB, 78chris

tu peux utiliser la fonction Filter :

Option Explicit
Sub test()
Dim x, a()
    With Sheets("Feuil1").Range("a1").CurrentRegion
        x = Filter(Evaluate("transpose(if(" & .Columns(3).Address & _
                            ">18,row(1:" & .Rows.Count & "),char(2)))"), Chr(2), 0)
        'a = Application.Index(.Value, Application.Transpose(x), Evaluate("column(" & .Address & ")"))
        a = Application.Index(.Value, Application.Transpose(x), Evaluate("column(a:c)"))
        If UBound(x) > 0 Then
            With .Offset(, .Columns.Count + 2).Resize(UBound(a, 1), UBound(a, 2))
                .CurrentRegion.ClearContents
                .Value = a
            End With
        Else
            MsgBox "aucune donnée"
        End If
    End With
End Sub

klin89

Bonjour klin89,

Merci pour ton retour, en effet ça peut être une alternative.

Est-il possible d’ajouter des critères sur d’autres colonnes et des « Et/ou » ?

Merci

re SouVB,

Difficile d'expliquer quand on a des lacunes en formule comme moi

Dans cette ligne,

x = Filter(Evaluate("transpose(if(" & .Columns(3).Address & ">18,row(1:" & .Rows.Count & "),char(2)))"), Chr(2), 0)

on retrouve le test suivant

if(" & .Columns(3).Address & ">18

qui renvoie le n° de ligne si vrai

row(1:" & .Rows.Count & ")

et le caractère suivant si faux

char(2)

Sur la base de l'exemple précédent, on peut ainsi cumuler 2 conditions :

x = Filter(Evaluate("transpose(if((" & .Columns(3).Address & ">18)*(" & .Columns(3).Address & "<50),row(1:" & .Rows.Count & "),char(2)))"), Chr(2), 0)

Pour le fun, on pourrait aussi affecter x comme ceci, on renvoie si vrai la valeur des cellules et non plus le n° de ligne.

x = Filter(Evaluate("transpose(if(" & .Columns(3).Address & ">18," & .Columns(3).Address & ",char(2)))"), Chr(2), 0)

Pour filtrer à l'aide d'une formule plus complexe, appelle un formuliste

klin89

Merci pour ton retour.

J'ai encore un problème, ma BDD fait plus de 80 000 lignes et le filtre ne semble fonctionner que sur les 16000 premières lignes ... j'imagine que c'est lié au transposé et la limitation du nombre de colonnes des tableaux VBA ..

Rechercher des sujets similaires à "fitlre avance tableau vba"