it-source

마지막으로 사용한 행을 찾는 더 좋은 방법

criticalcode 2023. 6. 30. 22:26
반응형

마지막으로 사용한 행을 찾는 더 좋은 방법

마지막 열을 찾은 것과 동일한 방법으로 마지막 행을 찾으려고 합니다.

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

저는 이 방법을 알고 있지만 앞의 방법만큼 도움이 되지는 않습니다.

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

노력했습니다.

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

개요:마지막 줄은 아래와 같은 방법으로 부탁드립니다.

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

두 가지 조건을 모두 충족하려면 with 문을 사용해야 합니다.Rows그리고.Columns수효가 있습니다.이렇게 하면 2007년 이전 버전과 2007년 최신 버전의 Excel Workbook으로 작업하는 동안 오류가 발생하지 않습니다.

마지막 열

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

마지막 행

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

또는

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

이건 어떠신지요?

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

이 함수는 특정 시트를 지정하려는 경우 유용합니다.저는 user6432984에서 솔루션을 가져와서 오류가 발생하지 않도록 수정했습니다.Excel 2016을 사용하고 있기 때문에 이전 버전에서는 작동하지 않을 수 있습니다.

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

다음의 마지막 행을 찾으려는 시트에서 이미 작업 중인 경우 실행할 코드입니다.

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

이 루틴을 사용하여 데이터 행 수를 찾습니다.최소한의 오버헤드가 필요하지만 감소하는 규모를 사용하여 계산함으로써 매우 큰 결과에도 반복이 거의 필요하지 않습니다.예를 들어, 28,395의 결과는 시간이 많이 소요되는 28,395번 대신 2 + 8 + 3 + 9 + 5번 또는 루프를 통해 27번만 필요합니다.

우리가 그것을 10배(283,950)로 곱하더라도, 반복 횟수는 27배입니다.

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

지정된 열의 마지막 사용 행이 표시됩니다.

선택적으로 워크시트를 지정할 수 있습니다. 그렇지 않으면 활성 시트가 사용됩니다.

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

이게 마지막 감방을 찾는 최선의 방법입니다.

MsgBox ActiveSheet.UsedRage.SpecialCells(xlCellTypeLastCell).Row

이것을 사용할 때의 단점 중 하나는 항상 정확하지 않다는 것입니다.사용한 후 마지막 몇 행을 삭제하고 다시 사용하면 항상 업데이트되지 않습니다.그러나 이를 사용하기 전에 워크북을 저장하면 워크북이 강제로 업데이트되는 것 같습니다.

테이블을 업데이트한 후 또는 테이블을 공급하는 쿼리를 새로 고치면 마지막 행을 찾기 전에 모든 항목이 강제로 업데이트됩니다.그런데 엑셀 크래시가 된다고 합니다.어느 쪽이든 마지막 행을 찾기 전에 호출하면 테이블 업데이트가 먼저 완료됩니다.

Application.CalculateUntilAsyncQueriesDone

오버헤드가 문제가 되지 않는다면 주어진 열의 마지막 행을 얻을 수 있는 또 다른 방법입니다.

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

정상적인 방법의 문제

빈 행/열 계정 - 데이터 시작 부분에 빈 행 또는 열이 있는 경우 사용된 범위와 같은 방법을 사용합니다.Rows.Count 및 UsedRange.열.카운트는 이러한 빈 행을 건너뜁니다(데이터를 분할할 수 있는 빈 행/열을 설명하기는 하지만). 따라서 이 워크북을 참조하십시오.시트(1).사용된 범위.Rows.시트의 맨 위에 빈 행이 있을 경우 줄을 건너뜁니다. 예를 들어, 이 시트의 경우:

Example Sheet with Blank Top Row

카운트에서 맨 위 행을 건너뛰고 11을 반환합니다.

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

이 코드는 빈 행을 포함하고 대신 12를 반환합니다.

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

열에도 동일한 문제가 적용됩니다.

전체 시트 - 시트가 가득 찬 경우 마지막 행 또는 열을 식별하는 것이 어려울 수 있습니다. 이는 데이터에 백만 개 이상의 행이 포함되어 있거나 데이터의 마지막 행 또는 열에 값이 있을 수 있는 경우에만 중요합니다.예를 들어 xlEndUp 등을 사용할 때 참조하는 셀이 채워지면 코드가 데이터 위로 건너뛰게 됩니다. 극단적인 경우에는 데이터가 시트의 마지막 행(xlEndUp을 시작하는 위치)에서 첫 번째 행(이 경우에는 결과가 1)까지 계속되면 전체 데이터 세트를 건너뛸 수 있습니다.

'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

빈 행이 있는 열 - 위의 코드는 데이터가 열 1 전체로 확장되는 것으로 가정합니다. 열 1에 빈 항목이 있는 경우 코드가 열 1에 대해서만 맨 아래에서 첫 번째로 채워진 행을 찾기 때문에 행을 잃을 수 있습니다.

불필요한 루프 - 자체 설명적으로, 많은 데이터를 처리하고 루프 프로세스를 자주 반복하는 것처럼 가능한 한 루프를 피하는 것이 코드 속도를 늦출 수 있습니다.

해결책

이는 전체 시트에서 마지막 "사용된" 행 또는 열을 찾는 것을 목표로 하며, 특정 범위의 마지막 셀을 원하는 경우에는 작동하지 않습니다.

여기에 몇 가지 기능을 설정했습니다.

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

다음 함수 호출의 예:

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

마지막 빈 셀 검색을 선호했습니다.

열의 마지막 빈 셀을 원한다면 그렇게 할 수 있습니다.

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

새 행을 삽입하려면 첫 번째 열에 다음 열보다 적은 행이 포함될 수 있으므로 여러 열에서 찾는 것이 좋습니다.

저는 다음 기능을 광범위하게 사용합니다.위에서 설명한 것처럼 다른 방법을 사용하면 사용된 범위 업데이트, 데이터의 간격 또는 행 개수가 서로 다른 다른 열로 인해 부정확한 결과가 나타날 수 있습니다.

사용 예:

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

전체 범위의 마지막 점유 행 번호를 반환합니다.단일 열에서 임의 행까지 원하는 범위를 지정할 수 있습니다(예: "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

언급URL : https://stackoverflow.com/questions/38882321/better-way-to-find-last-used-row

반응형