Comment puis-je trouver la dernière ligne qui contient des données dans une colonne spécifique et sur une feuille spécifique?Comment puis-je trouver la dernière ligne contenant des données dans la feuille Excel avec une macro?
Répondre
Que diriez-vous:
Sub GetLastRow(strSheet, strColumn)
Dim MyRange As Range
Dim lngLastRow As Long
Set MyRange = Worksheets(strSheet).Range(strColum & "1")
lngLastRow = Cells(Rows.Count, MyRange.Column).End(xlUp).Row
End Sub
Re Commentaire
Ce
Cells.Find("*",SearchOrder:=xlByRows,SearchDirection:=xlPrevious).Row
Renvoie le numéro de ligne de la dernière cellule, même si une seule cellule de la dernière ligne contient des données.
Cette fonction retourne mauvais résultats quand: - strColumn est un nombre - il y a des données en ligne 65536 - vous utilisez Excel 2007 avec plus de 65536 lignes – GSerg
@GSerg Vous pouvez corriger le code, puis supprimez le commentaire si vous le souhaitez (car il ne s'appliquera plus
Je crois que cela indiquera incorrectement quelle cellule est la dernière si la cellule avait des données et que les données ont été supprimées. –
Function LastRow(rng As Range) As Long
Dim iRowN As Long
Dim iRowI As Long
Dim iColN As Integer
Dim iColI As Integer
iRowN = 0
iColN = rng.Columns.count
For iColI = 1 To iColN
iRowI = rng.Columns(iColI).Offset(65536 - rng.Row, 0).End(xlUp).Row
If iRowI > iRowN Then iRowN = iRowI
Next
LastRow = iRowN
End Function
function LastRowIndex(byval w as worksheet, byval col as variant) as long
dim r as range
set r = application.intersect(w.usedrange, w.columns(col))
if not r is nothing then
set r = r.cells(r.cells.count)
if isempty(r.value) then
LastRowIndex = r.end(xlup).row
else
LastRowIndex = r.row
end if
end if
end function
Utilisation:
? LastRowIndex(ActiveSheet, 5)
? LastRowIndex(ActiveSheet, "AI")
La vérification de isempty (r.value) est-elle vraiment nécessaire? Ne devrait-il pas toujours avoir une valeur? – gdelfino
@gdelfino Oui c'est. Par exemple. la colonne A a des valeurs dans les lignes 1-10, la colonne B a des valeurs dans les lignes 1-8. 'UsedRange' sera' A1: B10', l'intersection avec 'B: B' sera' B1: B10', la dernière cellule est 'B10' et elle est vide. – GSerg
La première fonction déplace le curseur sur la dernière ligne non vide de la colonne. La deuxième fonction imprime cette colonne.
Selection.End(xlDown).Select
MsgBox (ActiveCell.Row)
Cela ne fonctionne pas s'il y a des cellules vides dans la colonne. –
Vous devez utiliser le .End(xlup)
mais au lieu d'utiliser 65536 vous pouvez utiliser:
sheetvar.Rows.Count
De cette façon, cela fonctionne pour Excel 2007 que je crois compte plus de 65536 lignes
Public Function LastData(rCol As Range) As Range
Set LastData = rCol.Find("*", rCol.Cells(1), , , , xlPrevious)
End Function
Utilisation: ?lastdata(activecell.EntireColumn).Address
Voici une solution pour trouver la dernière rangée, l colonne ast, ou dernière cellule. Il aborde le dilemme de style de référence A1 R1C1 pour la colonne qu'il trouve. Je voudrais pouvoir donner crédit, mais ne peux pas trouver/me souvenir d'où je l'ai eu, alors "Merci!" à qui que ce soit qui a posté le code original quelque part là-bas.
Sub Macro1
Sheets("Sheet1").Select
MsgBox "The last row found is: " & Last(1, ActiveSheet.Cells)
MsgBox "The last column (R1C1) found is: " & Last(2, ActiveSheet.Cells)
MsgBox "The last cell found is: " & Last(3, ActiveSheet.Cells)
MsgBox "The last column (A1) found is: " & Last(4, ActiveSheet.Cells)
End Sub
Function Last(choice As Integer, rng As Range)
' 1 = last row
' 2 = last column (R1C1)
' 3 = last cell
' 4 = last column (A1)
Dim lrw As Long
Dim lcol As Integer
Select Case choice
Case 1:
On Error Resume Next
Last = rng.Find(What:="*", _
After:=rng.Cells(1), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0
Case 2:
On Error Resume Next
Last = rng.Find(What:="*", _
After:=rng.Cells(1), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
On Error GoTo 0
Case 3:
On Error Resume Next
lrw = rng.Find(What:="*", _
After:=rng.Cells(1), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
lcol = rng.Find(What:="*", _
After:=rng.Cells(1), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
Last = Cells(lrw, lcol).Address(False, False)
If Err.Number > 0 Then
Last = rng.Cells(1).Address(False, False)
Err.Clear
End If
On Error GoTo 0
Case 4:
On Error Resume Next
Last = rng.Find(What:="*", _
After:=rng.Cells(1), _
LookAt:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
On Error GoTo 0
Last = R1C1converter("R1C" & Last, 1)
For i = 1 To Len(Last)
s = Mid(Last, i, 1)
If Not s Like "#" Then s1 = s1 & s
Next i
Last = s1
End Select
End Function
Function R1C1converter(Address As String, Optional R1C1_output As Integer, Optional RefCell As Range) As String
'Converts input address to either A1 or R1C1 style reference relative to RefCell
'If R1C1_output is xlR1C1, then result is R1C1 style reference.
'If R1C1_output is xlA1 (or missing), then return A1 style reference.
'If RefCell is missing, then the address is relative to the active cell
'If there is an error in conversion, the function returns the input Address string
Dim x As Variant
If RefCell Is Nothing Then Set RefCell = ActiveCell
If R1C1_output = xlR1C1 Then
x = Application.ConvertFormula(Address, xlA1, xlR1C1, , RefCell) 'Convert A1 to R1C1
Else
x = Application.ConvertFormula(Address, xlR1C1, xlA1, , RefCell) 'Convert R1C1 to A1
End If
If IsError(x) Then
R1C1converter = Address
Else
'If input address is A1 reference and A1 is requested output, then Application.ConvertFormula
'surrounds the address in single quotes.
If Right(x, 1) = "'" Then
R1C1converter = Mid(x, 2, Len(x) - 2)
Else
x = Application.Substitute(x, "$", "")
R1C1converter = x
End If
End If
End Function
simple et rapide:
Dim lastRow as long
Range("A1").select
lastRow = Cells.Find("*",SearchOrder:=xlByRows,SearchDirection:=xlPrevious).Row
Exemple d'utilisation:
cells(lastRow,1)="Ultima Linha, Last Row. Youpi!!!!"
'or
Range("A" & lastRow).Value = "FIM, THE END"
Ou comme ce 'getSheetLastRow fonction (sheet2Check comme feuille de calcul) LastRow = sheet2Check .Cells.Find ("*", SearchOrder: = xlByRows, SearchDirection: = xlPrevious) .Row getSheetLastRow = LastRow end function' – user2988717
sub test()
msgbox Worksheets("sheet_name").Range("A65536").End(xlUp).Row
end sub
C'est rechercher la valeur dans la colonne A cause de "A65536"
Je voudrais souhaitez ajouter un moyen plus fiable en utilisant UsedRange
pour trouver la dernière ligne utilisée:
lastRow = Sheet1.UsedRange.Row + Sheet1.UsedRange.Rows.Count - 1
De même pour trouver la dernière colonne utilisée, vous pouvez see this
Résultat dans la fenêtre immédiate:
?Sheet1.UsedRange.Row+Sheet1.UsedRange.Rows.Count-1
21
note 'UsedRange' reprendra également les formules qui peuvent poser un problème si vous avez des formules traînées en dessous des données visibles (ou [même formatage] (http://stackoverflow.com/a/11169920/4606130)). – micstr
@micstr Vrai, mais c'est ce que font toutes les autres méthodes. – newguy
Public Function GetLastRow(ByVal SheetName As String) As Integer
Dim sht As Worksheet
Dim FirstUsedRow As Integer 'the first row of UsedRange
Dim UsedRows As Integer ' number of rows used
Set sht = Sheets(SheetName)
''UsedRange.Rows.Count for the empty sheet is 1
UsedRows = sht.UsedRange.Rows.Count
FirstUsedRow = sht.UsedRange.Row
GetLastRow = FirstUsedRow + UsedRows - 1
Set sht = Nothing
End Function
feuille
.UsedRange.Rows.Count: nombre de lignes de retrurn utilisés, comprennent pas la ligne vide au-dessus de la première rangée utilisé
si la ligne 1 est vide, et la dernière ligne utilisée est de 10, UsedRange.Rows.Count renverra 9, pas 10.
Cette fonction calcule le numéro de la première ligne de UsedRange plus le nombre de lignes UsedRange.
Une réponse plus détaillée peut être trouvée [ICI] (http://stackoverflow.com/questions/11169445/error-finding-last-used-cell-in-vba) –
Et d'ailleurs un post précédent [ici :)] (http://stackoverflow.com/questions/4872512/last-not-empty-cell-in-row-excel-vba/8583926#8583926) – brettdj
Copie possible de [Erreur lors de la recherche de la dernière cellule utilisée dans VBA] (https://stackoverflow.com/questions/11169445/error-in-finding-last-used-cell-in-vba) – Masoud