REMARQUE : j'ai l'intention d'en faire un «article à guichet unique» où vous pouvez utiliser le Correct
moyen de trouver la dernière ligne. Cela couvrira également les meilleures pratiques à suivre lors de la recherche de la dernière ligne. Et par conséquent, je continuerai à le mettre à jour chaque fois que je rencontre un nouveau scénario / information.
Manières peu fiables de trouver la dernière ligne
Certaines des méthodes les plus courantes pour trouver la dernière ligne sont très peu fiables et ne doivent donc jamais être utilisées.
- Utilisé
- xlDown
- CountA
UsedRange
ne doit JAMAIS être utilisé pour trouver la dernière cellule contenant des données. C'est très peu fiable. Essayez cette expérience.
Tapez quelque chose dans la cellule A5
. Maintenant, lorsque vous calculez la dernière ligne avec l'une des méthodes ci-dessous, cela vous donnera 5. Maintenant, colorez la cellule en A10
rouge. Si vous utilisez maintenant l'un des codes ci-dessous, vous obtiendrez toujours 5. Si vous utilisez Usedrange.Rows.Count
ce que vous obtenez? Ce ne sera pas 5.
Voici un scénario pour montrer comment UsedRange
fonctionne.
xlDown
est également peu fiable.
Considérez ce code
lastrow = Range("A1").End(xlDown).Row
Que se passerait-il s'il n'y avait qu'une seule cellule ( A1
) contenant des données? Vous finirez par atteindre la dernière ligne de la feuille de calcul! C'est comme sélectionner une cellule A1
, puis appuyer sur la Endtouche puis sur la Down Arrowtouche. Cela vous donnera également des résultats peu fiables s'il y a des cellules vides dans une plage.
CountA
est également peu fiable car il vous donnera un résultat incorrect s'il y a des cellules vides entre les deux.
Et par conséquent , il faut éviter l'utilisation de UsedRange
, xlDown
et CountA
de trouver la dernière cellule.
Rechercher la dernière ligne dans une colonne
Pour trouver la dernière ligne de la colonne E, utilisez ceci
With Sheets("Sheet1")
LastRow = .Range("E" & .Rows.Count).End(xlUp).Row
End With
Si vous remarquez que nous avons un .
avant Rows.Count
. Nous avons souvent choisi d'ignorer cela. Consultez CETTE question sur l'erreur possible que vous pourriez obtenir. Je conseille toujours d'utiliser .
avant Rows.Count
et Columns.Count
. Cette question est un scénario classique dans lequel le code échouera car les Rows.Count
retours 65536
pour Excel 2003 et versions antérieures et 1048576
pour Excel 2007 et versions ultérieures. De même Columns.Count
renvoie 256
et 16384
, respectivement.
Le fait ci-dessus qu'Excel 2007+ a des 1048576
lignes met également l'accent sur le fait que nous devons toujours déclarer la variable qui contiendra la valeur de la ligne car Long
au lieu de cela Integer
, vous obtiendrez une Overflow
erreur.
Notez que cette approche ignorera toutes les lignes masquées. En regardant ma capture d'écran ci-dessus pour la colonne A , si la ligne 8 était masquée, cette approche reviendrait à la 5
place de 8
.
Rechercher la dernière ligne d'une feuille
Pour trouver la Effective
dernière ligne de la feuille, utilisez ceci. Notez l'utilisation de Application.WorksheetFunction.CountA(.Cells)
. Cela est nécessaire car s'il n'y a pas de cellules avec des données dans la feuille de calcul .Find
, vousRun Time Error 91: Object Variable or With block variable not set
With Sheets("Sheet1")
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
lastrow = .Cells.Find(What:="*", _
After:=.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
Else
lastrow = 1
End If
End With
Rechercher la dernière ligne d'une table (ListObject)
Les mêmes principes s'appliquent, par exemple pour obtenir la dernière ligne de la troisième colonne d'un tableau:
Sub FindLastRowInExcelTableColAandB()
Dim lastRow As Long
Dim ws As Worksheet, tbl as ListObject
Set ws = Sheets("Sheet1") 'Modify as needed
'Assuming the name of the table is "Table1", modify as needed
Set tbl = ws.ListObjects("Table1")
With tbl.ListColumns(3).Range
lastrow = .Find(What:="*", _
After:=.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
End With
End Sub