Betere manier om de laatst gebruikte rij te vinden

Ik probeer de laatste rij op dezelfde manier te vinden als de laatste kolom:

Sheets("Sheet2").Cells(1,Sheets("Sheet2").Columns.Count).End(xlToLeft).Column

Ik ken deze manier, maar het is niet zo nuttig als de vorige zou zijn:

u = Sheets("Sheet1").Range("A65536").End(xlUp).Row

Ik heb het geprobeerd:

Sheets("Sheet2").Cells(Sheets("Sheet2",1).Rowa.Count).End(xlToUP).Column

Synopsis: ik wil graag de onderstaande manier voor de laatste rij.

Sheets("Sheet2").Cells(1,Sheets("Sheet2").Columns.Count).End(xlToLeft).Column

Antwoord 1, autoriteit 100%

U moet een with-statement gebruiken om zowel het aantal Rowsals Columnste kwalificeren. Dit voorkomt fouten tijdens het werken met oudere Excel-werkmappen van vóór 2007 en nieuwere 2007.

Laatste kolom

With Sheets("Sheet2")
    .Cells(1, .Columns.Count).End(xlToLeft).Column
End With 

Laatste rij

With Sheets("Sheet2")
    .Range("A" & .Rows.Count).End(xlUp).Row
End With 

Of

With Sheets("Sheet2")
    .Cells(.Rows.Count, 1).End(xlUp).Row
End With 

Antwoord 2, autoriteit 25%

Hoe is dit?

dim rownum as integer
dim colnum as integer
dim lstrow as integer
dim lstcol as integer
dim r as range
'finds the last row
lastrow = ActiveSheet.UsedRange.Rows.Count
'finds the last column
lastcol = ActiveSheet.UsedRange.Columns.Count
'sets the range
set r = range(cells(rownum,colnum), cells(lstrow,lstcol))

Antwoord 3, autoriteit 18%

Deze functie zou voldoende moeten zijn als u een bepaald blad wilt specificeren. Ik nam de oplossing van user6432984 en wijzigde deze om geen fouten te veroorzaken. Ik gebruik Excel 2016, dus het werkt mogelijk niet voor oudere versies:

Function findLastRow(ByVal inputSheet As Worksheet) As Integer
    findLastRow = inputSheet.cellS(inputSheet.Rows.Count, 1).End(xlUp).Row
End Function

Dit is de code die moet worden uitgevoerd als u al in het blad werkt waarvan u de laatste rij wilt vinden:

Dim lastRow as Integer
lastRow = cellS(Rows.Count, 1).End(xlUp).Row

Antwoord 4, autoriteit 7%

Ik gebruik deze routine om het aantal gegevensrijen te vinden. Er is een minimum aan overhead vereist, maar door te tellen met een afnemende schaal, vereist zelfs een zeer groot resultaat weinig iteraties. Een resultaat van 28.395 zou bijvoorbeeld slechts 2 + 8 + 3 + 9 + 5 of 27 keer door de lus vereisen, in plaats van een tijdrovende 28.395 keer.

Zelfs als we dat met 10 zouden vermenigvuldigen (283.950), is het aantal herhalingen 27 keer hetzelfde.

Dim lWorksheetRecordCountScaler as Long
Dim lWorksheetRecordCount as Long
Const sDataColumn = "A"   '<----Set to column that has data in all rows (Code, ID, etc.)
    'Count the data records
    lWorksheetRecordCountScaler = 100000  'Begin by counting in 100,000-record bites
    lWorksheetRecordCount = lWorksheetRecordCountScaler
    While lWorksheetRecordCountScaler >= 1
        While Sheets("Sheet2").Range(sDataColumn & lWorksheetRecordCount + 2).Formula > " "
            lWorksheetRecordCount = lWorksheetRecordCount + lWorksheetRecordCountScaler
        Wend
        'To the beginning of the previous bite, count 1/10th of the scale from there
        lWorksheetRecordCount = lWorksheetRecordCount - lWorksheetRecordCountScaler
        lWorksheetRecordCountScaler = lWorksheetRecordCountScaler / 10
    Wend
    lWorksheetRecordCount = lWorksheetRecordCount + 1   'Final answer

Antwoord 5, autoriteit 7%

Dit geeft u de laatst gebruikte rij in een opgegeven kolom.

Optioneel kunt u het werkblad specificeren, anders wordt het actieve werkblad gebruikt.

Function getLastRow(col As Integer, Optional ws As Worksheet) As Long
    If ws Is Nothing Then Set ws = ActiveSheet
    If ws.Cells(ws.Rows.Count, col).Value <> "" Then
        getLastRow = ws.Cells(ws.Rows.Count, col).Row
        Exit Function
    End If
    getLastRow = ws.Cells(Rows.Count, col).End(xlUp).Row
    If shtRowCount = 1 Then
        If ws.Cells(1, col) = "" Then
            getLastRow = 0
        Else
            getLastRow = 1
        End If
    End If
End Function
Sub test()
    Dim lgLastRow As Long
    lgLastRow = getLastRow(2) 'Column B
End Sub

Antwoord 6, autoriteit 4%

Dit is de beste manier die ik heb gezien om de laatste cel te vinden.

MsgBox ActiveSheet.UsedRage.SpecialCells(xlCellTypeLastCell).Row

Een van de nadelen van het gebruik hiervan is dat het niet altijd nauwkeurig is. Als je het gebruikt, verwijder dan de laatste paar rijen en gebruik het opnieuw, het wordt niet altijd bijgewerkt. Als u uw werkmap opslaat voordat u deze gebruikt, lijkt deze echter te worden geüpdatet.

Als u het volgende stukje code gebruikt na het bijwerken van de tabel (of het vernieuwen van de query die de tabel voedt), wordt alles geüpdatet voordat de laatste rij wordt gevonden. Maar er is gemeld dat het Excel laat crashen. Hoe dan ook, als u dit aanroept voordat u de laatste rij probeert te vinden, zorgt u ervoor dat de tabel als eerste is bijgewerkt.

Application.CalculateUntilAsyncQueriesDone

Een andere manier om de laatste rij voor een bepaalde kolom te krijgen, als u de overhead niet erg vindt.

Function GetLastRow(col, row)
    ' col and row are where we will start.
    ' We will find the last row for the given column.
    Do Until ActiveSheet.Cells(row, col) = ""
        row = row + 1
    Loop
    GetLastRow = row
End Function

Antwoord 7

Ik zoek liever in de laatste lege cel:

Als u de laatste lege cel van de kolom wilt, kunt u dat doen

Dim sh as Worksheet, r as range
set sh = ActiveWorksheet 'if you want an other it's possible
'find a value 
'Columns("A:D") 'to check on multiple columns 
Set r = sh.Columns("A").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
'no value return first row
If r Is Nothing Then Set r = sh.Cells(1, "A") Else Set r = sh1.Cells(r.Row + 1, "A")

Als dit is om een nieuwe rij in te voegen, is zoeken op meerdere kolommen een goede keuze omdat de eerste kolom minder rijen kan bevatten dan de volgende kolommen


Antwoord 8

Ik gebruik de volgende functie uitgebreid. Zoals hierboven vermeld, kan het gebruik van andere methoden soms onnauwkeurige resultaten opleveren vanwege gebruikte bereikupdates, hiaten in de gegevens of verschillende kolommen met verschillende rijtellingen.

Voorbeeld van gebruik:

lastRow=FindRange("Sheet1","A1:A1000")

zou het laatst bezette rijnummer van het gehelebereik retourneren. U kunt elk gewenst bereik opgeven, van enkele kolommen tot willekeurige rijen, bijvoorbeeld FindRange(“Sheet1″,”A100:A150”)

Public Function FindRange(inSheet As String, inRange As String) As Long
    Set fr = ThisWorkbook.Sheets(inSheet).Range(inRange).find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
    If Not fr Is Nothing Then FindRange = fr.row Else FindRange = 0
End Function

Antwoord 9

Problemen met normale methoden

Account voor lege rijen/kolommen –
Als u lege rijen of kolommen aan het begin van uw gegevens hebt, zullen methoden zoals UsedRange.Rows.Count en UsedRange.Columns.Count deze lege rijen overslaan (hoewel ze wel rekening houden met lege rijen / kolommen die de gegevens kunnen opsplitsen ), dus als u naar ThisWorkbook.Sheets(1).UsedRange.Rows.Count verwijst, slaat u regels over in gevallen waarin er lege rijen bovenaan uw blad staan, bijvoorbeeld op dit blad:

Hiermee wordt de bovenste rij van de telling overgeslagen en wordt 11 geretourneerd:

ThisWorkbook.Sheets(1).UsedRange.Rows.Count

Deze code bevat de lege rij en retourneert in plaats daarvan 12:

ThisWorkbook.Sheets(1).UsedRange.Cells(ThisWorkbook.Sheets(1).UsedRange.Rows.Count, 1).Row

Hetzelfde probleem geldt voor kolommen.

Volledige bladen –
Het identificeren van de laatste rij of kolom kan moeilijk zijn als uw blad vol is (dit is alleen van belang als uw gegevens meer dan een miljoen regels bevatten of waarden in de laatste rijen of kolommen van uw gegevens kunnen hebben). Als u bijvoorbeeld xlEndUp of iets dergelijks gebruikt en de cel waarnaar u verwijst is gevuld, zal de code gegevens overslaan, in extreme gevallen kan uw hele gegevensset worden overgeslagen als de gegevens bijvoorbeeld doorgaan vanaf de laatste rij van het blad (waar u uw xlEndUp start) stevig tot aan de eerste rij (in dit geval zou het resultaat 1) zijn.

'This code works, but... 
'Will not function as intended if there is data in the cell you start with (Cell A:1048576).
Dim Sht1 as Range: Set Sht1 = ThisWorkbook.Sheets(1)
Sht1.Cells(Sht1.Rows.Count, 1).End(xlUp).Row

Kolommen met lege rijen –
De bovenstaande code gaat er ook van uit dat uw gegevens zich helemaal naar beneden in kolom 1 uitstrekken, als u lege vermeldingen in kolom 1 heeft, kunt u rijen kwijtraken, omdat de code de eerste gevulde rij van onderen vindt alleenvoor kolom 1.

Onnodige lussen –
Spreekt voor zich, het is het beste om waar mogelijk lusvorming te vermijden, alsof u met veel gegevens te maken hebt en als u het lusproces vaak herhaalt, kan dit uw code vertragen.

Oplossing

Houd er rekening mee dat dit is gericht op het vinden van de laatste “gebruikte” rij of kolom op een heel blad, dit werkt niet als u alleen de laatste cel in een specifiek bereik wilt.

Ik heb hier enkele functies ingesteld

Private Function GetLastRow(Sheet As Worksheet)
'Gets last used row # on sheet.
GetLastRow = Sheet.UsedRange.Cells(Sheet.UsedRange.Rows.Count, 1).Row
End Function
Private Function GetLastCol(Sheet As Worksheet)
'Gets last used column # on sheet.
GetLastCol = Sheet.UsedRange.Cells(1, Sheet.UsedRange.Columns.Count).Column
End Function

Voorbeelden van het aanroepen van deze functies:

Sub CallFunctions()
    'Define the Target Worksheet  we're interested in:
    Dim Sht1 As Worksheet: Set Sht1 = ThisWorkbook.Sheets(1)
    'Print the last row and column numbers:
    Debug.Print "Last Row = "; GetLastRow(Sht1)
    Debug.Print "Last Col = "; GetLastCol(Sht1)
End Sub

Other episodes