Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기이 글의 목적은 엑셀에서 매크로 모듈을 삭제했음에도 불구하고 파일 열기·저장·버튼 클릭 시 오류가 반복되는 상황을 체계적으로 진단하고 완전히 제거하는 실무 절차를 제공하는 것이다.
엑셀에서 VBA 모듈을 모두 삭제했는데도 다음과 같은 문제가 지속되는 경우가 있다.
#NAME? 또는 #VALUE!를 반환한다(삭제된 사용자 정의 함수(UDF) 참조).이 현상은 “코드가 남아서”만 발생하지 않는다. 참조·이벤트·바인딩 정보가 통합 문서 곳곳에 남아 있기 때문이다. 해결은 “잔존 참조를 전부 식별하고 끊기”로 귀결된다.
| 대표 증상 | 주요 원인 | 현장 조치 |
|---|---|---|
| 열 때 경고 팝업 | 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) 콜백, 외부 링크 호출 | 추가 기능 비활성화, 연결 편집에서 끊기 |
ThisWorkbook·각 시트 모듈을 모두 확인하여 Workbook_Open, Workbook_Activate, Worksheet_Change 등 이벤트 프로시저를 완전히 삭제한다.#REF!를 가리키는 이름과 UDF 호출 이름을 삭제한다..xlsm으로 재생성한다.customUI/customUI.xml과 관련 .rels를 삭제한다.*.exd)를 사용자 프로필의 Temp 하위 폴더에서 삭제한다.다음 이벤트가 한 줄이라도 남아 있으면 엑셀은 매크로를 찾으려 한다.
Workbook_Open, Workbook_BeforeClose, Workbook_SheetActivateWorksheet_Change, Worksheet_SelectionChangeVBE에서 모듈이 0개라도 ThisWorkbook과 시트 모듈은 별도이므로 반드시 비워야 한다.
' 검사 팁: VBE에서 전체 검색(Ctrl+F) ' 찾기어: "Sub Workbook_", "Private Sub Worksheet_", "End Sub" 삭제된 매크로명을 호출하는 버튼·도형은 클릭 시 오류를 유발한다. 아래 코드를 표준 모듈에 넣어 실행하면 모든 시트의 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 커맨드버튼은 코드-비하인드 이벤트이므로 시트 모듈 이벤트 정리가 우선이다.삭제된 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 사용자 지정 리본이 콜백을 참조하면, 모듈 삭제 후에도 엑셀은 콜백을 찾다가 오류를 낸다. 가장 확실한 방법은 패키지 내부의 customUI를 제거하는 것이다.
.xlsm 확장자를 .zip으로 바꾼다.customUI/customUI.xml과 해당 _rels를 삭제한다..xlsm으로 확장자를 복원한다.getVisible·onAction 등 콜백 속성 자체를 XML에서 지워야 한다.외부 라이브러리나 오래된 타입 라이브러리에 대한 참조가 사라지면 컴파일 시도에서 에러를 유발한다. VBE > 도구 > 참조에서 “MISSING:”으로 표시되는 항목을 전부 체크 해제한다.
Debug.Print 같은 빈 모듈을 만들어 컴파일 상태를 정상화한 뒤 모듈을 다시 삭제하는 방법도 있다.구형 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 발견되면 해당 시트를 삭제하거나 내용을 모두 값으로 변환한다.
ActiveX 컨트롤은 시스템의 *.exd 캐시에 의해 예기치 않은 오류를 낼 수 있다. 모든 엑셀을 종료하고 사용자 프로필의 임시 폴더에서 \Temp\Excel8.0, \Temp\VBE 하위의 *.exd 파일을 삭제한다.
메타·서명·customUI·VBA 흔적을 일거에 없애려면 다음 절차가 가장 안전하다.
.xlsx로 저장한다(매크로 포함 요소가 제거된다)..xlsm 파일을 만들고 필요한 코드만 내보내기/가져오기로 이식한다.OnAction은 마지막 단계에서만 연결한다.파일 자체가 깨끗해도 추가 기능이 리본 버튼을 바인딩하거나 이벤트를 훅킹하면 오류가 발생한다. 파일을 안전 모드(실행 시 Ctrl 유지)로 열어 재현 여부를 확인한 뒤, 추가 기능 관리자에서 비활성화한다. 데이터 탭의 연결 편집에서도 모든 외부 링크를 끊는다.
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
ThisWorkbook·시트 이벤트 제거.ClearAllOnAction 실행으로 바인딩 제거.#NAME?ListBadNames로 숨은 이름 정리.#REF! 0건, 숨김 이름 불필요 0건.OnAction 공란.OnAction을 연결한다.참조(MISSING)가 원인일 가능성이 높다. VBE > 도구 > 참조에서 MISSING 항목을 해제한 뒤, 임시 빈 모듈을 만들고 컴파일을 시도하여 상태를 초기화한다.
XML에서 onAction, getVisible, getEnabled 등 콜백 속성만 제거한다. 리본은 남지만 코드 호출은 사라진다.
For Each ws.Shapes 루프에서 shp.OnAction = "NewMacroName"으로 일괄 지정이 가능하다. 테스트 후 적용한다.
배포 보안과 유지보수 측면에서 삭제를 권장한다. 꼭 필요하면 별도 파일로 분리하고 호출 경로를 명확히 문서화한다.
VBA와 customUI만 제거되며, 일반 서식·수식·피벗은 유지된다. 단, 폼 컨트롤·ActiveX는 동작이 달라질 수 있으니 사전 테스트가 필요하다.
엑셀 시작 시 Ctrl을 눌러 안전 모드로 열어본다. 오류가 사라지면 추가 기능 영향이므로 단계적으로 비활성화하며 원인을 좁힌다.
매크로 모듈 삭제 후에도 오류가 지속되는 이유는 코드가 아니라 연결·콜백·메타다. 이벤트, OnAction, 이름, customUI, 참조, XLM, ActiveX, 추가 기능을 순차적으로 끊고, 필요하면 .xlsx로 강제 정리 후 청정 이식하면 재현률 0%에 근접한 상태로 복구할 수 있다.