- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀에서 매크로 모듈을 삭제했음에도 불구하고 파일 열기·저장·버튼 클릭 시 오류가 반복되는 상황을 체계적으로 진단하고 완전히 제거하는 실무 절차를 제공하는 것이다.
문제 개요와 핵심 진단 포인트
엑셀에서 VBA 모듈을 모두 삭제했는데도 다음과 같은 문제가 지속되는 경우가 있다.
- 파일 열 때 “매크로를 실행할 수 없습니다” 또는 “이 프로젝트 또는 라이브러리를 찾을 수 없습니다” 류의 경고가 표시된다.
- 시트의 버튼·도형·컨트롤을 클릭하면 제거한 매크로 이름으로 호출을 시도하며 실패한다.
- 특정 함수가
#NAME?또는#VALUE!를 반환한다(삭제된 사용자 정의 함수(UDF) 참조). - 리본 탭이나 상황별 메뉴를 클릭할 때 콜백 오류가 난다(RibbonX customUI 콜백 잔존).
이 현상은 “코드가 남아서”만 발생하지 않는다. 참조·이벤트·바인딩 정보가 통합 문서 곳곳에 남아 있기 때문이다. 해결은 “잔존 참조를 전부 식별하고 끊기”로 귀결된다.
증상별 원인-조치 매핑표
| 대표 증상 | 주요 원인 | 현장 조치 |
|---|---|---|
| 열 때 경고 팝업 | Workbook/Worksheet 이벤트 프로시저 잔존, RibbonX customUI 콜백, 누락된 참조(MISSING) | VBE에서 ThisWorkbook·시트 모듈 이벤트 제거, 도구 > 참조에서 MISSING 해제, customUI XML 제거 |
| 버튼·도형 클릭 시 오류 | 도형/컨트롤 .OnAction에 삭제된 매크로명 연결 | 모든 시트 도형·폼컨트롤의 OnAction 일괄 해제 |
수식이 #NAME? | 삭제된 UDF 호출 또는 숨은 정의된 이름이 UDF를 가리킴 | 이름 관리자 정리, UDF 호출 식을 표준 함수로 치환 |
| 특정 시트 전환 시 멈춤 | Excel 4.0 매크로 시트(XLM) 잔존, ActiveX 초기화 | XLM 시트 삭제/격리, ActiveX 컨트롤 재등록 및 .exd 캐시 삭제 |
| 파일 저장 안 됨/손상 경고 | VBA 프로젝트 스트림 손상, 서명/권한 메타 잔존 | “다른 이름으로 저장”으로 .xlsx 변환해 VBA 전체 제거 후 재구성 |
| 일부 기능 클릭 시만 팝업 | 추가 기능(.xlam) 콜백, 외부 링크 호출 | 추가 기능 비활성화, 연결 편집에서 끊기 |
즉시 적용 가능한 10단계 체크리스트
- 백업본을 분리 저장한다(원본과 다른 폴더).
- 신뢰 센터에서 매크로 설정을 “알림 표시 후 사용 안 함”으로 맞춘다.
- VBE(Alt+F11)에서 프로젝트 탐색기를 열고
ThisWorkbook·각 시트 모듈을 모두 확인하여Workbook_Open,Workbook_Activate,Worksheet_Change등 이벤트 프로시저를 완전히 삭제한다. - VBE 메뉴 도구 > 참조에서 MISSING: 항목을 모두 체크 해제한다.
- 시트에서 개체 선택 모드로 모든 버튼/도형을 선택하고 “매크로 지정”에 남은 이름이 없는지 확인한다.
- 이름 관리자(Ctrl+F3)에서 “숨김 이름 포함”으로 보고
#REF!를 가리키는 이름과 UDF 호출 이름을 삭제한다. - 파일을 .xlsx로 저장하여 VBA·서명·customUI를 일괄 제거한다. 필요 시 이후 새
.xlsm으로 재생성한다. - 리본 사용자 지정을 사용했다면, 패키지(Zip) 열기로
customUI/customUI.xml과 관련.rels를 삭제한다. - ActiveX 캐시(
*.exd)를 사용자 프로필의Temp하위 폴더에서 삭제한다. - 외부 추가 기능(.xlam)과 “연결 편집”의 링크를 모두 해제한다.
원인별 심층 해결법
1) 이벤트 프로시저 잔존 정리
다음 이벤트가 한 줄이라도 남아 있으면 엑셀은 매크로를 찾으려 한다.
Workbook_Open,Workbook_BeforeClose,Workbook_SheetActivateWorksheet_Change,Worksheet_SelectionChange
VBE에서 모듈이 0개라도 ThisWorkbook과 시트 모듈은 별도이므로 반드시 비워야 한다.
' 검사 팁: VBE에서 전체 검색(Ctrl+F) ' 찾기어: "Sub Workbook_", "Private Sub Worksheet_", "End Sub" 2) 도형·컨트롤의 OnAction 일괄 해제
삭제된 매크로명을 호출하는 버튼·도형은 클릭 시 오류를 유발한다. 아래 코드를 표준 모듈에 넣어 실행하면 모든 시트의 OnAction 연결을 제거한다.
Option Explicit Sub ClearAllOnAction() Dim ws As Worksheet, shp As Shape For Each ws In ThisWorkbook.Worksheets For Each shp In ws.Shapes On Error Resume Next If shp.OnAction <> "" Then shp.OnAction = "" On Error GoTo 0 Next shp Next ws End Sub OnAction으로 연결된다. ActiveX 커맨드버튼은 코드-비하인드 이벤트이므로 시트 모듈 이벤트 정리가 우선이다.3) UDF 참조 제거와 이름 관리자 정리
삭제된 UDF가 수식에서 호출되면 #NAME?이 뜬다. 이름 관리자에 숨겨진 이름이 UDF를 간접 호출할 수도 있다. 다음 스크립트로 문제 이름을 찾는다.
Sub ListBadNames() Dim nm As Name For Each nm In ThisWorkbook.Names If InStr(1, nm.RefersTo, "(") > 0 Or InStr(1, nm.RefersTo, "#REF!") > 0 Then Debug.Print nm.Name, nm.Visible, nm.RefersTo End If Next nm End Sub 수식 셀에서 특정 UDF를 찾아내려면 다음을 사용한다.
Sub FindUdfCalls() Dim ws As Worksheet, rng As Range For Each ws In ActiveWorkbook.Worksheets On Error Resume Next Set rng = ws.UsedRange.SpecialCells(xlCellTypeFormulas) On Error GoTo 0 If Not rng Is Nothing Then Dim c As Range For Each c In rng If InStr(1, c.Formula, "MyUDF(") > 0 Then Debug.Print ws.Name, c.Address, c.Formula End If Next c End If Next ws End Sub 4) RibbonX customUI 콜백 제거
사용자 지정 리본이 콜백을 참조하면, 모듈 삭제 후에도 엑셀은 콜백을 찾다가 오류를 낸다. 가장 확실한 방법은 패키지 내부의 customUI를 제거하는 것이다.
- 파일을 복사하고
.xlsm확장자를.zip으로 바꾼다. - Zip을 열어
customUI/customUI.xml과 해당_rels를 삭제한다. - 다시
.xlsm으로 확장자를 복원한다.
getVisible·onAction 등 콜백 속성 자체를 XML에서 지워야 한다.5) 누락된 참조(MISSING) 해제
외부 라이브러리나 오래된 타입 라이브러리에 대한 참조가 사라지면 컴파일 시도에서 에러를 유발한다. VBE > 도구 > 참조에서 “MISSING:”으로 표시되는 항목을 전부 체크 해제한다.
Debug.Print 같은 빈 모듈을 만들어 컴파일 상태를 정상화한 뒤 모듈을 다시 삭제하는 방법도 있다.6) Excel 4.0 매크로(XLM) 시트 확인
구형 XLM 매크로 시트는 VBE에서 보이지 않을 수 있다. “이동(Ctrl+G) > 시트 목록”으로 “매크로” 유형 시트를 찾거나, VBA로 다음을 실행해 식별한다.
Sub TraceXlmSheets() Dim sh As Object For Each sh In ThisWorkbook.Sheets If TypeName(sh) = "Excel4MacroSheet" Or TypeName(sh) = "Excel4IntlMacroSheet" Then Debug.Print "XLM:", sh.Name End If Next sh End Sub 발견되면 해당 시트를 삭제하거나 내용을 모두 값으로 변환한다.
7) ActiveX 컨트롤 초기화·캐시 정리
ActiveX 컨트롤은 시스템의 *.exd 캐시에 의해 예기치 않은 오류를 낼 수 있다. 모든 엑셀을 종료하고 사용자 프로필의 임시 폴더에서 \Temp\Excel8.0, \Temp\VBE 하위의 *.exd 파일을 삭제한다.
8) .xlsx로 강제 재생성 후 청정 이식
메타·서명·customUI·VBA 흔적을 일거에 없애려면 다음 절차가 가장 안전하다.
- 문제 파일을 열어 다른 이름으로 저장에서
.xlsx로 저장한다(매크로 포함 요소가 제거된다). - 새
.xlsm파일을 만들고 필요한 코드만 내보내기/가져오기로 이식한다. - 버튼·도형은 새 파일에서 다시 만들고,
OnAction은 마지막 단계에서만 연결한다.
9) 추가 기능(.xlam)·외부 링크 영향 제거
파일 자체가 깨끗해도 추가 기능이 리본 버튼을 바인딩하거나 이벤트를 훅킹하면 오류가 발생한다. 파일을 안전 모드(실행 시 Ctrl 유지)로 열어 재현 여부를 확인한 뒤, 추가 기능 관리자에서 비활성화한다. 데이터 탭의 연결 편집에서도 모든 외부 링크를 끊는다.
10) 32/64비트 Declare 호환과 서명 제거
Declare 문이 남아 있거나 잘못된 포인터 크기 사용으로 런타임 오류가 반복될 수 있다. 모듈을 비웠다면 영향은 없지만, 선언만 남은 경우도 삭제한다. 서명된 VBA 프로젝트는 서명 메타가 잔존할 수 있으므로 .xlsx로 저장하는 절차가 유효하다.
현장 진단 자동화 스크립트
아래 매크로는 잔존 위험 요소를 한 번에 보고한다. VBE의 즉시 창(CTRL+G)에서 결과를 확인한다.
Option Explicit Sub AuditResidualMacroBindings() Dim ws As Worksheet, shp As Shape, nm As Name Dim issues As Long: issues = 0
Debug.Print "=== Residual Binding Audit ==="
' 1) Events presence check
Debug.Print "[Manual] Check ThisWorkbook and each Worksheet for event procedures."
' 2) OnAction bindings
For Each ws In ThisWorkbook.Worksheets
For Each shp In ws.Shapes
On Error Resume Next
If shp.OnAction <> "" Then
Debug.Print "OnAction:", ws.Name, shp.Name, shp.OnAction
issues = issues + 1
End If
On Error GoTo 0
Next shp
Next ws
' 3) Names that call UDF or are broken
For Each nm In ThisWorkbook.Names
If InStr(1, nm.RefersTo, "(") > 0 Or InStr(1, nm.RefersTo, "#REF!") > 0 Then
Debug.Print "NameRef:", nm.Name, nm.RefersTo, "Visible=" & nm.Visible
issues = issues + 1
End If
Next nm
' 4) XLM sheets
Dim sh As Object
For Each sh In ThisWorkbook.Sheets
If TypeName(sh) Like "Excel4*MacroSheet" Then
Debug.Print "XLM Sheet:", sh.Name
issues = issues + 1
End If
Next sh
' 5) References info (manual review)
Debug.Print "[Manual] VBE: Tools > References. Clear all MISSING."
Debug.Print "Total Issues Flagged:", issues
Debug.Print "=== End Audit ==="
End Sub
오류 상황별 복구 절차 예시
사례 A. 파일 열 때 “매크로를 실행할 수 없습니다”
ThisWorkbook·시트 이벤트 제거.- customUI XML 삭제 또는 .xlsx 저장 후 재생성.
- MISSING 참조 해제.
사례 B. 버튼 클릭 시만 오류
ClearAllOnAction실행으로 바인딩 제거.- 필요한 버튼만 새 매크로에 재연결.
사례 C. 수식이 대량 #NAME?
ListBadNames로 숨은 이름 정리.- UDF 호출 수식 검색·치환.
품질 확보를 위한 점검 체크리스트(배포 전)
- VBE에서 컴파일 오류 0건.
- 이름 관리자:
#REF!0건, 숨김 이름 불필요 0건. - 모든 시트의 도형·버튼
OnAction공란. - customUI 없음 또는 콜백 미사용.
- 추가 기능 의존 0건 또는 문서화 완료.
예방 가이드라인
- 버튼/도형을 만들 때는 최종 배포 직전에만
OnAction을 연결한다. - 리본 사용자 지정이 필요하면 콜백 대신 매크로 기록/버튼으로 대체하거나, 콜백 이름에 버전 접두어를 붙여 관리한다.
- UDF는 모듈화하고 이름 관리자를 통해 간접 참조하지 않는다.
- 정기적으로 .xlsx로 내보내 “청정 스냅샷”을 만든다.
- 배포 전 “안전 모드”로 열어 재현 테스트를 한다.
FAQ
모듈을 전부 삭제했는데도 VBE에서 컴파일 오류가 난다.
참조(MISSING)가 원인일 가능성이 높다. VBE > 도구 > 참조에서 MISSING 항목을 해제한 뒤, 임시 빈 모듈을 만들고 컴파일을 시도하여 상태를 초기화한다.
customUI를 살리고 싶다. 콜백 오류만 없애려면?
XML에서 onAction, getVisible, getEnabled 등 콜백 속성만 제거한다. 리본은 남지만 코드 호출은 사라진다.
버튼이 너무 많다. 일괄로 새 매크로에 연결할 수 있나?
For Each ws.Shapes 루프에서 shp.OnAction = "NewMacroName"으로 일괄 지정이 가능하다. 테스트 후 적용한다.
Excel 4.0 매크로는 반드시 삭제해야 하나?
배포 보안과 유지보수 측면에서 삭제를 권장한다. 꼭 필요하면 별도 파일로 분리하고 호출 경로를 명확히 문서화한다.
.xlsx로 저장하면 서식이 깨질까?
VBA와 customUI만 제거되며, 일반 서식·수식·피벗은 유지된다. 단, 폼 컨트롤·ActiveX는 동작이 달라질 수 있으니 사전 테스트가 필요하다.
추가 기능(.xlam) 때문에 생기는지 어떻게 판별하나?
엑셀 시작 시 Ctrl을 눌러 안전 모드로 열어본다. 오류가 사라지면 추가 기능 영향이므로 단계적으로 비활성화하며 원인을 좁힌다.
마무리
매크로 모듈 삭제 후에도 오류가 지속되는 이유는 코드가 아니라 연결·콜백·메타다. 이벤트, OnAction, 이름, customUI, 참조, XLM, ActiveX, 추가 기능을 순차적으로 끊고, 필요하면 .xlsx로 강제 정리 후 청정 이식하면 재현률 0%에 근접한 상태로 복구할 수 있다.
- 공유 링크 만들기
- X
- 이메일
- 기타 앱