엑셀 매크로 런타임 오류 1004, 코드보다 환경을 먼저 의심해야 하는 이유

오류 번호 1004 하나가 뜨는 순간, 반나절 작업이 멈춘다. 엑셀 매크로 런타임 오류 1004 해결의 핵심은 VBA 코드를 손대기 전에 범위 참조·시트 보호·파일 경로 세 곳을 먼저 점검하는 것이다. 이 세 가지가 현장에서 관찰되는 1004 원인의 대다수를 차지하며, 코드 버그로 단정하고 파고들면 시간만 낭비한다.

코드 버그가 아닌 경우가 훨씬 많다

같은 코드가 어제는 잘 돌았는데 오늘 갑자기 1004가 뜬다. 이때 가장 먼저 드는 생각은 “코드 어딘가 망가졌나?”이지만, 실제로는 실행 환경이 바뀐 경우가 대부분이다. 시트에 보호가 걸렸거나, 참조하는 파일이 닫혀 있거나, 데이터 행이 비어 범위 계산 결과가 0이 됐거나.

VBA 오류 1004의 공식 명칭은 두 가지 형태로 나타난다. “응용 프로그램 정의 또는 개체 정의 오류(Application-defined or object-defined error)”가 가장 흔하고, 특정 메서드 이름을 포함한 “‘PasteSpecial’ 메서드가 ‘Range’ 개체에서 실패했습니다” 같은 메시지도 자주 보인다. 메시지만으로 원인을 확정하기 어렵기 때문에, 원인 유형별로 순서대로 짚어가는 접근이 필요하다.

런타임 오류 1004를 일으키는 세 가지 주요 원인

1. 범위(Range) 참조 오류

가장 빈번한 패턴이다. Range("A1:Z100")처럼 하드코딩된 주소가 실제 데이터 범위를 벗어나거나, 변수로 계산한 행·열 번호가 0 이하이거나 워크시트 상한(행 1,048,576 / 열 16,384)을 초과하면 즉시 1004가 발생한다.

특히 마지막 행을 동적으로 구하는 코드 패턴이 문제다.

lr = Cells(Rows.Count, "A").End(xlUp).Row

A열이 완전히 비어 있으면 lr은 1을 반환한다. 이 값을 그대로 루프 하한으로 쓰거나 Range("A2:A" & lr)처럼 조합하면 빈 범위가 만들어져 1004가 터진다. 빈 시트를 매크로가 처음 만나는 상황인지 먼저 확인해야 한다.

2. 시트 보호(Protect)

보호된 시트에 값을 쓰거나 셀 서식을 변경하려 할 때 1004가 발생한다. 오류 메시지는 “응용 프로그램 정의 또는 개체 정의 오류”로만 뜨기 때문에 원인이 보호 설정이라는 사실을 모르면 엉뚱한 곳을 뒤지게 된다.

팀 공유 파일에서 이 경우가 특히 자주 생긴다. 누군가 시트 보호 설정을 바꾸거나, 비밀번호를 변경했는데 코드 안의 ActiveSheet.Unprotect "기존비밀번호"가 그대로 남아 있으면 보호 해제 자체가 실패하고 이후 쓰기 작업에서 1004가 난다.

3. 파일 경로·시트 이름 불일치

Workbooks("보고서.xlsx")Sheets("데이터")를 코드에 직접 쓸 때, 파일이 닫혀 있거나 시트 이름이 바뀌어 있으면 1004가 발생한다. 파일명 끝에 공백 하나만 들어가도 참조가 끊긴다. 확장자가 .xlsm에서 .xlsx로 바뀐 경우, 또는 다른 폴더에서 같은 이름의 파일이 이미 열려 있는 경우에도 이 문제가 생긴다.

원인 좁히기 — 단계별 체크리스트

  • 1단계: 매크로 실행 중 오류 창에서 반드시 ‘디버그(Debug)’ 버튼을 누른다. VBA 편집기가 열리며 오류 발생 줄이 노란색으로 표시된다. ‘종료(End)’ 버튼을 누르면 위치 정보를 잃는다.
  • 2단계: 노란 줄에 Range, Cells, Rows 등 셀 주소가 있다면 Immediate 창(Ctrl+G)에서 해당 변수 값을 직접 확인한다. 예: ?lr 입력 후 Enter. 0이거나 음수거나 상한을 초과한 값이면 범위 계산 로직이 원인이다.
  • 3단계: Sheets("이름")이나 Workbooks("이름") 참조가 있다면, 현재 열려 있는 파일과 시트 이름을 대소문자·공백 포함 정확히 대조한다.
  • 4단계: 오류 줄 바로 앞에 ActiveSheet.Unprotect를 임시로 추가해 실행해본다. 오류가 사라지면 시트 보호가 원인이다.
  • 5단계: 제목 표시줄에 [읽기 전용] 표시가 있는지 확인한다. 공유 드라이브에서 다른 사람이 먼저 열면 자동으로 읽기 전용이 되어 쓰기 작업 전체가 1004를 낸다.

코드 패턴별 수정 대조표

오류 상황 문제 패턴 수정 방향
빈 시트에서 마지막 행 탐색 lr = Cells(Rows.Count,"A").End(xlUp).Row → A열 비면 lr=1 If lr < 2 Then MsgBox "데이터 없음" : Exit Sub 분기 추가
보호된 시트에 값 쓰기 Range("B2").Value = "결과" → 1004 Unprotect → 쓰기 → Protect 순서로 명시적 감싸기
닫힌 파일 참조 Workbooks("보고서.xlsx").Sheets(1)... Workbooks.Open으로 먼저 열거나, 열림 여부 함수로 사전 체크
열 번호 범위 초과 Cells(1, 변수+1)에서 변수가 16,383 이상 루프 조건에 If 변수 >= Columns.Count Then Exit For 추가
Range 변수 미초기화 Dim rng As Range 선언 후 Set 없이 사용 Set rng = ...로 반드시 할당, 사용 전 If rng Is Nothing Then 검사

오류 메시지 문구로 원인 좁히기

1004 오류는 메시지 내용에 따라 원인 방향이 달라진다. 메시지를 그냥 닫지 말고 문구를 읽어두는 것이 진단 시간을 줄인다.

  • “응용 프로그램 정의 또는 개체 정의 오류” — 가장 광범위한 메시지다. 범위 참조 오류와 시트 보호 둘 다 이 문구를 낸다. 위 체크리스트 2단계부터 순서대로 확인한다.
  • “‘PasteSpecial’ 메서드가 ‘Range’ 개체에서 실패했습니다” (또는 다른 메서드명) — 복사 대상이 없거나, 붙여넣을 데이터 형식이 맞지 않거나, 붙여넣기 전에 클립보드가 비워진 경우다. CopyPasteSpecial 사이에 다른 작업이 끼어들지 않았는지 확인한다.
  • “파일을 찾을 수 없습니다” 형태 — 경로·파일명 문제다. 상대 경로로 작성된 매크로를 다른 폴더에서 실행할 때 특히 자주 생긴다. ThisWorkbook.Path를 기준으로 경로를 동적으로 조합하는 방식으로 수정한다.

재발 방지 — 코드에 습관적으로 넣어야 할 세 가지

오류 줄 하나만 고치고 끝내면 같은 상황이 반복된다. 다음 세 가지를 코드 작성 습관으로 만들면 1004 발생 빈도가 눈에 띄게 줄어든다.

첫째, 범위 변수 유효성 검사. 행·열 번호를 담는 변수는 사용 전에 범위를 확인한다. If lr < 1 Or lr > Rows.Count Then Exit Sub 한 줄이 많은 오류를 막는다.

둘째, 외부 파일 참조는 변수로. 문자열 직접 참조 대신 Set wb = Workbooks("파일.xlsx")로 담아두면, 참조 실패 시 오류 위치가 명확해지고 이후 코드에서 재사용도 쉽다.

셋째, 보호 해제→작업→재보호 패턴 명시. 시트 보호가 걸릴 수 있는 환경이라면 On Error Resume Next로 덮는 대신 아래처럼 명시적으로 쓴다.

ActiveSheet.Unprotect Password:="비밀번호"
' 쓰기 작업
ActiveSheet.Protect Password:="비밀번호"

On Error Resume Next로 1004를 무시하면 오류 창은 사라지지만, 셀 쓰기나 파일 저장이 실제로 실행되지 않은 채 매크로가 계속 도는 문제가 생긴다. 나중에 데이터가 없어진 원인을 찾기가 훨씬 어려워진다. 임시방편으로 쓰더라도 If Err.Number <> 0 Then으로 오류 여부를 반드시 확인해야 한다.

정리

엑셀 매크로 런타임 오류 1004는 VBA 로직보다 실행 환경 — 범위 주소, 시트 보호 상태, 파일 참조 — 에서 비롯되는 경우가 압도적으로 많다. 오류 창에서 디버그 버튼으로 발생 줄을 특정하고, 범위 변수 값 확인 → 시트 보호 임시 해제 → 파일·시트 이름 대조 순서로 환경을 점검하면 대부분의 1004는 30분 이내에 해결된다. 코드 수정은 환경 점검 이후에 시작해도 늦지 않다.

자주 묻는 질문

같은 VBA 코드인데 어떤 PC에서는 1004가 뜨고 다른 PC에서는 안 뜨는 이유가 뭔가요?

실행 환경 차이 때문입니다. 파일 저장 경로, 시트 보호 설정, 엑셀 버전별 행·열 한계, 참조하는 파일의 열림 여부가 PC마다 다를 수 있습니다. 코드는 동일해도 실행 시점의 환경이 다르면 1004가 발생합니다. 오류가 뜨는 PC에서 VBA 편집기 Immediate 창(Ctrl+G)으로 변수 값을 직접 찍어보는 것이 가장 빠른 진단 방법입니다.

1004 오류가 발생한 정확한 줄을 어떻게 찾나요?

매크로 실행 중 오류 대화상자가 뜨면 '디버그(Debug)' 버튼을 누르세요. VBA 편집기가 열리며 오류가 발생한 줄이 노란색으로 강조됩니다. 이후 Immediate 창(Ctrl+G)에서 해당 줄에 쓰인 변수 이름 앞에 ?를 붙여 입력하면 현재 값을 즉시 확인할 수 있습니다.

On Error Resume Next로 1004를 무시하면 안 되는 이유가 있나요?

있습니다. On Error Resume Next는 오류 창은 없애주지만 해당 줄의 작업이 실제로 실행되지 않은 채 매크로가 다음 줄로 넘어갑니다. 결과적으로 셀에 값이 쓰이지 않거나 파일이 저장되지 않았는데도 매크로가 '완료'된 것처럼 보입니다. 이후 데이터 오염이나 보고서 오류로 이어지고, 원인을 추적하기도 훨씬 어려워집니다.

시트 보호 비밀번호를 모를 때 1004 오류를 어떻게 우회하나요?

비밀번호 없이 보호된 시트를 해제하는 방법은 여러 가지가 있지만, 업무용 파일이라면 파일 관리자나 원본 작성자에게 비밀번호를 확인하는 것이 안전합니다. 임시 방편으로 ActiveSheet.Unprotect를 비밀번호 인수 없이 호출하면 비밀번호가 없는 보호는 해제됩니다. 비밀번호가 설정된 경우 코드로 강제 해제하는 방식은 파일 손상 위험이 있어 권장하지 않습니다.

런타임 오류 1004와 런타임 오류 9는 어떻게 다른가요?

오류 9는 '아래 첨자 범위를 벗어났습니다'로, 주로 Sheets('이름') 또는 Workbooks('이름')처럼 이름으로 개체를 참조할 때 해당 이름이 존재하지 않으면 발생합니다. 오류 1004는 개체는 찾았지만 그 위에서 수행하려는 작업(쓰기, 서식 변경 등)이 실패할 때 발생합니다. 시트 이름이 틀리면 9, 시트는 맞지만 보호 때문에 값을 못 쓰면 1004라고 구분하면 쉽습니다.

Leave a Comment