메뉴

엑셀 VBA 마지막 셀 찾기 (마지막 행·열 번호 구하기)

by 오빠두엑셀
읽는 시간 4분 최종 수정 2026.08.13

시트 전체는 UsedRange 로, 특정 행·열은 End(xlUp)·End(xlToLeft) 로 마지막 셀을 찾아 행·열 번호를 구합니다.

데이터가 어디까지 채워져 있는지 모른 채 매크로를 돌리면 빈 행까지 훑거나 자료를 놓칩니다. 마지막 셀의 행·열 번호를 먼저 구해 두면 범위를 정확히 잡을 수 있습니다.

마지막 행·열 번호 구하기 — End(xlUp)으로 데이터가 있는 마지막 행·열을 정확히 구합니다.
참고 자료를 정리했어요
LINKS
본문에서 소개한 자료와 예제 파일을 한 곳에 모았습니다.

바로 쓰는 코드

대부분의 상황에서는 UsedRange 로 충분합니다.

'// 시트에서 사용된 전체 범위의 마지막 셀
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

특정 열이나 행 하나만 볼 때는 End 속성을 씁니다.

'// A열의 마지막 행 / 1행의 마지막 열
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

사용 예제

마지막 셀의 주소와 행·열 번호를 메시지 상자로 보여 주는 명령문입니다.

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 — End 속성은 Ctrl + Shift + 방향키입니다

Range.End 는 시트에서 Ctrl + Shift + 방향키를 누른 것과 같습니다. 기준 셀에서 값이 이어진 마지막 셀까지 건너뜁니다.

이동 방향
xlUp 위로
xlDown 아래로
xlToLeft 왼쪽으로
xlToRight 오른쪽으로

맨 아래 행에서 xlUp 으로 거슬러 올라오는 이유는, 중간에 빈 셀이 있어도 진짜 마지막 값에 닿기 때문입니다.

동작 원리 2 — UsedRange 는 사용된 전체 범위입니다

시트1의 B2:C14 를 썼다면 이렇게 동작합니다.

Set rng = ThisWorkbook.Worksheets("시트1").UsedRange
'// B2:C14 범위를 돌려줍니다.

endRow = rng.Rows.Count    '// 사용된 행의 개수 → 13
startRow = rng.Row         '// 범위가 시작되는 행 번호 → 2

endRow + startRow - 1      '// 13 + 2 - 1 = 14 (마지막 행 번호)

행 개수와 시작 위치를 더한 뒤 1을 빼는 이유는, 개수는 1부터 세지만 번호는 시작 행부터 세기 때문입니다. 열도 같은 원리입니다.

동작 원리 3 — Rows.Count 로 시트 크기를 받아옵니다

시트가 가질 수 있는 행·열 개수는 버전마다 다릅니다.

엑셀 버전 최대 행 최대 열
2003 이전 65,536 256
2007 이후 1,048,576 16,384
오빠두Tip : 숫자를 직접 적어도 동작하지만 .Rows.Count·.Columns.Count 를 쓰는 편이 낫습니다. 옛 버전에서 열려도 깨지지 않고, 코드에서 1048576 같은 숫자를 읽어 내야 할 일이 없습니다.

참고 문서

관련 게시글
댓글 9
5 (6개 평가)
TaylorJ
TaylorJ 2020.03.24 23:35
강의 정말 감사합니다. 차근차근 따라하는데, 참 쉽게 가르쳐주셔서 너무 고맙습니다.
근데 제걸로 만들려면 참 많은 노력이 필요하겠네요! ㅎㅎ
유한준
유한준 2020.04.06 08:16
마지막 셀을 찾는 방법 잘 보았습니다. 실제로 적용해보니 쉽네요 혹시 그렇다면 문자열이 나오는 첫번째 열을 찾을 방법도 있을까요 가령 Sheet의 A1 부터 A7 까지는 비어져있고 A8에 처음으로 문자열이 있을때, A8의 행, 열값을 반환 받을 수 있을까요?
오빠두엑셀
오빠두엑셀 작성자 2020.04.06 20:58
안녕하세요?^^
네 물론 입니다.
아래 명령문을 응용해보시겠어요?
Sheet1.Cells(Sheet1.Rows.Count ,1).End(xlUp).Row '행값을 반환합니다.
Sheet1.Cells(Sheet1.Rows.Count ,1).End(xlUp).Column ' 열값을 반환합니다.

제시해드린 답변이 도움이 되셨길 바랍니다.
감사합니다.
darkblling
darkblling 2021.02.19 17:38
.Cells(Rows.Count, "B").End(3)(2).Resize(, 4).Value = c.Offset(, -5).End(xlToLeft).Resize(, 4).Value
지금 셀 값을 복사할때 셀에 값이 없으면 offset이랑 end 때문에 다음 행으로 넘어가서 복사를 하는데, 하나의 열이라도 비어있는 열이 있어도 포함해서 복사하는 방법은 없을까요?
오빠두엑셀
오빠두엑셀 작성자 2021.02.23 22:26
시트의 오른쪽 끝에서 왼쪽방향으로 이동해서 열 번호를 찾도록 명령문을 작성해보세요.
Range("XFD1").End(xlToLeft).Column
윤민호
윤민호 2021.11.19 22:12
강의 잘 보고 있습니다.
실무에 응용해 보고자 하는데, 어떤 A열 마지막셀에 값을 넣어야 할 경우
가령 A열에 표가 A1:A10까지 있고 문자나 숫자가 A5까지 기록 되어 있다면(A6:A10까지는 공백), 매크로를 실행하면 문자를 건너띄고 공백을 지나 A10에 표시가 되는데,
저는 셀에 값이 있는 A6셀을 찾고자 할 때는어떻게 해야 되는지요?
(vba로 구현해야 할 때)
민구
민구 2022.04.23 21:06
 .UsedRange.Row - 1
이 부분이 의미하는 바는 멀까요??
endRow = .UsedRange.Rows.Count 이렇게만 해도 구해지는거 아닌가요?
오빠두엑셀
오빠두엑셀 작성자 2022.04.23 23:54
안녕하세요.
.UsedRange.Rows.Count
는 사용한 범위의 행 개수를 반환하므로
시트 범위가 1행이 아닌 중간부터 시작되면 잘못된 값을 반환해서
.UsedRange.Row - 1
를 사용하는 것이 좋습니다.^^
강민준🤗
강민준🤗 2024.08.10 16:06
좋은 강의 감사합니다.
스크랩 완료