OVH Cloud OVH Cloud

vba filtre élaboré très lent... Optimisation ?

10 réponses
Avatar
Domi
Bonjour à tous,
Je voudrais filtrer sur place les 10000 lignes d'un grand tableau (de A à R
à partir de la ligne 15..)
Les critères sont les suivants, je ne veux voir que les lignes dont la
colonne M contient une valeur (Std) ET la colonne P estvide
Le code que j'ai fais en grande partie avec l'enregistreur fonctionne mais
l'application du filtre est TRES longue (Près de 40 secondes sur un Athlon
1800 !)
La methode utilisée n'est peut-être pas bonne du tout : je fais un test des
lignes sur la colonne Q et ensuite j'applique un filtre en Q12:Q13 pour les
lignes VRAI...
J'ai essayé un filtre auto, c'est aussi long...
Même problème quand je dois tout réafficher... c'est long !
Au secours ! Y a t-il un moyen pour optimiser cela ?
Merci
Domi

Sub Filtre()
'Test
With Range("Q16", Range("A65000").End(xlUp).Offset(0, 16))
.FormulaR1C1 = "=AND(RC[-4]<>"""",ISBLANK(RC[-1]))"
.Value = .Value
End With
'Application du filtre
Range("G15").Activate
Range("R15", Range("A65000").End(xlUp)).AdvancedFilter
Action:=xlFilterInPlace, CriteriaRange:=Range("Q12:Q13"), Unique:=False
End Sub

10 réponses

Avatar
Domi
J'ai trouvé la cause ! J'ai une feuille Stats dont quelques "grosses"
formules vont chercher leurs infos dans ma feuille. Si je les vire tout
rentre dans l'ordre. Je vais pouvoir me debrouiller...
Si mon code pour le filtre peut être amélioré, je reste preneur :o)
Merci
Domi

"Domi" a écrit dans le message de news:

Bonjour à tous,
Je voudrais filtrer sur place les 10000 lignes d'un grand tableau (de A à
R

à partir de la ligne 15..)
Les critères sont les suivants, je ne veux voir que les lignes dont la
colonne M contient une valeur (Std) ET la colonne P estvide
Le code que j'ai fais en grande partie avec l'enregistreur fonctionne mais
l'application du filtre est TRES longue (Près de 40 secondes sur un Athlon
1800 !)
La methode utilisée n'est peut-être pas bonne du tout : je fais un test
des

lignes sur la colonne Q et ensuite j'applique un filtre en Q12:Q13 pour
les

lignes VRAI...
J'ai essayé un filtre auto, c'est aussi long...
Même problème quand je dois tout réafficher... c'est long !
Au secours ! Y a t-il un moyen pour optimiser cela ?
Merci
Domi

Sub Filtre()
'Test
With Range("Q16", Range("A65000").End(xlUp).Offset(0, 16))
.FormulaR1C1 = "=AND(RC[-4]<>"""",ISBLANK(RC[-1]))"
.Value = .Value
End With
'Application du filtre
Range("G15").Activate
Range("R15", Range("A65000").End(xlUp)).AdvancedFilter
Action:=xlFilterInPlace, CriteriaRange:=Range("Q12:Q13"), Unique:úlse
End Sub




Avatar
michdenis
Bonjour Domi,

Tu pourrais peut être essayé ceci :

Tu dois adapter le nom de la feuille selon ton application.
La zone de critère du filtre élaboré est en M1:M2 , à adapter selon ton application.
Dans la formule, M16 et P16 doivent représenter les cellules de la première ligne des données, celle en dessous de la ligne
d'étiquettes de tes champs.


'---------------------------
Sub Filtre()

With Worksheets("Feuil1")
'Zone de critère : M1:M2
.Range("M1") = ""
'Formule utilisée en M2
.Range("M2").FormulaLocal = "=(M16=""Std"")*(estvide(P16))=1"
With .Range("A15:R" & .Range("A65356").End(xlUp).Row)
.AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=.Range("M1:M2"), Unique:úlse
End With
End With
End Sub
'---------------------------


Salutations!


"Domi" a écrit dans le message de news:
Bonjour à tous,
Je voudrais filtrer sur place les 10000 lignes d'un grand tableau (de A à R
à partir de la ligne 15..)
Les critères sont les suivants, je ne veux voir que les lignes dont la
colonne M contient une valeur (Std) ET la colonne P estvide
Le code que j'ai fais en grande partie avec l'enregistreur fonctionne mais
l'application du filtre est TRES longue (Près de 40 secondes sur un Athlon
1800 !)
La methode utilisée n'est peut-être pas bonne du tout : je fais un test des
lignes sur la colonne Q et ensuite j'applique un filtre en Q12:Q13 pour les
lignes VRAI...
J'ai essayé un filtre auto, c'est aussi long...
Même problème quand je dois tout réafficher... c'est long !
Au secours ! Y a t-il un moyen pour optimiser cela ?
Merci
Domi

Sub Filtre()
'Test
With Range("Q16", Range("A65000").End(xlUp).Offset(0, 16))
.FormulaR1C1 = "=AND(RC[-4]<>"""",ISBLANK(RC[-1]))"
.Value = .Value
End With
'Application du filtre
Range("G15").Activate
Range("R15", Range("A65000").End(xlUp)).AdvancedFilter
Action:=xlFilterInPlace, CriteriaRange:=Range("Q12:Q13"), Unique:úlse
End Sub
Avatar
michdenis
Un petit détail : ceci est suffisant comme formule :

"=(M16=""Std"")*(estvide(P16))" pour le critère.


Salutations!


"michdenis" a écrit dans le message de news:
Bonjour Domi,

Tu pourrais peut être essayé ceci :

Tu dois adapter le nom de la feuille selon ton application.
La zone de critère du filtre élaboré est en M1:M2 , à adapter selon ton application.
Dans la formule, M16 et P16 doivent représenter les cellules de la première ligne des données, celle en dessous de la ligne
d'étiquettes de tes champs.


'---------------------------
Sub Filtre()

With Worksheets("Feuil1")
'Zone de critère : M1:M2
.Range("M1") = ""
'Formule utilisée en M2
.Range("M2").FormulaLocal = "=(M16=""Std"")*(estvide(P16))=1"
With .Range("A15:R" & .Range("A65356").End(xlUp).Row)
.AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=.Range("M1:M2"), Unique:úlse
End With
End With
End Sub
'---------------------------


Salutations!


"Domi" a écrit dans le message de news:
Bonjour à tous,
Je voudrais filtrer sur place les 10000 lignes d'un grand tableau (de A à R
à partir de la ligne 15..)
Les critères sont les suivants, je ne veux voir que les lignes dont la
colonne M contient une valeur (Std) ET la colonne P estvide
Le code que j'ai fais en grande partie avec l'enregistreur fonctionne mais
l'application du filtre est TRES longue (Près de 40 secondes sur un Athlon
1800 !)
La methode utilisée n'est peut-être pas bonne du tout : je fais un test des
lignes sur la colonne Q et ensuite j'applique un filtre en Q12:Q13 pour les
lignes VRAI...
J'ai essayé un filtre auto, c'est aussi long...
Même problème quand je dois tout réafficher... c'est long !
Au secours ! Y a t-il un moyen pour optimiser cela ?
Merci
Domi

Sub Filtre()
'Test
With Range("Q16", Range("A65000").End(xlUp).Offset(0, 16))
.FormulaR1C1 = "=AND(RC[-4]<>"""",ISBLANK(RC[-1]))"
.Value = .Value
End With
'Application du filtre
Range("G15").Activate
Range("R15", Range("A65000").End(xlUp)).AdvancedFilter
Action:=xlFilterInPlace, CriteriaRange:=Range("Q12:Q13"), Unique:úlse
End Sub
Avatar
Pierre CFI [mvp]
salut Michel
dis moi , ce n'est pas toi qui "aime" bien le travail sur bd en dao ou ado
s

--
Pierre CFI



Avatar
Daniel.M
salut Michel


Non, non je n'ai pas de nom
-Pauline Julien

Daniel M. (qui n'en manque pas une :-) )

Avatar
michdenis
Bonjour Pierre,

Est-ce que tu veux me dire que tu as un fichier exemple qui démontre que l'emploi d'une requête utilisant DAO ou ADO est plus
rapide dans ce cas ?

J'attends le résultat de tes tests !!!

;-))


Salutations!



"Pierre CFI [mvp]" a écrit dans le message de news:
salut Michel
dis moi , ce n'est pas toi qui "aime" bien le travail sur bd en dao ou ado
s

--
Pierre CFI



Avatar
michdenis
Bonjour Daniel,

" Non, non je n'ai pas de nom
-Pauline Julien "

Cela veut dire qu'il est temps que je change de pseudo, quelques personnes perspicaces m'ont reconnu !!!

;-))


Salutations!








"Daniel.M" a écrit dans le message de news:
salut Michel


Non, non je n'ai pas de nom
-Pauline Julien

Daniel M. (qui n'en manque pas une :-) )

Avatar
Pierre CFI [mvp]
non rien à voir avec la question
c'est en cherchant a resoudre un pb de transfert de base excel access et access excel , que j'ai constaté qu'on peut faire entre
autre ceci
macro dans un fichier excel, qui crée une table (de_excel)dans access depuis une base excel (base_totale) qui est dans un autre
fichier excel fermé

Dim bd As DAO.Database

Set bd = OpenDatabase(ThisWorkbook.FullName, False, False, "excel 8.0")

bd.Execute "SELECT base_totale.* INTO de_excel IN 'd:accessexo access 97client_97.mdb' FROM base_totale IN
'c:legrisservicesdir production.xls'[excel 8.0;];"
bd.close

excel en bd gére aussi les Insert into ou Update.... ce qui fait qu'on peut faire un filtre élaboré en sql
Mais tu connais peut étre et je fais un bide (le but premier étant de résoudre mon pb, pas d'épater la galerie)
--
Pierre CFI
Avatar
michdenis
Bonjour Pierre,

Ce que tu veux faire :

Utiliser ADO ou DAO pour transférer des données qui sont dans un classeur fermé vers une table existante d'une base de
données Access à partir d'une macro dans un classeur excel.

Je n'ai pas vraiment saisi à quel niveau se trouve ta difficulté s'il en est une.

Tu es sans aucun doute beaucoup plus familier que moi avec les possibilités qu'offre le langage SQL.


Salutations!


"Pierre CFI [mvp]" a écrit dans le message de news:
non rien à voir avec la question
c'est en cherchant a resoudre un pb de transfert de base excel access et access excel , que j'ai constaté qu'on peut faire
entre
autre ceci
macro dans un fichier excel, qui crée une table (de_excel)dans access depuis une base excel (base_totale) qui est dans un
autre
fichier excel fermé

Dim bd As DAO.Database

Set bd = OpenDatabase(ThisWorkbook.FullName, False, False, "excel 8.0")

bd.Execute "SELECT base_totale.* INTO de_excel IN 'd:accessexo access 97client_97.mdb' FROM base_totale IN
'c:legrisservicesdir production.xls'[excel 8.0;];"
bd.close

excel en bd gére aussi les Insert into ou Update.... ce qui fait qu'on peut faire un filtre élaboré en sql
Mais tu connais peut étre et je fais un bide (le but premier étant de résoudre mon pb, pas d'épater la galerie)
--
Pierre CFI
Avatar
Pierre CFI [mvp]
dans mon cas , c'est pas tout à fait ce code, je recupére des BD qui se trouvent dans 980 fichiers excel (sur réseau dans toute la
france
je compléte une base access, je fais les traitements en sql sur access, puis redispatch les données traitées sur les 980 fichiers
et tout çà depuis un fichier autre excel
bon mais c'était juste pour causer... :o)))
--
Pierre CFI