엑셀 VBA 마지막 셀 찾는 방법 :: 명령문 스니펫
엑셀 VBA 마지막 셀 찾기 목차 바로가기
명령문 스니펫
전체 시트에서 마지막 셀 찾기 (대부분의 상황에서 사용가능)
With ThisWorkBook.WorkSheets("시트명") ' 사용된 모든 범위에서 마지막셀을 찾습니다. Dim endRow As Long ' 마지막행 Dim endCol As Long ' 마지막열 endRow = .UsedRange.Rows.Count + .UsedRange.Row - 1 endCol = .UsedRange.Columns.Count + .UsedRange.Column - 1 End With
특정 행/열에서 마지막셀 찾기
With ThisWorkBook.WorkSheets("시트명") ' 특정 행/열에서 마지막셀을 찾습니다. Dim endRow As Long ' 마지막행 Dim endCol As Long ' 마지막열 endRow = .Cells(.Rows.Count, 1).End(xlUp).Row endCol = .Cells(1, .Columns.Count).End(xlToLeft).Column End With
예제파일 다운로드
오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.
- [엑셀위키] 시트 마지막셀 찾기 (마지막 행/열 번호 반환)예제파일
명령문 요약
시트에서 사용된 전체 범위 또는 특정 행/열에서 마지막 셀을 찾은 뒤, 셀의 행/열 번호를 반환합니다.
VBA 마지막 셀 찾기 사용 예제
특정 시트의 마지막 셀을 찾은 뒤, 마지막셀의 셀주소, 행번호, 열번호를 메세지박스로 출력하는 명령문을 작성합니다.
Sub Print_FinalCell() Dim sShtName As String sShtName = "시트1" ' 시트명을 입력합니다. With ThisWorkbook.Worksheets(sShtName) Dim endRow As Long Dim endCol As Long Dim endCell As String endRow = .UsedRange.Rows.Count + .UsedRange.Row - 1 endCol = .UsedRange.Columns.Count + .UsedRange.Column - 1 endCell = .Cells(endRow, endCol).Address End With MsgBox sShtName & "의 마지막셀은 " & endCell & "입니다." & vbNewLine & _ "행 번호는 " & endRow & "이고, 열번호는 " & endCol & "입니다." End Sub
엑셀 마지막 셀 찾기 명령문의 동작원리
1. Range의 End 속성은 Ctrl + Shift + 방향키 동작을 수행합니다.
Ctrl + Shift + 방향키는 기준셀에서 연결된 범위의 마지막 셀까지 이동하는 동작을 수행합니다. 자세한 내용은 아래 관련포스트를 참고하세요.
End 속성은 총 4개의 방향으로 이동할 수 있으며, 입력 가능한 값은 아래와 같습니다.
- Range.End(xlToLeft) : 왼쪽으로 이동
- Range.End(xlToRight) : 오른쪽으로 이동
- Range.End(xlToUp) : 아래로 이동
- Range.End(xlToDown) : 위로 이동
관련링크 : MS 홈페이지 VBA Range End 속성 상세설명 바로가기
2. Sheet 의 UsedRange 속성은 시트에서 사용된 전체 범위를 반환합니다.
예를들어, [ 시트1 ] 의 B2:C14 범위를 사용했다면, 명령문은 아래와 같이 동작합니다.
- ' B2:C14 범위를 반환합니다.
Set rng = ThisWorkBook.WorkSheets("시트1").UsedRange - ' 범위에서 사용된 행의 개수인 13을 반환합니다.
endRow = rng.Rows.Count - ' 범위가 시작되는 행번호인 2를 반환합니다.
startRow = rng.Row - ' 범위의 마지막 행 번호인 14를 반환합니다. 열번호도 동일한 원리로 동작합니다.
endRow + startRow - 1 -> 13 + 2 - 1 -> 14
관련링크 : MS 홈페이지 VBA Sheet UsedRange 속성 상세설명 바로가기
3. Sheet 의 Rows.Count / Columns.Count 속성은 시트의 전체 행/열 개수를 반환합니다.
시트에서 사용가능한 전체 행/열의 개수는 엑셀 버전마다 다릅니다.
엑셀버전 최대 행 최대 열 2003 이전 65,536 256 2007 이후 1,038,576 16,384 현재는 대부분 엑셀 2007 이후 버전을 이용하고 있으므로, 최대 행번호와 열번호를 각각의 숫자(1,038,565 / 16,384)로 입력해도 괜찮습니다.
하지만 엑셀 2003 에도 매크로가 사용 될 수 있는 만약의 상황을 대비하여 Rows.Count 와 Columns.Count 속성을 사용하는 것이 좋으며, .Count 속성을 사용할 경우 작성한 코드가 더욱 깔끔해지는 일석이조 효과를 볼 수 있습니다.

근데 제걸로 만들려면 참 많은 노력이 필요하겠네요! ㅎㅎ
네 물론 입니다.
아래 명령문을 응용해보시겠어요?
Sheet1.Cells(Sheet1.Rows.Count ,1).End(xlUp).Column ' 열값을 반환합니다.
제시해드린 답변이 도움이 되셨길 바랍니다.
감사합니다.
지금 셀 값을 복사할때 셀에 값이 없으면 offset이랑 end 때문에 다음 행으로 넘어가서 복사를 하는데, 하나의 열이라도 비어있는 열이 있어도 포함해서 복사하는 방법은 없을까요?
Range("XFD1").End(xlToLeft).Column
실무에 응용해 보고자 하는데, 어떤 A열 마지막셀에 값을 넣어야 할 경우
가령 A열에 표가 A1:A10까지 있고 문자나 숫자가 A5까지 기록 되어 있다면(A6:A10까지는 공백), 매크로를 실행하면 문자를 건너띄고 공백을 지나 A10에 표시가 되는데,
저는 셀에 값이 있는 A6셀을 찾고자 할 때는어떻게 해야 되는지요?
(vba로 구현해야 할 때)
이 부분이 의미하는 바는 멀까요??
endRow = .UsedRange.Rows.Count 이렇게만 해도 구해지는거 아닌가요?
.UsedRange.Rows.Count
는 사용한 범위의 행 개수를 반환하므로
시트 범위가 1행이 아닌 중간부터 시작되면 잘못된 값을 반환해서
.UsedRange.Row - 1
를 사용하는 것이 좋습니다.^^