Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Macro filtration de données à améliorer

6 réponses
Avatar
Domi
Bonjour à tous,

Après moult gouttes de sueur et l'enregistreur j'ai réussi à pondre cette
macro qui me permet de filtrer un grand nombre d'enregistrement en fonction
de multiples critères :
Pour cela j'utilise une formules complexe avec de ET et OU imbriqués.
Je m'en sort bien car cela marche mais si je rajoute un ou deux critères ça
ne marche plus car je ne sais plus enregistrer ma formule avec
l'enregistreur (trop de caractères je suppose ?)
Comme je pense que ma formule risque de se compliquer un peu plus à court
terme je préfère demander de l'aide par avance.
Je pense qu'on doit pouvoir faire le même boulot avec du VBA "pur" sans
passer par une formule mais my VBA is null... ou presque
Quelqu'un pourrait-il me proposer une solution plus VBA ou une astuce pour
pouvoir enregistrer une formule plus longue ?

J'ai mis un fichier exemple sur cjoint : http://cjoint.com/?csqRZF35U4
Merci par avance pour vos propositions
Domi


Sub Filtrer()
'Formule de test sur la plage
With Range("I5", Range("A50000").End(xlUp).Offset(0, 8))
.FormulaR1C1 =
"=AND(RC10<>""C"",RC10<>""P"",RC7<>0,OR(AND(LEFT(RC1,2)=""01"",LEFT(RC1,4)<>
""0127"",LEFT(RC1,3)<>""01S"",LEFT(RC1,3)<>""01R"",LEFT(RC1,3)<>""01E"",RC1<
>""0128000"",RC1<>""0128001"",ISERROR(FIND(""SOCL"",RC2,1))),AND(LEFT(RC1,2)
=""P1"",NOT(ISERROR(FIND(""SOCL"",RC2,1))))))"
.Value = .Value
End With

'Application du filtre
[L1] = "TEST"
[L2] = "TRUE"
Range("BaseTest").AdvancedFilter Action:=xlFilterInPlace,
CriteriaRange:=Range("L1:L2"), Unique:=False
[L1] = ""
[L2] = ""
End Sub

6 réponses

Avatar
michdenis
Bonjour Domi,

Elle est où cette formule que tu n'arrives à insérer dans ta plage de cellules ?
Pourquoi ne pas l'avoir publié avec ton classeur ?

Une formule dans une cellule peut contenir jusqu'à 1024 caractères.

As-tu testé directement ta formule sur ta plage de cellules ? Obtiens-tu le résultat escompté ?


Salutations!


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

Après moult gouttes de sueur et l'enregistreur j'ai réussi à pondre cette
macro qui me permet de filtrer un grand nombre d'enregistrement en fonction
de multiples critères :
Pour cela j'utilise une formules complexe avec de ET et OU imbriqués.
Je m'en sort bien car cela marche mais si je rajoute un ou deux critères ça
ne marche plus car je ne sais plus enregistrer ma formule avec
l'enregistreur (trop de caractères je suppose ?)
Comme je pense que ma formule risque de se compliquer un peu plus à court
terme je préfère demander de l'aide par avance.
Je pense qu'on doit pouvoir faire le même boulot avec du VBA "pur" sans
passer par une formule mais my VBA is null... ou presque
Quelqu'un pourrait-il me proposer une solution plus VBA ou une astuce pour
pouvoir enregistrer une formule plus longue ?

J'ai mis un fichier exemple sur cjoint : http://cjoint.com/?csqRZF35U4
Merci par avance pour vos propositions
Domi


Sub Filtrer()
'Formule de test sur la plage
With Range("I5", Range("A50000").End(xlUp).Offset(0, 8))
.FormulaR1C1 "=AND(RC10<>""C"",RC10<>""P"",RC7<>0,OR(AND(LEFT(RC1,2)=""01"",LEFT(RC1,4)<>
""0127"",LEFT(RC1,3)<>""01S"",LEFT(RC1,3)<>""01R"",LEFT(RC1,3)<>""01E"",RC1<
""0128000"",RC1<>""0128001"",ISERROR(FIND(""SOCL"",RC2,1))),AND(LEFT(RC1,2)
=""P1"",NOT(ISERROR(FIND(""SOCL"",RC2,1))))))"

.Value = .Value
End With

'Application du filtre
[L1] = "TEST"
[L2] = "TRUE"
Range("BaseTest").AdvancedFilter Action:=xlFilterInPlace,
CriteriaRange:=Range("L1:L2"), Unique:úlse
[L1] = ""
[L2] = ""
End Sub

Avatar
JB
Bonjour,

Avec une zone de critères composée de plusieurs cellules, la requête
serait sans doute + simple à formaliser.

http://www.excelabo.net/compteclic.php?nom=jb-filtreelabore

Cordialement JB
Avatar
Domi
Bonjour,
La formule est bien dans le classeur mais elle s'applique quand j'appuie sur
"FILTRER" et dans mon petit bout de code je passe les valeur obtenues en dur
pour pouvoir appliquer le filtre. En fait elle est dans toutes la colonne I,
Pour la voir, il faut bien sur virer .Value=.Value. dans la macro.
Désolé de ne pas l'avoir précisé, je pensais que vous le verriez dans le
petit code en fin de ma question.
Merci ;o)
Domi

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

Elle est où cette formule que tu n'arrives à insérer dans ta plage de
cellules ?

Pourquoi ne pas l'avoir publié avec ton classeur ?

Une formule dans une cellule peut contenir jusqu'à 1024 caractères.

As-tu testé directement ta formule sur ta plage de cellules ? Obtiens-tu
le résultat escompté ?



Salutations!


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


Bonjour à tous,

Après moult gouttes de sueur et l'enregistreur j'ai réussi à pondre cette
macro qui me permet de filtrer un grand nombre d'enregistrement en
fonction

de multiples critères :
Pour cela j'utilise une formules complexe avec de ET et OU imbriqués.
Je m'en sort bien car cela marche mais si je rajoute un ou deux critères
ça

ne marche plus car je ne sais plus enregistrer ma formule avec
l'enregistreur (trop de caractères je suppose ?)
Comme je pense que ma formule risque de se compliquer un peu plus à court
terme je préfère demander de l'aide par avance.
Je pense qu'on doit pouvoir faire le même boulot avec du VBA "pur" sans
passer par une formule mais my VBA is null... ou presque
Quelqu'un pourrait-il me proposer une solution plus VBA ou une astuce pour
pouvoir enregistrer une formule plus longue ?

J'ai mis un fichier exemple sur cjoint : http://cjoint.com/?csqRZF35U4
Merci par avance pour vos propositions
Domi


Sub Filtrer()
'Formule de test sur la plage
With Range("I5", Range("A50000").End(xlUp).Offset(0, 8))
.FormulaR1C1 >
"=AND(RC10<>""C"",RC10<>""P"",RC7<>0,OR(AND(LEFT(RC1,2)=""01"",LEFT(RC1,4)<>


""0127"",LEFT(RC1,3)<>""01S"",LEFT(RC1,3)<>""01R"",LEFT(RC1,3)<>""01E"",RC1<


""0128000"",RC1<>""0128001"",ISERROR(FIND(""SOCL"",RC2,1))),AND(LEFT(RC1,2)
=""P1"",NOT(ISERROR(FIND(""SOCL"",RC2,1))))))"
.Value = .Value
End With

'Application du filtre
[L1] = "TEST"
[L2] = "TRUE"
Range("BaseTest").AdvancedFilter Action:=xlFilterInPlace,
CriteriaRange:=Range("L1:L2"), Unique:úlse
[L1] = ""
[L2] = ""
End Sub





Avatar
michdenis
Bonjour Domi,

Je n'ai pas vérifié la formule que tu utilises, mais tes boutons dans ta feuille
de calcul pour effectuer ton filtre fonctionne très bien chez moi.


Salutations!


"Domi" a écrit dans le message de news:
Bonjour,
La formule est bien dans le classeur mais elle s'applique quand j'appuie sur
"FILTRER" et dans mon petit bout de code je passe les valeur obtenues en dur
pour pouvoir appliquer le filtre. En fait elle est dans toutes la colonne I,
Pour la voir, il faut bien sur virer .Value=.Value. dans la macro.
Désolé de ne pas l'avoir précisé, je pensais que vous le verriez dans le
petit code en fin de ma question.
Merci ;o)
Domi

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

Elle est où cette formule que tu n'arrives à insérer dans ta plage de
cellules ?

Pourquoi ne pas l'avoir publié avec ton classeur ?

Une formule dans une cellule peut contenir jusqu'à 1024 caractères.

As-tu testé directement ta formule sur ta plage de cellules ? Obtiens-tu
le résultat escompté ?



Salutations!


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


Bonjour à tous,

Après moult gouttes de sueur et l'enregistreur j'ai réussi à pondre cette
macro qui me permet de filtrer un grand nombre d'enregistrement en
fonction

de multiples critères :
Pour cela j'utilise une formules complexe avec de ET et OU imbriqués.
Je m'en sort bien car cela marche mais si je rajoute un ou deux critères
ça

ne marche plus car je ne sais plus enregistrer ma formule avec
l'enregistreur (trop de caractères je suppose ?)
Comme je pense que ma formule risque de se compliquer un peu plus à court
terme je préfère demander de l'aide par avance.
Je pense qu'on doit pouvoir faire le même boulot avec du VBA "pur" sans
passer par une formule mais my VBA is null... ou presque
Quelqu'un pourrait-il me proposer une solution plus VBA ou une astuce pour
pouvoir enregistrer une formule plus longue ?

J'ai mis un fichier exemple sur cjoint : http://cjoint.com/?csqRZF35U4
Merci par avance pour vos propositions
Domi


Sub Filtrer()
'Formule de test sur la plage
With Range("I5", Range("A50000").End(xlUp).Offset(0, 8))
.FormulaR1C1 >
"=AND(RC10<>""C"",RC10<>""P"",RC7<>0,OR(AND(LEFT(RC1,2)=""01"",LEFT(RC1,4)<>


""0127"",LEFT(RC1,3)<>""01S"",LEFT(RC1,3)<>""01R"",LEFT(RC1,3)<>""01E"",RC1<


""0128000"",RC1<>""0128001"",ISERROR(FIND(""SOCL"",RC2,1))),AND(LEFT(RC1,2)
=""P1"",NOT(ISERROR(FIND(""SOCL"",RC2,1))))))"
.Value = .Value
End With

'Application du filtre
[L1] = "TEST"
[L2] = "TRUE"
Range("BaseTest").AdvancedFilter Action:=xlFilterInPlace,
CriteriaRange:=Range("L1:L2"), Unique:úlse
[L1] = ""
[L2] = ""
End Sub





Avatar
Domi
Oui, je me suis vraiment mal fait comprendre.
Ma solution marche mais je ne suis pas satisfait de la méthode que j'ai
utilisé. J'utilise une formule très longue obtenue avec l'enregistreur.
Or si dans ce cas précis cela marche cela n'aurait pas été le cas si ma
formule avait été plus longue...(impossible de passer par l'enregistreur)
Ma question c'est : Est-il possible de faire la même chose avec une méthode
plus "propre" ? (du vrai VBA quoi !) et cela me permettrais de m'instruire
encore un peu ;o)

A vrai dire, je viens de passer quelques heures dessus et j'ai réussi à
pondre cette 2eme solution (sans formule)
Mais là encore je pense qu'on doit pouvoir faire plus propre et plus
concis... j'ai essayé avec des IF... mais je patauge...
Je reste preneur de toute proposition d'amélioration

Sub Filtre01()
Dim C As Range
For Each C In Worksheets("ofpf").Range("B5",
Range("A10000").End(xlUp).Offset(0, 1)) 'Range("B5:B30")
Ref = C.Offset(, -1)
Ref2 = Left(C.Offset(, -1), 2)
Ref3 = Left(C.Offset(, -1), 3)
Ref4 = Left(C.Offset(, -1), 4)
Qte = C.Offset(, 5)
Stat = C.Offset(, 8)
If Ref2 = "01" And Ref3 <> "01E" And Stat <> "C" And Qte > 0 And Stat <>
"P" And Ref3 <> "01R" And Ref3 <> "01S" And Ref4 <> "0127" And Ref <>
"0128000" And Ref <> "0128001" And InStr(1, C, "socl", vbTextCompare) = 0 Or
Ref2 = "P1" And Stat <> "C" And Stat <> "P" And Qte > 0 Then
C.Offset(, 7).Value = True
Else
C.Offset(, 7).Value = False
End If
Next
'Application du filtre
[L1] = "TEST"
[L2] = "TRUE"
Range("BaseTest").AdvancedFilter Action:=xlFilterInPlace,
CriteriaRange:=Range("L1:L2"), Unique:úlse
[L1] = ""
[L2] = ""
End Sub


Merci
Domi



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

Je n'ai pas vérifié la formule que tu utilises, mais tes boutons dans ta
feuille

de calcul pour effectuer ton filtre fonctionne très bien chez moi.


Salutations!


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


Bonjour,
La formule est bien dans le classeur mais elle s'applique quand j'appuie
sur

"FILTRER" et dans mon petit bout de code je passe les valeur obtenues en
dur

pour pouvoir appliquer le filtre. En fait elle est dans toutes la colonne
I,

Pour la voir, il faut bien sur virer .Value=.Value. dans la macro.
Désolé de ne pas l'avoir précisé, je pensais que vous le verriez dans le
petit code en fin de ma question.
Merci ;o)
Domi

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

Elle est où cette formule que tu n'arrives à insérer dans ta plage de
cellules ?

Pourquoi ne pas l'avoir publié avec ton classeur ?

Une formule dans une cellule peut contenir jusqu'à 1024 caractères.

As-tu testé directement ta formule sur ta plage de cellules ? Obtiens-tu
le résultat escompté ?



Salutations!


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


Bonjour à tous,

Après moult gouttes de sueur et l'enregistreur j'ai réussi à pondre
cette


macro qui me permet de filtrer un grand nombre d'enregistrement en
fonction

de multiples critères :
Pour cela j'utilise une formules complexe avec de ET et OU imbriqués.
Je m'en sort bien car cela marche mais si je rajoute un ou deux critères
ça

ne marche plus car je ne sais plus enregistrer ma formule avec
l'enregistreur (trop de caractères je suppose ?)
Comme je pense que ma formule risque de se compliquer un peu plus à
court


terme je préfère demander de l'aide par avance.
Je pense qu'on doit pouvoir faire le même boulot avec du VBA "pur" sans
passer par une formule mais my VBA is null... ou presque
Quelqu'un pourrait-il me proposer une solution plus VBA ou une astuce
pour


pouvoir enregistrer une formule plus longue ?

J'ai mis un fichier exemple sur cjoint : http://cjoint.com/?csqRZF35U4
Merci par avance pour vos propositions
Domi


Sub Filtrer()
'Formule de test sur la plage
With Range("I5", Range("A50000").End(xlUp).Offset(0, 8))
.FormulaR1C1 > >


"=AND(RC10<>""C"",RC10<>""P"",RC7<>0,OR(AND(LEFT(RC1,2)=""01"",LEFT(RC1,4)<>




""0127"",LEFT(RC1,3)<>""01S"",LEFT(RC1,3)<>""01R"",LEFT(RC1,3)<>""01E"",RC1<




""0128000"",RC1<>""0128001"",ISERROR(FIND(""SOCL"",RC2,1))),AND(LEFT(RC1,2)
=""P1"",NOT(ISERROR(FIND(""SOCL"",RC2,1))))))"
.Value = .Value
End With

'Application du filtre
[L1] = "TEST"
[L2] = "TRUE"
Range("BaseTest").AdvancedFilter Action:=xlFilterInPlace,
CriteriaRange:=Range("L1:L2"), Unique:úlse
[L1] = ""
[L2] = ""
End Sub











Avatar
michdenis
Bonjour Domi,

Comme tes critères sont tous différents, on peut très peu de chose
pour simplifier substantiellement ta formule....


Salutations!



"Domi" a écrit dans le message de news:
Oui, je me suis vraiment mal fait comprendre.
Ma solution marche mais je ne suis pas satisfait de la méthode que j'ai
utilisé. J'utilise une formule très longue obtenue avec l'enregistreur.
Or si dans ce cas précis cela marche cela n'aurait pas été le cas si ma
formule avait été plus longue...(impossible de passer par l'enregistreur)
Ma question c'est : Est-il possible de faire la même chose avec une méthode
plus "propre" ? (du vrai VBA quoi !) et cela me permettrais de m'instruire
encore un peu ;o)

A vrai dire, je viens de passer quelques heures dessus et j'ai réussi à
pondre cette 2eme solution (sans formule)
Mais là encore je pense qu'on doit pouvoir faire plus propre et plus
concis... j'ai essayé avec des IF... mais je patauge...
Je reste preneur de toute proposition d'amélioration

Sub Filtre01()
Dim C As Range
For Each C In Worksheets("ofpf").Range("B5",
Range("A10000").End(xlUp).Offset(0, 1)) 'Range("B5:B30")
Ref = C.Offset(, -1)
Ref2 = Left(C.Offset(, -1), 2)
Ref3 = Left(C.Offset(, -1), 3)
Ref4 = Left(C.Offset(, -1), 4)
Qte = C.Offset(, 5)
Stat = C.Offset(, 8)
If Ref2 = "01" And Ref3 <> "01E" And Stat <> "C" And Qte > 0 And Stat <>
"P" And Ref3 <> "01R" And Ref3 <> "01S" And Ref4 <> "0127" And Ref <>
"0128000" And Ref <> "0128001" And InStr(1, C, "socl", vbTextCompare) = 0 Or
Ref2 = "P1" And Stat <> "C" And Stat <> "P" And Qte > 0 Then
C.Offset(, 7).Value = True
Else
C.Offset(, 7).Value = False
End If
Next
'Application du filtre
[L1] = "TEST"
[L2] = "TRUE"
Range("BaseTest").AdvancedFilter Action:=xlFilterInPlace,
CriteriaRange:=Range("L1:L2"), Unique:úlse
[L1] = ""
[L2] = ""
End Sub


Merci
Domi



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

Je n'ai pas vérifié la formule que tu utilises, mais tes boutons dans ta
feuille

de calcul pour effectuer ton filtre fonctionne très bien chez moi.


Salutations!


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


Bonjour,
La formule est bien dans le classeur mais elle s'applique quand j'appuie
sur

"FILTRER" et dans mon petit bout de code je passe les valeur obtenues en
dur

pour pouvoir appliquer le filtre. En fait elle est dans toutes la colonne
I,

Pour la voir, il faut bien sur virer .Value=.Value. dans la macro.
Désolé de ne pas l'avoir précisé, je pensais que vous le verriez dans le
petit code en fin de ma question.
Merci ;o)
Domi

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

Elle est où cette formule que tu n'arrives à insérer dans ta plage de
cellules ?

Pourquoi ne pas l'avoir publié avec ton classeur ?

Une formule dans une cellule peut contenir jusqu'à 1024 caractères.

As-tu testé directement ta formule sur ta plage de cellules ? Obtiens-tu
le résultat escompté ?



Salutations!


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


Bonjour à tous,

Après moult gouttes de sueur et l'enregistreur j'ai réussi à pondre
cette


macro qui me permet de filtrer un grand nombre d'enregistrement en
fonction

de multiples critères :
Pour cela j'utilise une formules complexe avec de ET et OU imbriqués.
Je m'en sort bien car cela marche mais si je rajoute un ou deux critères
ça

ne marche plus car je ne sais plus enregistrer ma formule avec
l'enregistreur (trop de caractères je suppose ?)
Comme je pense que ma formule risque de se compliquer un peu plus à
court


terme je préfère demander de l'aide par avance.
Je pense qu'on doit pouvoir faire le même boulot avec du VBA "pur" sans
passer par une formule mais my VBA is null... ou presque
Quelqu'un pourrait-il me proposer une solution plus VBA ou une astuce
pour


pouvoir enregistrer une formule plus longue ?

J'ai mis un fichier exemple sur cjoint : http://cjoint.com/?csqRZF35U4
Merci par avance pour vos propositions
Domi


Sub Filtrer()
'Formule de test sur la plage
With Range("I5", Range("A50000").End(xlUp).Offset(0, 8))
.FormulaR1C1 > >


"=AND(RC10<>""C"",RC10<>""P"",RC7<>0,OR(AND(LEFT(RC1,2)=""01"",LEFT(RC1,4)<>




""0127"",LEFT(RC1,3)<>""01S"",LEFT(RC1,3)<>""01R"",LEFT(RC1,3)<>""01E"",RC1<




""0128000"",RC1<>""0128001"",ISERROR(FIND(""SOCL"",RC2,1))),AND(LEFT(RC1,2)
=""P1"",NOT(ISERROR(FIND(""SOCL"",RC2,1))))))"
.Value = .Value
End With

'Application du filtre
[L1] = "TEST"
[L2] = "TRUE"
Range("BaseTest").AdvancedFilter Action:=xlFilterInPlace,
CriteriaRange:=Range("L1:L2"), Unique:úlse
[L1] = ""
[L2] = ""
End Sub