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.
4 Réponses :
Supposons que nous commencions par:
puis appliquez un filtre:
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
J'ai changé cette partie:
LastRow = Sheet1.Range("A" & Sheet1.Rows.Count).End(xlUp).Row
en ceci:
LastRow = rFiltered.Cells(FirstRow).End(xlDown).Row
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.
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:
Si vous ajoutez 1 à: lCol = rng2.Column () + 1
Vous obtiendrez ceci:
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
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 a>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.