0
votes

Recherche de la dernière ligne utilisée dans les données filtrées

Code pour trouver la dernière ligne utilisée dans les données filtrées.

R Number    Name
4879668 Maria L
4879668 Thomas Y
4879668 Eleanor B
4879668 Eleanor B
4879668 Sandra J

Exemple de données filtrées

Sub find()

Dim rFiltered As Range

With ActiveSheet.AutoFilter.Range
    Set rFiltered = .Resize(.Rows.Count - 1).Offset(1).Columns(2).SpecialCells(xlCellTypeVisible)
End With

'is shows 419 - and that is fine
FirstRow = rFiltered.Cells(1, 1).End(xlToLeft).Row
'it shows the very last row 1048576, not the last row in a filtered range
'it should be 423
LastRow = rFiltered.Cells(FirstRow).End(xlDown).Row

For r = FirstRow To LastRow
    If Sheet1.Cells(r, 2).Value = "Maria L" Then
        Rows(r).Interior.Color = rgbBlue
    End If
Next r
    
End Sub

La première ligne utilisée ici est 419, le dernier est 423, mais il montre la toute dernière ligne 1048576.

Le code affiche la dernière ligne correcte uniquement lorsque les données filtrées commencent à partir de la deuxième ligne.


3 commentaires

Vérifiez ici rFiltered = .Resize (.Rows.Count - 1)


C'est l'un des problèmes liés à l'utilisation de xlDown . Vous voudrez peut-être voir CECI


La seule façon dont je peux reproduire votre problème, en utilisant votre code, est de filtrer la liste via une colonne autre que la 2ème, de sorte que la 2ème colonne soit complètement vide.


4 Réponses :


0
votes

Supposons que nous commencions par:

 entrez la description de l'image ici

puis appliquez un filtre:

 entrez la description de l'image ici

Ce qui suit obtiendra le numéro de ligne de la dernière ligne visible dans les données filtrées:

Sub framm()
    Dim r1 As Range, r2 As Range, r3 As Range, Last As Long

    Set r1 = ActiveSheet.AutoFilter.Range
    Set r2 = r1.SpecialCells(xlCellTypeVisible)
    Set r3 = r2.SpecialCells(xlCellTypeLastCell)
    Last = r3.Row

    MsgBox Last
End Sub

 entrez la description de l'image ici


0 commentaires

0
votes

J'ai changé cette partie:

LastRow = Sheet1.Range("A" & Sheet1.Rows.Count).End(xlUp).Row

en ceci:

LastRow = rFiltered.Cells(FirstRow).End(xlDown).Row


0 commentaires

0
votes

Pour expliquer pourquoi ajouter une instruction debug.print.

With ActiveSheet.AutoFilter.Range
    Set rFiltered = .Resize(.Rows.Count - 1).Offset(1).Columns(2).SpecialCells(xlCellTypeVisible)
End With
Debug.Print rFiltered.Address

firstrow = rFiltered.Cells(1, 1).End(xlToLeft).Row
Debug.Print firstrow
Debug.Print rFiltered.Cells(firstrow).Address

Application du filtre pour Eleanor B et une seule étape avec F8

La première impression montre $ B $ 4: $ B $ 5 pour l'adresse filtrée

Le deuxième tirage montre 4 pour $ B $ 4 ligne

Le troisième tirage montre $ B $ 7? Pourquoi, parce que c'est la 4ème ligne de la plage de filtres "$ B $ 4: $ B $ 5"

$ B $ 7 est vide donc la dernière ligne est en bas.


0 commentaires

0
votes

C'est au mieux une proposition délicate. Avez-vous des en-têtes? Avez-vous des totaux? Je suis donc venu avec ce code pour au moins faire face aux totaux (en fait des sous-totaux):

Sub GetLastRowFiltered()

    Dim rng1   As Range
    Dim rng2   As Range
    Dim lFirst As Long
    Dim lLast  As Long
    Dim lCol   As Long

    Set rng1 = ActiveSheet.AutoFilter.Range
    Set rng2 = rng1.SpecialCells(xlCellTypeVisible)

    lFirst = rng2.Row()
    lCol = rng2.Column()
    lLast = Cells(Application.Rows.Count, lCol).End(xlUp).Row()

    MsgBox "First Row: " & Format(lFirst, "###") & vbCrLf & _
           "Last  Row: " & Format(lLast, "###"), _
           vbInformation + vbOKOnly, _
           "Filtered Range Info:"

End Sub 'GetLastRowFiltered

Comme indiqué ci-dessus, vous obtiendrez cette réponse:

Avec out totlas

Si vous ajoutez 1 à: lCol = rng2.Column () + 1

Vous obtiendrez ceci:

With Totals

Je n'ai même pas commencé à penser à obtenir la première ligne de données réelles.

BTW: La solution de Gary me donne 233 comme dernière ligne , et la dernière ligne de ma liste est 186, 187 avec des totaux. Je ne sais pas pourquoi.

HTH


0 commentaires