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

Le
Apitos
Bonjour à tous,

Voilà un code que j'ai récupéré de l'internet, que je voulais modif=
ier
pour afficher dans une MsgBox, élément par élément pour voir ce qu'=
il
contient comme valeur, mais une erreur est signalée :

Incompatibilité de type.

Les données :

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

Le code :

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

Merci d'avance
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
michdenis
Le #17254621
Essaie ceci :

'--------------------------------------
Sub suppr_FiltreElabore()
Dim Rg As Range, Sh As Worksheet
Dim DerLig As Long, I As Long

Set Sh = ActiveSheet

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")
Rg.Select
MsgBox "Rg.rows.count-1 = " & Rg.Rows.Count - 1

Rg.Offset(1, 0).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible).EntireRow.Delete
.Range("C2").Clear
.ShowAllData
I = 1
For Each C In Rg
MsgBox "element " & I & " = " & C.Value
I = I + 1
Next C
End With
End Sub
'--------------------------------------









"Apitos"
Bonjour à tous,

Voilà un code que j'ai récupéré de l'internet, que je voulais modifier
pour afficher dans une MsgBox, élément par élément pour voir ce qu'il
contient comme valeur, mais une erreur est signalée :

Incompatibilité de type.

Les données :

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

Le code :

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

Merci d'avance
michdenis
Le #17254611
J'ai oublié de mentionner que cette ligne de code
que j'ai quand même laissé dans la procédure
puisque tu l'avais inséré dans ton exemple ne sert
absolument à rien

Rg.Select

Il serait préférable de l'enlever !




"Apitos"
Bonjour à tous,

Voilà un code que j'ai récupéré de l'internet, que je voulais modifier
pour afficher dans une MsgBox, élément par élément pour voir ce qu'il
contient comme valeur, mais une erreur est signalée :

Incompatibilité de type.

Les données :

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

Le code :

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

Merci d'avance
michdenis
Le #17255051
Ce que devrait être le produit final.

Lorsque l'on utilise la proprité "SpecialCells", on se doit
d'ajouter la commande "on error resume next" au cas où
il n'y a pas de cellules correspondantes... dans ton cas
cela signifierait qu'il n'y a pas d'enregistrements répondant
à ton critère.

'---------------------------------------------------
Sub suppr_FiltreElabore()
Dim Rg As Range, Sh As Worksheet
Dim DerLig As Long, I As Long
Set Sh = ActiveSheet

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
Rg.Offset(1, 0).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible).EntireRow.Delete
.Range("C2").Clear
.ShowAllData
End With
I = 1
For Each C In Rg
MsgBox "element " & I & " = " & C.Value
I = I + 1
Next C
End Sub
'---------------------------------------------------
Apitos
Le #17257831
Bonsoir michdenis,

j'ai un petit souci.

J'aimerais comprendre cette ligne :

Rg.Offset(1, 0).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible).EntireRow.Delete

Pourquoi on a décalé la zone Rg d'une ligne en bas et pourquoi cette
Rezise ?

Merci.
michdenis
Le #17258001
| J'aimerais comprendre cette ligne :

| Rg.Offset(1, 0).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible).EntireRow.Delete

cette section : Rg.Offset(1, 0) permet de décaler la plage
d'une ligne pour ne pas tenir compte de la ligne d'étiquettes
obligatoire pour un filtre élaboré.

cette section : Resize(Rg.Rows.Count - 1) Permet de soustraire
une ligne à l'étendue de la plage ... que représente la ligne
d'étiquettes dont on a retranchée en décalant la plage d'une ligne.

SpecialCells(xlCellTypeVisible) -> ne retient dans la sélection que
les lignes visibles de la plage
Apitos
Le #17265141
Bonsoir mechdenis,

Merci de tes explications.

Si je souhaiterais afficher seulement les éléments du résultat du
filtre et non pas toutes les cellules de la plage soumise au filtre ?

Comment devra être le code ?

Merci.
Apitos
Le #17265371
Salut,

Pourquoi en remplaçant le "+" dans celle ligne :

'----
MsgBox "élément " + i + " = " + c.Value
'----

par "&" dans cette ligne du code en dessus, l'erreur disparaît :

'----
MsgBox "élément " & i & " = " & c.Value
'----

Merci.
michdenis
Le #17265821
Le symbole de concaténation est le &
Il est aussi possible d'utiliser le + qui lui
est une relique du langage "basic" mais il
faut faire attention au signe + qui signifie aussi
"Additionner"

Dans cette ligne de code
MsgBox "élément " + i + " = " + c.Value

la section "+ c.Value" est équivalent de vouloir
additionner la valeur de la variable C à la première
section "élément " + i + " = " qui elle représente
une chaîne de caractère. Le résultat est un message
d'erreur 13 signifiant : "Incompatibilité de type.

Si tu tiens vraiment à utiliser le "+" au lieu du &, il faudrait
que tu écrives :
MsgBox "élément " + i + " = " + Str(c.value)

La fonction Str() transformant c.value en une chaîne de caractères.



"Apitos"
Salut,

Pourquoi en remplaçant le "+" dans celle ligne :

'----
MsgBox "élément " + i + " = " + c.Value
'----

par "&" dans cette ligne du code en dessus, l'erreur disparaît :

'----
MsgBox "élément " & i & " = " & c.Value
'----

Merci.
michdenis
Le #17265981
| afficher seulement les éléments du résultat du filtre

Ce n'est pas seulement les cellules restant après que
tu aies supprimé les lignes indésirables !!!

Je ne saisis pas ce que tu veux afficher ....
Apitos
Le #17268261
Bonsoir michdenis,

Ce n'est pas seulement les cellules restant après que
tu aies supprimé les lignes indésirables !!!

Je ne saisis pas ce que tu veux afficher ....



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


Avec ce code :

'---------------------------------------------------
Sub FiltreElabore()
Dim Rg As Range, Sh As Worksheet
Dim DerLig As Long, I As Long
Set Sh = ActiveSheet


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
Rg.Offset(1, 0).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)
.Range("C2").Clear
.ShowAllData
End With
I = 1
For Each C In Rg
MsgBox "élément " & I & " = " & C.Value
I = I + 1
Next C
End Sub
'---------------------------------------------------

Ce code m'affiche les cellules de A1 à A6 or je ne voudrais afficher
que celles répondants au critère en C1:C2 qui sont A2, A4, A5.

Une deuxième chose : Quand je commente la ligne :

On Error Resume Next

Une erreur est signalée dans la ligne :

Rg.Offset(1, 0).Resize(Rg.Rows.Count - 1). _
SpecialCells(xlCellTypeVisible)

Je crois qu'il manque quelque chose ?


Merci.
Publicité
Poster une réponse
Anonyme