런타임 오류 1004(Run-time error 1004)는 마이크로소프트 비주얼 베이직(Microsoft Visual Basic)과 관련된 오류 코드로, 엑셀 사용자들에게 발생하는 것으로 널리 알려져 있습니다. 이 오류는 특히 Excel 2003과 Excel 2007에서 가장 빈번하게 나타나지만, 사실 어떤 버전의 엑셀도 런타임 오류 1004로부터 완전히 안전하다고 할 수 없습니다. 대부분의 경우 이 문제를 겪는 사용자는 두 가지 형태의 오류 메시지 중 하나를 보게 됩니다.
런타임 오류 1004의 두 가지 오류 메시지
“런타임 오류 '1004':
워크시트 클래스의 Copy 메서드가 실패했습니다(Copy Method of Worksheet Class failed)”
“런타임 오류 '1004':
응용 프로그램 정의 오류 또는 개체 정의 오류(Application-defined or object-defined error)”
경우에 따라 표시되는 오류 메시지의 세부 문구는 조금씩 다를 수 있지만, 오류 코드 자체는 항상 동일합니다. 어떤 형태의 오류를 만나더라도, 이 문제는 거의 항상 워크시트를 복사한 후 그 복사본을 원본 워크시트와 같은 통합 문서에 삽입하도록 설계된 매크로를 실행하는 도중에 발생합니다.
런타임 오류 1004의 원인
다행히 최악의 기술적 문제들과 달리, 엑셀에서 발생하는 런타임 오류 1004의 원인은 명확하게 밝혀져 있습니다. 실행 중인 매크로가 원본 워크시트를 복사하려는 대상 통합 문서에 이름이 정의된 범위(defined name)가 있으며, 해당 통합 문서를 매크로를 실행하기 전에 저장하고 닫지 않은 상태일 때 이 오류가 발생합니다. 아래 코드는 이러한 상황을 유발할 수 있는 매크로의 예입니다:
Sub CopySheetTest()
Dim iTemp As Integer
Dim oBook As Workbook
Dim iCounter As Integer
' 새 빈 통합 문서 만들기:
iTemp = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
Set oBook = Application.Workbooks.Add
Application.SheetsInNewWorkbook = iTemp
' 통합 문서에 범위를 참조하는
' 정의된 이름 추가:
oBook.Names.Add Name:="tempRange", _
RefersTo:="=Sheet1!$A$1"
' 통합 문서 저장:
oBook.SaveAs "c:\test2.xls"
' 반복문으로 시트 복사. 결국
' 오류 1004 발생: Copy Method of
' Worksheet class failed.
For iCounter = 1 To 275
oBook.Worksheets(1).Copy After:=oBook.Worksheets(1)
Next
End Sub
원인이 밝혀진 만큼 해결책도 존재합니다. 더욱이 해결 방법이 작동하지 않거나 사용자에게 적합하지 않은 경우를 대비하여, 우회 방법(workaround)도 함께 제공됩니다.
해결 방법: 매크로 코드 수정하기
이 문제의 근본적인 해결책은 실행 중인 매크로 코드를 수정하여, 워크시트를 복사하는 과정에서 주기적으로 대상 통합 문서를 저장하고 닫도록 만드는 것입니다. 이렇게 수정된 매크로 코드는 다음과 같습니다:
Sub CopySheetTest()
Dim iTemp As Integer
Dim oBook As Workbook
Dim iCounter As Integer
' 새 빈 통합 문서 만들기:
iTemp = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
Set oBook = Application.Workbooks.Add
Application.SheetsInNewWorkbook = iTemp
' 통합 문서에 범위를 참조하는
' 정의된 이름 추가:
oBook.Names.Add Name:="tempRange", _
RefersTo:="=Sheet1!$A$1"
' 통합 문서 저장:
oBook.SaveAs "c:\test2.xls"
' 반복문으로 시트 복사. 결국
' 오류 1004 발생: Copy Method of
' Worksheet class failed.
For iCounter = 1 To 275
oBook.Worksheets(1).Copy After:=oBook.Worksheets(1)
'우회 방법을 위한 코드 (주석 해제):
'100회마다 저장, 닫기, 다시 열기:
If iCounter Mod 100 = 0 Then
oBook.Close SaveChanges:=True
Set oBook = Nothing
Set oBook = Application.Workbooks.Open("c:\test2.xls")
End If
Next
End Sub
참고: 통합 문서를 저장하고 닫기 전까지 워크시트를 몇 번이나 복사할 수 있는지는 복사 대상 워크시트의 크기에 따라 달라지므로, 정확한 횟수는 사례마다 다를 수 있습니다.
우회 방법: 템플릿으로 새 워크시트 삽입하기
앞서 언급했듯이 이 문제에 대한 우회 방법도 존재합니다. 핵심은 기존 워크시트의 복사본을 만드는 대신, 템플릿에서 새 워크시트를 삽입하는 것입니다. 우회 방법을 적용하려면 다음 단계를 따르세요:
- Excel을 실행합니다.
- 새 통합 문서를 만든 후, 하나만 남기고 나머지 모든 워크시트를 삭제합니다.

- 통합 문서의 서식을 지정합니다.
- 템플릿에 기본적으로 포함되기를 원하는 텍스트, 데이터 및/또는 차트를 남겨둔 유일한 워크시트에 추가합니다.
- Excel 2003 이하 버전을 사용 중이라면 파일 > 다른 이름으로 저장을 클릭합니다. Excel 2007 이상 버전이라면 Microsoft Office 버튼을 클릭한 후 다른 이름으로 저장을 클릭합니다.

- 파일 이름 필드에 원하는 템플릿 이름을 입력합니다.
- 파일 형식 필드 옆의 드롭다운 메뉴를 열고, Excel 2003 이하에서는 Excel 서식 파일(.xlt), Excel 2007 이상에서는 Excel 서식 파일(.xltx)을 선택합니다.

- 저장을 클릭합니다.

- 템플릿 생성이 완료되면, 다음 코드 한 줄을 사용하여 프로그래밍 방식으로 삽입할 수 있습니다:
Sheets.Add Type:=path\filename
참고: 위 코드에서 path\filename 부분은 방금 만든 시트 템플릿이 위치한 전체 경로(파일 이름 포함)로 바꿔 입력해야 합니다.