Microsoft 365 Fonction Filtrage

DavidMM

XLDnaute Nouveau
Bonjour,

J'ai une liste sur Excel et je voudrai faire un filtrage

1655012087635.png


je voudrai faire un filtrage ( Chef Reseau 12 et Maintenance Reseau 33)

j obtiens ceci

1655012184418.png



La question est : Comment pourrai je avoir la ligne juste au dessus pour avoir ceci (la 3e colonne) ?

1655012631797.png
 

job75

XLDnaute Barbatruc
Bonjour DavidMM,

Voyez le fichier joint et cette macro dans le code de la feuille "Filtre" :
VB:
Private Sub Worksheet_Activate()
Dim n&, crit As Range, i&, j&
Application.ScreenUpdating = False
Columns(1).Delete 'RAZ
[A1] = "Liste"
n = 1
With Sheets("Listes")
    '---liste des critères---
    With .[C1].CurrentRegion
        If .Rows.Count = 1 Then Exit Sub
        Set crit = .Offset(1).Resize(.Rows.Count - 1)
    End With
    '---copie du tableau source---
    With .[A1].CurrentRegion
        For i = 2 To .Rows.Count
            If Application.CountIf(crit, .Cells(i, 1)) Then
                If i > 2 And Application.CountIf(crit, .Cells(i - 1, 1)) = 0 Then
                    n = n + 1
                    .Cells(i - 1, 1).Copy Cells(n, 1) 'copie la ligne précédente
                End If
                n = n + 1
                .Cells(i, 1).Copy Cells(n, 1) 'copie la ligne courante
            End If
        Next
    End With
End With
Columns(1).AutoFit 'ajuste la largeur
End Sub
Elle se déclenche quand on active la feuille.

Elle n'est pas très rapide car les cellules sont copiées une par une pour copier les formats.

Si l'on ne veut pas copier les formats et si le tableau est grand il vaut mieux utiliser des tableaux VBA.

A+
 

Pièces jointes

  • Filtre(1).xlsm
    18.5 KB · Affichages: 2
Dernière édition:

job75

XLDnaute Barbatruc
Si l'on ne veut pas copier les formats et si le tableau est grand il vaut mieux utiliser des tableaux VBA.
Voyez ce fichier (2) et la macro :
VB:
Private Sub Worksheet_Activate()
Dim d As Object, i&, tablo, n&
With Sheets("Listes")
    '---liste des critères sans doublon---
    Set d = CreateObject("Scripting.Dictionary")
    d.CompareMode = vbTextCompare 'la casse est ignorée
    With .[C1].CurrentRegion
        For i = 2 To .Rows.Count
            d(.Cells(i, 1).Value) = ""
        Next i
    End With
    '---tableau source et résultats---
    tablo = .[A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
    For i = 2 To UBound(tablo)
        If d.exists(tablo(i, 1)) Then
            If i > 2 And Not d.exists(tablo(i - 1, 1)) Then
                    n = n + 1
                    tablo(n, 1) = tablo(i - 1, 1)
                End If
                n = n + 1
                tablo(n, 1) = tablo(i, 1)
            End If
    Next i
End With
'---restitution---
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A2] '1ère cellule de destination, à adapter
    If n Then .Resize(n) = tablo
    .Offset(n).Resize(Rows.Count - n - .Row + 1).ClearContents 'RAZ en dessous
End With
Columns(1).AutoFit 'ajuste la largeur
End Sub
Elle est très rapide.
 

Pièces jointes

  • Filtre(2).xlsm
    20.2 KB · Affichages: 2

Statistiques des forums

Discussions
312 108
Messages
2 085 380
Membres
102 876
dernier inscrit
BouteilleMan