Microsoft 365 Array sélection contraire (Résolu)

Kael_88

XLDnaute Occasionnel
Le Forum,

besoin de votre compétence pour résoudre mon impasse.
dans un tableau, je voudrai sélectionner tout ce qui n'est pas dans mon "Array".autrement dit, le contraire de ma sélection)

ActiveSheet.Range("$A$1", Range("G1").End(xlUp)).AutoFilter Field:=3, Criteria1:=Array( _
"Pablo", "Franck", "Alain", "Roger", "Carla", "Robert"), Operator:=xlFilterValues

Cordialement
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, Kael_88

Un biais (test OK sur mon PC)
VB:
Sub Gauloises_Sans_Filtre()
Dim crit, pf As Range
crit = Array("Pablo", "Franck", "Alain", "Roger", "Carla", "Robert")
With [A1].CurrentRegion
.AutoFilter 3, crit, 7: Set pf = .SpecialCells(12): .AutoFilter: .Cells.EntireRow.Hidden = 0
End With
pf.EntireRow.Hidden = -1: Rows(1).EntireRow.Hidden = 0
End Sub

PS: adapté d'un "vieux" code de patricktoulon
;)
 

jmfmarques

XLDnaute Accro
Bonjour Kael_88
7 est la valeur de la constante xlFilterValues
12 est celle de la constante xlCellTypeVisible
(ces deux noms de constante peuvent être utilisés en lieu et place des nombres 7 et 12)

Ceci étant dit : la méthode montrée est risquée et à compléter de garde-fous (risque en cas de présence de plages déjà cachées avant l'utilisation du filtre).
 

patricktoulon

XLDnaute Barbatruc
bonjour
perso je prends la chose a l'envers très simplement
  1. je choppe l'adresse des occurrences avec le filtre
  2. memo la plage
  3. arrete le filtre
  4. et hide la plage obtenue

exemple :
VB:
Sub test()
    With ActiveSheet
        With .Range("$A$2:$A$17")
            .AutoFilter Field:=1, Criteria1:=Array("Alain", "Carla", "Franck", "Pablo", "robert", "Roger"), Operator:=xlFilterValues
            Set plage = .SpecialCells(xlVisible)
            .AutoFilter
        End With
        plage.EntireRow.Hidden = True
    End With
End Sub

Sub remettre()
Range("$A$2:$A$17").EntireRow.Hidden = False
End Sub
demo3.gif


oupss j'avais pas bien vu la réponse de staple1600 :oops: autant pour moi
je n'ai pas pensé a occurrence positive en header de filtre effectivement bien vu Staple1600
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour le fil, le forum,
VB:
Sub Filtre()
Dim a, tablo, d As Object, i&
a = Array("Pablo", "Franck", "Alain", "Roger", "Carla", "Robert")
With [A1].CurrentRegion
    tablo = .Resize(, 3) 'matrice, plus tapide
    Set d = CreateObject("Scripting.Dictionary")
    d.CompareMode = vbTextCompare 'la casse est ignorée
    For i = 2 To UBound(tablo)
        d(tablo(i, 3)) = ""
    Next
    For i = 0 To UBound(a)
        If d.exists(a(i)) Then d.Remove a(i)
    Next
    If d.Count Then a = d.keys Else a = Chr(1)
    .AutoFilter
    .AutoFilter Field:=3, Criteria1:=a, Operator:=xlFilterValues
End With
End Sub
Bonne journée.
 

job75

XLDnaute Barbatruc
La solution précédente avec le filtre automatique ne me plaît pas vraiment.

En effet les cellules vides sont masquées alors qu'elles devraient être affichées.

Je préfère cette solution très simple avec le filtre avancé :
VB:
Sub AdvancedFilter()
ThisWorkbook.Names.Add "a", Array("Pablo", "Franck", "Alain", "Roger", "Carla", "Robert") 'nom défini
Application.ScreenUpdating = False
Columns(1).Insert
[A2] = "=ISNA(MATCH(D2,a,0))"
[B1].CurrentRegion.AdvancedFilter xlFilterInPlace, [A1:A2] 'filtre avancé
Columns(1).Delete
End Sub

Sub RAZ()
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
ok mais comme l'a souligné Staple1600 la cells(1) de la plage filtrée peut contenir un élément de l'array
hors celle ci n'est jamais masquée par le filtre car c'est elle qui tient la poignée du filtre
Staple la supprime automatiquement sauf qu'il est possible que la valeur ne fasse pas parti de l'array donc dans ce cas la il faut la garder

ayant une sainte horreur du on error ... avec application.match alors j'utilise aujourd'hui une autre méthode pour déterminer si on enlève la ligne(1) ou pas
c'est pas super beau mais fonctionnel

VB:
Sub test()
    With ActiveSheet
        crit = Array("Alain", "Carla", "Franck", "Pablo", "robert", "Roger")
        With .Range("$A$1:$A$20")
            first = .Cells(1).Text
            .AutoFilter Field:=1, Criteria1:=crit, Operator:=xlFilterValues
            Set plage = .SpecialCells(xlVisible)
            .AutoFilter
            plage.EntireRow.Hidden = True
            ActiveWindow.ScrollRow = 1
            .Rows(1).Hidden = InStr("," & Join(crit, ",") & ",", "," & first & ",") > 0
        End With
    End With
End Sub
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 196
Messages
2 086 102
Membres
103 117
dernier inscrit
augustin.morille