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

Afficher le résultat d'un filtre élaboré 1 par 1

22 réponses
Avatar
Apitos
Bonjour =E0 tous,

Voil=E0 un code que j'ai r=E9cup=E9r=E9 de l'internet, que je voulais modif=
ier
pour afficher dans une MsgBox, =E9l=E9ment par =E9l=E9ment pour voir ce qu'=
il
contient comme valeur, mais une erreur est signal=E9e :

Incompatibilit=E9 de type.

Les donn=E9es :

A2: 10
A3:11
A4:aa10
A5 10bb
A6:12

Le code :

'------------------------------------------
Sub suppr_FiltreElabore()
Dim rF As Range
With ActiveSheet
.Range("C2").FormulaR1C1 =3D
"=3DOR(COUNTIF(RC[-2],""10""),COUNTIF(RC[-2],""*10*""))"
.Range("A1:A" & [A65536].End(xlUp).Row).AdvancedFilter
Action:=3DxlFilterInPlace, CriteriaRange:=3DRange("C1:C2"), Unique:=3DFalse
Set rF =3D .Range("_FilterDataBase")
rF.Select
MsgBox "rF.rows.count-1 =3D " & rF.Rows.Count - 1
'rF.Offset(1, 0).Resize(rF.Rows.Count -
1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
i =3D 1
For Each c In rF
'MsgBox "element " + i + " =3D " + c.Value
i =3D i + 1
Next c
.ShowAllData
'.Range("C2").Clear
End With
End Sub
'-------------------------------

Merci d'avance

10 réponses

1 2 3
Avatar
michdenis
'---------------------------------------------------
Sub suppr_FiltreElabore()
Dim Rg As Range, Sh As Worksheet
Dim DerLig As Long, I As Long
Set Sh = ActiveSheet

Application.ScreenUpdating = False
With Sh
.Range("C2").FormulaR1C1 = _
"=OR(COUNTIF(RC[-2],""10""),COUNTIF(RC[-2],""*10*""))"
DerLig = .Range("A65536").End(xlUp).Row
With .Range("A1:A" & DerLig)
.AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=Sh.Range("C1:C2"), Unique:úlse
End With
Set Rg = .Range("_FilterDataBase")
On Error Resume Next
I = 1
With Rg.Offset(1).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
For Each c In .Cells
MsgBox "element " & I & " = " & c.Value
I = I + 1
Next c
.EntireRow.Delete
End With
.Range("C2").Clear
.ShowAllData
End With
End Sub
'---------------------------------------------------

.
Avatar
Apitos
Bonjour mechdenis,

Ca marche pour l'affichage des cellules correspondantes au test sauf
pour la dernière cellule qui A2:12 et A2:10bb est ignorée, pourtant
elle contient un "10" ...

Merci.
Avatar
michdenis
Je ne peux pas reproduire l'oubli que tu reproches à la procédure

La plage où s'applique le filtre dans la procédure débute en A1
par une étiquette de la colonne...les données suivent en A2...


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

Bonjour mechdenis,

Ca marche pour l'affichage des cellules correspondantes au test sauf
pour la dernière cellule qui A2:12 et A2:10bb est ignorée, pourtant
elle contient un "10" ...

Merci.
Avatar
Apitos
Bonjour mechdenis,

Pas grave, je vais éssayer de trouver ou est l'erreur.

Grand merci à toi mechdenis.
Avatar
Apitos
Salut,

J'ai trouvé également une des tes macros :

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

Dim Rg As Range, Rg1 As Range, DL As Long

With Worksheets("Feuil1")
'Plage sur laquelle s'effecture le filtre
Set Rg = .Range("A1:B" & .Range("B65536").End(xlUp).Row)
'Zone de critère
.Range("J1") = "" 'pour être sûr
.Range("J2").Formula = "=(A2 06)*(B2=""s"")"
'Attribution d'un nom à la plage de critère
.Range("J1:J2").Name = "Crit"

'le filtre élaboré :
With Rg
.AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=Range("Crit")
'Définir la plage à copier
Set Rg1 = .Offset(1).Resize(.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
End With

'Où copier le résultat du filtre
With Worksheets("Feuil3")
'Identifier la dernière ligne +1 de la plage A:A
DL = .Range("A:A").Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row +
1

'copier les données du filtre
Rg1.Copy .Range("A" & DL)
End With

'afficher toutes les données
.ShowAllData
End With
'Supprime le NOM de la zone de critère
Application.Names("Crit").Delete
'Libère la mémoire des objets
Set Rg = Nothing: Set Rg1 = Nothing
End Sub
'----------------------------------------

Elle bien détaillée.
Avatar
michdenis
Tu as bien raision de la reproduire...
De nos jours, c'est rare le travail bien fait !!!

;-))


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

Salut,

J'ai trouvé également une des tes macros :

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

Dim Rg As Range, Rg1 As Range, DL As Long

With Worksheets("Feuil1")
'Plage sur laquelle s'effecture le filtre
Set Rg = .Range("A1:B" & .Range("B65536").End(xlUp).Row)
'Zone de critère
.Range("J1") = "" 'pour être sûr
.Range("J2").Formula = "=(A2 06)*(B2=""s"")"
'Attribution d'un nom à la plage de critère
.Range("J1:J2").Name = "Crit"

'le filtre élaboré :
With Rg
.AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=Range("Crit")
'Définir la plage à copier
Set Rg1 = .Offset(1).Resize(.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
End With

'Où copier le résultat du filtre
With Worksheets("Feuil3")
'Identifier la dernière ligne +1 de la plage A:A
DL = .Range("A:A").Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row +
1

'copier les données du filtre
Rg1.Copy .Range("A" & DL)
End With

'afficher toutes les données
.ShowAllData
End With
'Supprime le NOM de la zone de critère
Application.Names("Crit").Delete
'Libère la mémoire des objets
Set Rg = Nothing: Set Rg1 = Nothing
End Sub
'----------------------------------------

Elle bien détaillée.
Avatar
Apitos
Bonsoir mechdenis,

C'est gràce à vous que nous apprenions de plus en plus le VBA.

Merci pour tous vos efforts.

J'ai fait de nouveaux testes pour la boucle :
'------
I = 1
For Each c In Rg
MsgBox "élement " & I & " = " & c.Value
I = I + 1
Next c
'------

Les données :

A2 10 n
A3 11 n2
A4 aa10 n565
A5 10bb ezr
A6 12 swwx

Le résultat de la plage filtrée est une plage constitué de trois
lignes est trois colonnes :

A2 10 n
A4 aa10 n565
A5 10bb ezr

Il y'aura neuf valeurs à afficher.

Comment pourrais-je avoir seulement les valeurs suivantes :

A2 n
A4 n565
A5 ezr

Merci d'avance.
Avatar
michdenis
Désolé, je ne comprends pas ce que tu veux faire !

Publie ton fichier en utilisant cjoint.com et exprime
clairement ce que tu veux obtenir comme résultat.

Dernière chance...






Merci pour tous vos efforts.

J'ai fait de nouveaux testes pour la boucle :
'------
I = 1
For Each c In Rg
MsgBox "élement " & I & " = " & c.Value
I = I + 1
Next c
'------

Les données :

A2 10 n
A3 11 n2
A4 aa10 n565
A5 10bb ezr
A6 12 swwx

Le résultat de la plage filtrée est une plage constitué de trois
lignes est trois colonnes :

A2 10 n
A4 aa10 n565
A5 10bb ezr

Il y'aura neuf valeurs à afficher.

Comment pourrais-je avoir seulement les valeurs suivantes :

A2 n
A4 n565
A5 ezr

Merci d'avance.
Avatar
Apitos
Bonjour michdenis,

Dernière chance...



Elle restera comme dette et je vais la saisir une autre fois si tu
acceptes bien sur, parce que j'ai trouvé la solution.

Seulement il y a quelques problèmes dans mon exemple :

http://www.cijoint.fr/cjlink.php?file=cj200809/cijUyZB0bk.zip

SI je laisse [A3] vide les lignes extraites viennent se superposeés
l'une sur l'autre et il ne reste à la fin qu'une seule ligne, parce
que ActiveCell.End(xlDown).Row qui doit trouver la dernière ligne
vide, ne fonctionne pas correctement.

Merci.
Avatar
michdenis
C'est possible que tu aies quelques petites retouches à faire
mais le principe général est là :

http://cjoint.com/?jxoN5aL3uU

P.S. Les trucs comme "activesheet" sont à éviter. TOI, tu sais
sur quelle feuille se passe l'activité et ces feuilles ont un nom...
pourquoi ne pas les utiliser ?
Dans la procédure filtre, Feuil1 et Feuil2 représente la propriété
"Name" des objets feuille dans la fenêtre de l'éditeur de code et
non le nom des onglets des feuilles.




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

Bonjour michdenis,

Dernière chance...



Elle restera comme dette et je vais la saisir une autre fois si tu
acceptes bien sur, parce que j'ai trouvé la solution.

Seulement il y a quelques problèmes dans mon exemple :

http://www.cijoint.fr/cjlink.php?file=cj200809/cijUyZB0bk.zip

SI je laisse [A3] vide les lignes extraites viennent se superposeés
l'une sur l'autre et il ne reste à la fin qu'une seule ligne, parce
que ActiveCell.End(xlDown).Row qui doit trouver la dernière ligne
vide, ne fonctionne pas correctement.

Merci.
1 2 3