엑셀 VBA 참조 라이브러리 깨짐(MISSING) 오류 완벽 복구 방법

이 글의 목적은 엑셀에서 VBA 프로젝트 실행 시 참조 라이브러리가 깨져 “MISSING:”으로 표시될 때 원인 진단부터 안전한 복구, 재발 방지까지 현장에서 바로 적용할 수 있는 절차와 코드를 제공하는 것이다.

1. 문제가 발생하는 전형적 상황과 위험

VBA 프로젝트가 다른 PC나 배포 환경에서 실행될 때 다음 상황에서 참조가 깨지기 쉽다.

  • Office/Windows 비트수 불일치(32비트 ↔ 64비트)로 ActiveX 또는 API 선언의 비호환이 발생한 경우이다.
  • 개발 PC에만 설치된 외부 구성요소(예: ADO, Scripting Runtime, Outlook, XML) 버전 차이가 있는 경우이다.
  • DLL/OCX 파일 경로가 변경되거나 등록이 해제된 경우이다.
  • 보안 정책으로 차단된 위치에서 통합 문서를 열어 로더가 참조를 불러오지 못한 경우이다.
주의 : “MISSING:” 참조가 있는 상태로 저장하면 같은 오류가 다른 사용자에게 전파되며, 일부 메서드 호출이 다른 라이브러리로 바인딩되어 데이터 손상이 발생할 수 있다.

2. 즉시 조치 체크리스트(5분 진단)

  1. VBA 편집기(VBE)에서 Tools → References를 열어 “MISSING:”으로 시작하는 항목을 확인한다.
  2. 필요 없는 항목이면 체크 해제 후 컴파일(Debug → Compile VBAProject)을 시도한다.
  3. 필수 항목이면 해당 버전과 파일 경로를 기록한다.
  4. 같은 기능의 다른 버전 라이브러리로 대체가 가능한지 확인한다(예: “Microsoft ActiveX Data Objects 6.1 Library” → “2.8 Library”).
  5. 컴파일이 통과되면 저장 후 재시작하여 재현 여부를 확인한다.

3. 근본 원인별 표준 복구 절차

3.1 Office/Windows 비트수 호환 문제

API Declare 문과 포인터 크기 차이로 오류가 발생한다. 다음 원칙을 적용한다.

  • VBA7Win64 조건부 컴파일 상수를 사용하여 32/64비트를 분기한다.
  • 포인터 길이 매개변수는 LongPtr를 사용한다.
  • Declare에는 PtrSafe를 명시한다.
' 모듈 상단 #If VBA7 Then #If Win64 Then Private Declare PtrSafe Function GetTickCount64 Lib "kernel32" () As LongLong #Else Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long #End If #Else Private Declare Function GetTickCount Lib "kernel32" () As Long #End If 
주의 : 64비트 Office에서 32비트 OCX는 로드되지 않는다. 컨트롤 교체 또는 64비트 지원 OCX로 재배포해야 한다.

3.2 버전 불일치(예: ADO, Outlook, XML)

컴파일 타임 바인딩을 사용한 경우 특정 버전의 type library에 고정된다. 두 가지 전략이 있다.

  • 전략 A : 다중 버전 호환이 쉬운 Late Binding(CreateObject)로 전환한다.
  • 전략 B : AddFromGuid를 사용하여 코드로 표준 GUID 버전을 강제한다.
' 전략 A: Late Binding 예시(ADO) Dim cn As Object, rs As Object Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Open "Provider=SQLOLEDB;Data Source=...;Initial Catalog=...;Integrated Security=SSPI;" rs.Open "SELECT 1", cn 
' 전략 B: 개발용 자동 참조 복구 루틴(신뢰된 접근 필요) ' VBIDE Extensibility "Trust access to the VBA project object model" 활성화 필요 Sub RepairReferencesByGuid() Dim r As Reference ' ADO 6.1 GUID 예시: {00000205-0000-0010-8000-00AA006D2EA4}, Major 6, Minor 1 On Error Resume Next For Each r In ThisWorkbook.VBProject.References If r.IsBroken Then ThisWorkbook.VBProject.References.Remove r Next Err.Clear ThisWorkbook.VBProject.References.AddFromGuid "{00000205-0000-0010-8000-00AA006D2EA4}", 6, 1 If Err.Number <> 0 Then ' 대체 버전(2.8)으로 폴백 Err.Clear ThisWorkbook.VBProject.References.AddFromGuid "{00000205-0000-0010-8000-00AA006D2EA4}", 2, 8 End If Debug.Print "Reference repair done. Err=" & Err.Number End Sub 
주의 : AddFromGuid는 사용자 환경에 해당 버전이 설치되어 있어야 성공한다. 실패 시 Late Binding으로 전환한다.

3.3 DLL/OCX 등록 손상

ActiveX 컨트롤이나 COM DLL이 등록되지 않았을 수 있다. 관리자 권한 명령 프롬프트에서 재등록한다.

REM 64비트 OS에서 32비트 OCX 재등록은 SysWOW64 경로 사용 C:\Windows\SysWOW64\regsvr32.exe C:\Path\to\control32.ocx
REM 64비트 DLL/OCX 재등록
C:\Windows\System32\regsvr32.exe C:\Path\to\control64.ocx
주의 : regsvr32는 파일 비트수와 경로가 일치해야 한다. 혼용 시 “모듈을 로드할 수 없습니다” 오류가 발생한다.

3.4 보안 차단(차단된 위치, 차단된 파일)

파일이 인터넷에서 내려받아 “차단됨” 속성을 갖는 경우 로드가 제한된다.

  1. 파일 속성에서 “차단 해제”를 선택한다.
  2. 엑셀에서 신뢰할 수 있는 위치로 파일을 이동한다.
  3. 매크로 설정에서 서명 또는 신뢰할 수 있는 게시자를 사용한다.

4. 현장용 진단 스크립트 모음

4.1 깨진 참조 탐지 및 보고

Sub ReportBrokenReferences() Dim r As Reference, msg As String For Each r In ThisWorkbook.VBProject.References If r.IsBroken Then msg = msg & "MISSING: " & r.Description & " | Guid=" & r.Guid & _ " | Major=" & r.Major & " | Minor=" & r.Minor & vbCrLf End If Next If Len(msg) = 0 Then msg = "No missing references." MsgBox msg, vbInformation, "Reference Status" End Sub 

4.2 자동 정리(불필요 참조 제거 + 컴파일 테스트)

Sub CleanAndCompile() Dim r As Reference On Error Resume Next For Each r In ThisWorkbook.VBProject.References If r.IsBroken Then ThisWorkbook.VBProject.References.Remove r Next Err.Clear Application.VBE.ActiveVBProject.VBComponents("Module1").CodeModule.AddFromString "'touch" Application.Run "ThisWorkbook!DummyCompile" ' 존재하지 않아도 강제 컴파일 트리거 Debug.Print "Compile attempted. Review error list." End Sub 

컴파일 트리거가 필요하면 빈 프로시저를 만들어 호출한다.

Public Sub DummyCompile() ' no-op End Sub 

5. 권장 설계: 참조 안정화 패턴

5.1 Late Binding 기본, Early Binding 보조

대규모 배포 환경에서는 Late Binding을 기본으로 두고, 개발 시 IntelliSense가 필요한 구간에만 #Const로 Early Binding을 켠다.

' 모듈 상단 #Const DEV_EARLYBIND = False
Sub MailSend()
#If DEV_EARLYBIND Then
Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Set olApp = New Outlook.Application
Set olMail = olApp.CreateItem(0)
#Else
Dim olApp As Object, olMail As Object
Set olApp = CreateObject("Outlook.Application")
Set olMail = olApp.CreateItem(0)
#End If
olMail.Subject = "Test"
olMail.Display
End Sub

5.2 타입 안정성 확보를 위한 사용자 정의 타입

Late Binding 환경에서 상수 값이 필요한 경우 상수를 직접 정의한다.

Private Const olMailItem As Long = 0 Private Const adOpenForwardOnly As Long = 0 Private Const adLockReadOnly As Long = 1 

5.3 파일 경로 의존 제거

레지스트리나 설치 경로를 하드코딩하지 않는다. 필요한 경우 EnvironFileSystemObject를 사용하여 동적으로 해결한다.

Function GetSysFolderSysWOW64() As String GetSysFolderSysWOW64 = Environ$("SystemRoot") & "\SysWOW64" End Function 

6. 자주 깨지는 라이브러리와 대안

라이브러리 전형적 파일/버전 대안/대체 전략 비고
Microsoft ActiveX Data Objects 2.8, 6.x Late Binding(CreateObject "ADODB.Connection") 서버 OLE DB 공급자 변경 시 주의
Microsoft Scripting Runtime scrrun.dll CreateObject "Scripting.FileSystemObject" 파일 I/O만 필요하면 Late Binding 권장
Microsoft Outlook XX.0 Object Library Outlook 버전 종속 Late Binding + 상수 수동 정의 클라이언트 미설치 환경 고려
Microsoft XML MSXML2 3.0/6.0 CreateObject "MSXML2.XMLHTTP" 서버 정책에 따라 차단 가능
MSForms FM20.DLL 대체 컨트롤 또는 배포 포함 배포 라이선스 요건 검토

7. 배포 전 품질 게이트(QG) 절차

  1. 컴파일 무오류 확인 후 저장한다.
  2. MISSING 스캔 매크로를 실행하여 깨진 참조가 없는지 확인한다.
  3. 샌드박스 PC(다른 버전/비트수)에서 수동 테스트한다.
  4. 서명 및 신뢰 설정을 점검한다.
  5. 릴리즈 노트에 외부 의존성을 명시한다.

8. 조직 차원의 재발 방지

  • 표준 런타임 가이드라인을 문서화하고 Late Binding 우선 정책을 수립한다.
  • 배포 스크립트로 필수 구성요소 존재 여부를 사전 점검한다.
  • 버전 업그레이드 시 교차 테스트 행렬(Office 버전 × 비트수)을 운용한다.
  • 서명·신뢰 위치·GPO 정책을 IT 표준으로 관리한다.

9. 현장 트러블슈팅 시나리오

9.1 배포 즉시 런타임 오류 발생

  1. VBE → References에서 MISSING 존재 여부 확인한다.
  2. 모듈에서 Option Explicit 선언 후 컴파일하여 타입 누락을 잡는다.
  3. API 선언 오류가 보이면 3.1 절의 조건부 컴파일로 교정한다.

9.2 특정 폼이 열릴 때 오류

MSForms, ActiveX 컨트롤 의존이 높다. 컨트롤 재등록 또는 64비트 대체가 필요하다.

9.3 데이터 연결 매크로 실패

ADO/ODBC 공급자 버전 불일치일 가능성이 높다. Late Binding으로 전환하고 연결 문자열을 표준화한다.

10. 배포 체크리스트(요약)

  • 모든 참조에 MISSING 없음
  • Late Binding 기본화
  • Declare PtrSafe/LongPtr 적용
  • 신뢰 위치 및 서명 적용
  • 샌드박스 검증 통과

FAQ

“MISSING: OLE Automation”은 무엇을 의미하나?

OLE Automation은 기본 자동화 라이브러리이다. 대개 시스템 손상보다는 다른 참조의 연쇄 오류가 원인이다. 먼저 다른 MISSING 항목을 정리하고 컴파일한 뒤 상태를 재확인한다.

GUID를 알면 AddFromGuid로 항상 복구 가능한가?

아니다. PC에 해당 버전이 설치되어 있어야 성공한다. 없으면 실패하며 Late Binding 또는 다른 버전으로의 폴백이 필요하다.

회사 보안 정책으로 “Trust access to the VBA project object model”을 켤 수 없다면?

코드로 참조를 조작하는 자동 복구는 사용할 수 없다. 수동으로 참조를 정리하고, 설계 단계에서 Late Binding으로 전환하여 관리한다.

배포 파일에서 참조를 아예 제거해도 되나?

Late Binding으로 모두 대체했다면 가능하다. 다만 Excel Object Library 등 핵심 내장 참조는 유지해야 한다.

OCX가 특정 사용자만에서만 깨지는 이유는?

해당 PC에 관리자 권한이 없어 등록이 실패했거나, 32/64비트 혼용 때문이다. 비트수에 맞는 regsvr32 경로로 재등록한다.