마지막으로 사용한 행을 찾는 더 좋은 방법
마지막 열을 찾은 것과 동일한 방법으로 마지막 행을 찾으려고 합니다.
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.시트의 맨 위에 빈 행이 있을 경우 줄을 건너뜁니다. 예를 들어, 이 시트의 경우:
카운트에서 맨 위 행을 건너뛰고 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
'it-source' 카테고리의 다른 글
R에서 ggplot2를 사용하여 히스토그램 중첩 (0) | 2023.06.30 |
---|---|
Android에서 FirebaseApp.initializeApp(Context)을 먼저 호출하십시오. (0) | 2023.06.30 |
.gitignore가 .vmx 경로를 무시하지 않습니다. (0) | 2023.06.30 |
ASP.NET 응용 프로그램을 디버깅하는 동안 Fiddler에서 로컬 호스트 트래픽을 표시하는 방법은 무엇입니까? (0) | 2023.06.30 |
루비 배열의 마지막 요소를 제외한 모든 요소 (0) | 2023.06.30 |