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
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" a écrit dans le message de news:

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
Avatar
michdenis
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" a écrit dans le message de news:

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
Avatar
michdenis
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
'---------------------------------------------------
Avatar
Apitos
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.
Avatar
michdenis
| 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
Avatar
Apitos
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.
Avatar
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.
Avatar
michdenis
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" a écrit dans le message de news:

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.
Avatar
michdenis
| 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 ....
Avatar
Apitos
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.
1 2 3