- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀 VBA에서 발생하는 참조 누락(MISSING) 오류를 체계적으로 진단하고 재발 없이 해결하는 방법을 현업 수준의 절차와 코드 예제로 제공하는 것이다.
1. 문제 개요와 증상 정의
엑셀 VBA 프로젝트에서 외부 라이브러리 또는 객체 라이브러리를 사용하면 VBE의 도구 > 참조 에 해당 항목이 표시되며, 파일 경로 또는 버전 불일치가 발생할 때 MISSING: 접두어가 붙어 컴파일 오류가 발생한다. 대표 증상은 다음과 같으며 대부분 배포 환경 차이로 재현된다.
- 컴파일 오류: 사용자 정의 형식 정의되지 않음, 자동화 오류, 메서드 또는 데이터 멤버를 찾을 수 없음 등이다.
- 런타임 오류: ActiveX 컴포넌트 생성 실패, 인터페이스 지원 안 함 등이다.
- VBE 참조 창: 항목 앞에 MISSING: 이 붙고 경로가 붉게 표시된다.
2. 원인 매커니즘
참조 누락은 크게 6가지 범주로 설명할 수 있다.
- 파일 경로 손상: TLB/DLL/OLB가 이동·삭제·권한 제한으로 로드되지 않음이다.
- 버전 불일치: 개발 PC의 라이브러리 버전과 배포 PC의 버전이 다름이다.
- 비트 수 불일치: 32비트 Office와 64비트 Office 간 API 선언·라이브러리 불일치이다.
- COM 등록 미완료: regsvr32 등록 누락 또는 권한 문제이다.
- 의존성 체인 누락: 상위 DLL이 하위 DLL을 필요로 하나 하위가 부재이다.
- 기업 보안 정책: 외부 라이브러리 차단 또는 승인되지 않은 경로 접근 제한이다.
3. 즉시 복구 절차(수동)
- VBE에서 Alt+F11 을 눌러 편집기를 연다.
- 도구 > 참조 를 열고 MISSING: 항목을 최우선 확인한다.
- MISSING: 체크를 해제한다. 가능한 경우 동일 기능의 다른 버전 항목을 체크한다.
- 찾아보기 를 눌러 실제 DLL/TLB/OLB 파일을 수동 지정한다.
- 디버그 > VBAProject 컴파일 을 실행해 전체 컴파일을 통과시키고 저장한다.
4. 재발 방지 전략: Early Binding ↔ Late Binding 전환
배포 안정성 관점에서 Late Binding은 참조 누락 리스크를 크게 줄인다. 다음은 전형적 전환 예시이다.
4.1 ADO 예시
기존 Early Binding 예시이다.
Dim cn As ADODB.Connection Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
cn.Open "Provider=SQLOLEDB;Data Source=SERVER;Initial Catalog=DB;Integrated Security=SSPI;"
Set rs = New ADODB.Recordset
rs.Open "SELECT 1", cn
Late Binding 전환 예시이다.
Dim cn As Object Dim rs As Object
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=SQLOLEDB;Data Source=SERVER;Initial Catalog=DB;Integrated Security=SSPI;"
Set rs = CreateObject("ADODB.Recordset")
rs.Open "SELECT 1", cn
4.2 Scripting Runtime(FileSystemObject)
Early Binding이다.
Dim fso As Scripting.FileSystemObject Set fso = New Scripting.FileSystemObject
Late Binding이다.
Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject")
4.3 Outlook 자동화
Early Binding이다.
Dim olApp As Outlook.Application Set olApp = New Outlook.Application
Late Binding이다.
Dim olApp As Object Set olApp = CreateObject("Outlook.Application")
5. 배포형 매크로: 실행 시 참조 자동 복구
개발 환경에서 Early Binding을 유지하되, 배포 시 실행 시작부에서 참조 상태를 검사하고 필요한 경우 Late Binding 대체 또는 참조 추가를 시도할 수 있다. 다음 코드는 VBIDE.References 컬렉션을 사용해 참조 문제를 감지한다.
Sub CheckReferences() Dim ref As Reference Dim report As String For Each ref In ThisWorkbook.VBProject.References If ref.IsBroken Then report = report & "누락: " & ref.Name & " | 경로: " & ref.FullPath & vbCrLf End If Next ref If Len(report) > 0 Then MsgBox "참조 누락 감지:" & vbCrLf & report, vbExclamation Else MsgBox "참조 이상 없음", vbInformation End If End Sub
GUID 기반으로 참조를 추가·교체하는 루틴 예시이다.
Sub EnsureADO() ' ADO 2.8 GUID: {00000201-0000-0010-8000-00AA006D2EA4} On Error Resume Next Dim vbRefs As References Set vbRefs = ThisWorkbook.VBProject.References
' 이미 유효한 ADO가 있으면 종료
Dim r As Reference
For Each r In vbRefs
If r.Name = "ADODB" And Not r.IsBroken Then Exit Sub
Next r
' GUID로 추가 시도: 버전 2.8
Err.Clear
vbRefs.AddFromGuid "{00000201-0000-0010-8000-00AA006D2EA4}", 2, 8
If Err.Number <> 0 Then
' 실패 시 Late Binding 폴백을 선택적으로 표시
MsgBox "ADO 참조 추가 실패. Late Binding 모드로 전환하거나 드라이버 설치가 필요하다.", vbExclamation
End If
End Sub
6. 32비트·64비트 Office 호환 설계
비트 수 차이는 참조 누락뿐 아니라 Windows API 선언과 포인터 길이에도 영향을 준다. 조건부 컴파일로 안전한 선언을 유지한다.
#If VBA7 Then ' 64비트 Office 포함 Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long #Else ' 32비트 Office Private Declare Function GetTickCount Lib "kernel32" () As Long #End If
비트 수에 따른 분기 예시이다.
#If Win64 Then Const OFFICE_BITS As String = "64-bit" #Else Const OFFICE_BITS As String = "32-bit" #End If
7. 상수 누락과 컴파일 오류 처리
Late Binding으로 전환 후 자주 발생하는 문제는 라이브러리 상수 식별자 미정의이다. 다음 방법으로 해결한다.
- 필수 상수 값을 문서에서 확인해 Const 로 직접 선언한다.
- 상수 그룹이 많다면 Enum 을 자체 정의해 가독성을 유지한다.
' ADODB LockTypeEnum 일부 상수 값 직접 선언 Public Const adLockReadOnly As Long = 1 Public Const adOpenForwardOnly As Long = 0
8. 흔한 라이브러리와 안전한 ProgID 매핑
| 용도 | 라이브러리(예) | Early Binding 타입 | Late Binding ProgID | 비고 |
|---|---|---|---|---|
| DB 연결 | Microsoft ActiveX Data Objects | ADODB.Connection | ADODB.Connection | ADO 2.8 권장이다. |
| 파일 시스템 | Microsoft Scripting Runtime | Scripting.FileSystemObject | Scripting.FileSystemObject | OS 기본 제공이다. |
| XML 처리 | MSXML | MSXML2.DOMDocument60 | MSXML2.DOMDocument.6.0 | 버전 6.0 우선이다. |
| Outlook 자동화 | Microsoft Outlook xx.0 | Outlook.Application | Outlook.Application | 클라이언트 설치 필요하다. |
| Shell | Windows Script Host Object Model | WshShell | WScript.Shell | 보안 정책 확인 필요하다. |
9. Access·DAO·Excel 간 상호 참조 이슈
Access와 Excel을 함께 사용하는 경우, DAO와 ADO 혼용으로 타입 충돌이 발생한다. 다음 원칙으로 안정성을 확보한다.
- ADO 또는 DAO 중 하나를 주력으로 선택해 일관되게 사용한다.
- 레거시 MDB 작업이 많다면 DAO 3.6을 Late Binding으로 호출한다.
- 타입명이 겹치는 Recordset 등은 명시적 접두사 (예: ADODB.Recordset)로 선언한다.
10. 배포 체크리스트
| 항목 | 체크 방법 | 목표 |
|---|---|---|
| 참조 청결 | 모든 MISSING 해제 및 대체 | 컴파일 성공 |
| Late Binding 전환 | CreateObject 사용 | 버전 의존 최소화 |
| 비트 수 호환 | VBA7/Win64 분기 | 양쪽 모두 구동 |
| 보안 설정 | 신뢰 액세스 옵션 문서화 | 사용자 가이드 제공 |
| 의존성 설치 | 필요 DLL·런타임 목록화 | 무중단 설치 |
11. 자동화 진단 리포트 생성 코드
사용자 PC에서 참조 상태와 비트 수, 주요 ProgID 생성 가능 여부를 점검하는 보고서를 생성한다.
Sub GenerateVBAEnvReport() Dim txt As String, ref As Reference txt = "VBA 환경 리포트" & vbCrLf #If Win64 Then txt = txt & "Office Bits: 64" & vbCrLf #Else txt = txt & "Office Bits: 32" & vbCrLf #End If txt = txt & "참조 상태:" & vbCrLf For Each ref In ThisWorkbook.VBProject.References txt = txt & " - " & IIf(ref.IsBroken, "MISSING: ", "") & ref.Name & " | " & ref.FullPath & vbCrLf Next ref
txt = txt & "ProgID 테스트:" & vbCrLf
txt = txt & TestCreate("ADODB.Connection", " ADO OK") & vbCrLf
txt = txt & TestCreate("Scripting.FileSystemObject", " FSO OK") & vbCrLf
txt = txt & TestCreate("MSXML2.DOMDocument.6.0", " MSXML6 OK") & vbCrLf
Dim f As Integer: f = FreeFile
Open ThisWorkbook.Path & "\VBA_Env_Report.txt" For Output As #f
Print #f, txt
Close #f
MsgBox "리포트 생성 완료: " & ThisWorkbook.Path & "\VBA_Env_Report.txt", vbInformation
End Sub
Private Function TestCreate(ByVal progId As String, ByVal okMsg As String) As String
On Error Resume Next
Dim o As Object
Set o = CreateObject(progId)
If Err.Number = 0 Then
TestCreate = progId & ":" & okMsg
Else
TestCreate = progId & ": 실패(" & Err.Number & ")"
End If
Set o = Nothing
Err.Clear
End Function
12. 흔한 오류와 빠른 해법
- 사용자 정의 형식 정의되지 않음: 참조 누락 또는 타입 라이브러리 경로 손상이다. 참조 복구 후 컴파일한다.
- ActiveX 컴포넌트 생성 실패: ProgID 미등록 또는 권한 부족이다. Late Binding 시도와 함께 설치·등록 절차를 검토한다.
- XML 관련 오류: 다양한 MSXML 버전이 병존한다. 6.0을 우선 사용한다.
- Outlook 상호 작용 실패: 사용자 프로파일 구성 여부와 시작 상태를 확인한다.
13. 조직 내 표준 운영 절차(SOP) 제안
- 개발 가이드에 Late Binding 우선 정책을 명시한다.
- 예외적으로 Early Binding이 필요한 경우, GUID 기반 자동 복구 루틴을 포함한다.
- 배포 전 GenerateVBAEnvReport 를 실행해 사전 검증한다.
- 의존 라이브러리 버전 및 설치 절차를 위키로 관리한다.
- 32/64비트 호환 코드를 템플릿으로 공유한다.
14. 실무 예제: Excel에서 XML 파싱
MSXML6 Late Binding으로 안전하게 XML을 파싱하는 샘플이다.
Sub ParseXmlSample() Dim dom As Object, nodes As Object, i As Long Set dom = CreateObject("MSXML2.DOMDocument.6.0") dom.async = False dom.validateOnParse = False dom.LoadXML "<root><item id='1' /><item id='2' /></root>" If dom.parseError.errorCode <> 0 Then Err.Raise vbObjectError + 1, , "XML 파싱 실패" End If Set nodes = dom.SelectNodes("//item") For i = 0 To nodes.Length - 1 Debug.Print nodes.Item(i).getAttribute("id") Next i End Sub
15. 배포 문서 체크포인트
- 필수 권한: 매크로 실행, 신뢰 액세스, 파일 시스템 접근이다.
- 필수 설치: ODBC 드라이버, 특정 런타임 등이다.
- 에러 메시지 매핑표와 해결 루틴 링크를 포함한다.
16. 최종 점검 루틴
프로젝트 오픈 시 자동으로 참조 상태를 점검하고 사용자에게 명확히 안내하는 스타트업 루틴이다.
Private Sub Workbook_Open() On Error Resume Next CheckReferences ' 필요 시 EnsureADO 등 호출 End Sub
FAQ
참조 누락 없이 Early Binding을 유지하려면 어떻게 하나?
개발·테스트·운영 환경에 동일 버전의 라이브러리를 배포하고 설치 자동화를 시행하면 된다. MSI 또는 스크립트를 사용해 DLL/OCX 등록을 표준화하고, 프로젝트에 GUID 기반 복구 루틴을 포함해 방어적으로 설계한다.
Late Binding으로 전환 시 성능 저하는 큰가?
대부분의 업무 자동화에서는 체감되지 않는다. 대량 반복 호출에서는 Early Binding이 미세하게 유리할 수 있으므로 병목 구간만 Early Binding으로 유지하고 나머지는 Late Binding으로 구성하는 혼합 전략이 합리적이다.
32비트 Office와 64비트 Office 중 무엇을 기준으로 개발해야 하나?
배포 대상 다수가 64비트 Office를 사용한다면 64비트를 기준으로 개발하되, 조건부 컴파일로 32비트를 지원한다. 외부 COM이 32비트 전용이라면 32비트 Office 사용을 전제로 한다.
regsvr32 등록이 필요한데 권한이 없다면?
IT 부서에 등록 절차를 요청하거나 장치 관리자 권한이 있는 설치 패키지를 사용한다. 사용자 수준에서 처리할 수 없는 경우가 많다.
Outlook 자동화 시 보안 프롬프트를 줄이는 방법은?
Outlook 트러스트 센터 정책 및 MAPI 프로필 구성 상태를 점검하고, 신뢰할 수 있는 디지털 서명 매크로를 사용한다. 필요 시 EWS 또는 Graph API 등 대체 경로를 검토한다.
- 공유 링크 만들기
- X
- 이메일
- 기타 앱