Autres Filtre sur colonnes multiples

Michel1942

XLDnaute Nouveau
Bonjour à tous,



J’ai le problème suivant en VBA sous excel 2003.


Je voudrais filtre sur place un tableau sur deux colonnes non contigües si les cellules sont vides dans les deux colonnes simultanément.
Les colonnes ne sont pas fixes et doivent être sélectionnées avant de lancer la macro.
Le bouton de lancement existe déjà dans ma barre d’outils.
Je joint un exemple de fichier où filtrer les colonnes B et E mais pas forcément.

Je sais faire le filtre sur une colonne.

Merci d’avance pour vos propositions.
 

Pièces jointes

  • Test2.xls
    42.5 KB · Affichages: 9

soan

XLDnaute Barbatruc
Inactif
Bonjour Michel,

fais Ctrl f ➯ travail effectué ! 😊

je te laisse vérifier que les lignes masquées
sont bien les lignes adéquates. 😉



code VBA (20 lignes) :

VB:
Option Explicit

Sub FiltrerBE()
  If ActiveSheet.Name <> "Feuil1" Then Exit Sub
  Dim dlg&: dlg = Cells(Rows.Count, 1).End(3).Row: If dlg < 3 Then Exit Sub
  Dim plg As Range, lig&
  For lig = 3 To dlg
    If IsEmpty(Cells(lig, 2)) And IsEmpty(Cells(lig, 5)) Then
      If plg Is Nothing Then
        Set plg = Rows(lig)
      Else
        Set plg = Union(plg, Rows(lig))
      End If
    End If
  Next lig
  If plg Is Nothing Then Exit Sub
  Application.ScreenUpdating = 0
  plg.EntireRow.Hidden = -1
End Sub

soan
 

Pièces jointes

  • Test2.xls
    67.5 KB · Affichages: 13

Michel1942

XLDnaute Nouveau
Bonjour Michel,

fais Ctrl f ➯ travail effectué ! 😊

je te laisse vérifier que les lignes masquées
sont bien les lignes adéquates. 😉



code VBA (20 lignes) :

VB:
Option Explicit

Sub FiltrerBE()
  If ActiveSheet.Name <> "Feuil1" Then Exit Sub
  Dim dlg&: dlg = Cells(Rows.Count, 1).End(3).Row: If dlg < 3 Then Exit Sub
  Dim plg As Range, lig&
  For lig = 3 To dlg
    If IsEmpty(Cells(lig, 2)) And IsEmpty(Cells(lig, 5)) Then
      If plg Is Nothing Then
        Set plg = Rows(lig)
      Else
        Set plg = Union(plg, Rows(lig))
      End If
    End If
  Next lig
  If plg Is Nothing Then Exit Sub
  Application.ScreenUpdating = 0
  plg.EntireRow.Hidden = -1
End Sub

soan
 

Michel1942

XLDnaute Nouveau
Merci Soan pour cette réponse rapide mais les colonnes ne sont pas prédéfinies. Dans mon exemple c'est B et E mais çà peut être n'importe quelle "doublette. Je sais sélectionner la colonne active mais pas deux ensembles. Ton code fonctionne bien sur des colonnes fixes
Merci pour ta réponse
 

Michel1942

XLDnaute Nouveau
Merci Soan pour cette réponse rapide mais les colonnes ne sont pas prédéfinies. Dans mon exemple c'est B et E mais çà peut être n'importe quelle "doublette. Je sais sélectionner la colonne active mais pas deux ensembles. Ton code fonctionne bien sur des colonnes fixes
Merci pour ta réponse
Je vais essayer de passer par des inputbox pour définir ColonneActive1 et ColonneActive2. Cà va être un peu dommage mais je vais me lancer.
Merci
 

soan

XLDnaute Barbatruc
Inactif
Bonsoir Michel, Marcel,

fais Ctrl f ; ça ne fait rien du tout ! :( c'est normal, car ta cellule active est en colonne A, et la 1ère colonne choisie ne peut pas être la colonne A ; pour choisir la 1ère colonne, sélectionne n'importe quelle autre cellule d'une autre colonne ; par exemple, va en B2 ➯ la 1ère colonne est la colonne B.

il ne peut pas y avoir 2 cellules actives en même temps ; cette version suppose que la 2ème colonne est toujours 3 colonnes à droite de la 1ère colonne choisie ; donc : 2ème colonne = colonne B + 3 = colonne E.

après avoir été en B2, fais Ctrl f ➯ même résultat que celui de mon fichier précédent ; seulement cette fois, tu peux choisir comme 1ère colonne une autre colonne que B, par exemple la colonne D ; la 2ème colonne sera alors, automatiquement, la colonne G. (car 3 colonnes à droite de la colonne D)


cette version marche que si ta 2ème colonne est toujours 3 colonnes à droite de la 1ère ; est-ce que c'est le cas en pratique ? regarde déjà ça, et donne-moi ton avis.

je vais proposer une autre version, où tu pourras choisir aussi la 2ème colonne, sans utiliser de inputbox.
(mais ça va prendre du temps)



code VBA (22 lignes) :

VB:
Option Explicit

Sub FiltrerBE()
  If ActiveSheet.Name <> "Feuil1" Then Exit Sub
  Dim dlg&: dlg = Cells(Rows.Count, 1).End(3).Row: If dlg < 3 Then Exit Sub
  Dim plg As Range, col1%, col2%, lig&
  col1 = ActiveCell.Column: If col1 = 1 Then Exit Sub
  col2 = col1 + 3
  For lig = 3 To dlg
    If IsEmpty(Cells(lig, col1)) And IsEmpty(Cells(lig, col2)) Then
      If plg Is Nothing Then
        Set plg = Rows(lig)
      Else
        Set plg = Union(plg, Rows(lig))
      End If
    End If
  Next lig
  If plg Is Nothing Then Exit Sub
  Application.ScreenUpdating = 0
  plg.EntireRow.Hidden = -1
End Sub

soan
 

Pièces jointes

  • Test2.xls
    68 KB · Affichages: 4

Discussions similaires

Statistiques des forums

Discussions
315 080
Messages
2 116 003
Membres
112 636
dernier inscrit
fred 1969