2008-09-16 17 views
50

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?

+4

Une réponse plus détaillée peut être trouvée [ICI] (http://stackoverflow.com/questions/11169445/error-finding-last-used-cell-in-vba) –

+1

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

+0

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

Répondre

40

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.

+9

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

+1

@GSerg Vous pouvez corriger le code, puis supprimez le commentaire si vous le souhaitez (car il ne s'appliquera plus ) – JimmyPena

+0

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. –

-2
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 
7
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") 
+0

La vérification de isempty (r.value) est-elle vraiment nécessaire? Ne devrait-il pas toujours avoir une valeur? – gdelfino

+0

@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

0

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) 
+5

Cela ne fonctionne pas s'il y a des cellules vides dans la colonne. –

21

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

3
Public Function LastData(rCol As Range) As Range  
    Set LastData = rCol.Find("*", rCol.Cells(1), , , , xlPrevious)  
End Function 

Utilisation: ?lastdata(activecell.EntireColumn).Address

3

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 
7

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" 
+0

Ou comme ce 'getSheetLastRow fonction (sheet2Check comme feuille de calcul) LastRow = sheet2Check .Cells.Find ("*", SearchOrder: = xlByRows, SearchDirection: = xlPrevious) .Row getSheetLastRow = LastRow end function' – user2988717

-1
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"

1

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

enter image description here

Résultat dans la fenêtre immédiate:

?Sheet1.UsedRange.Row+Sheet1.UsedRange.Rows.Count-1 
21 
+0

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

+0

@micstr Vrai, mais c'est ce que font toutes les autres méthodes. – newguy

0
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.