Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기이 글의 목적은 엑셀에서 VBA 프로젝트 실행 시 참조 라이브러리가 깨져 “MISSING:”으로 표시될 때 원인 진단부터 안전한 복구, 재발 방지까지 현장에서 바로 적용할 수 있는 절차와 코드를 제공하는 것이다.
VBA 프로젝트가 다른 PC나 배포 환경에서 실행될 때 다음 상황에서 참조가 깨지기 쉽다.
API Declare 문과 포인터 크기 차이로 오류가 발생한다. 다음 원칙을 적용한다.
LongPtr를 사용한다.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 컴파일 타임 바인딩을 사용한 경우 특정 버전의 type library에 고정된다. 두 가지 전략이 있다.
' 전략 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 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
파일이 인터넷에서 내려받아 “차단됨” 속성을 갖는 경우 로드가 제한된다.
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 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 대규모 배포 환경에서는 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
Late Binding 환경에서 상수 값이 필요한 경우 상수를 직접 정의한다.
Private Const olMailItem As Long = 0 Private Const adOpenForwardOnly As Long = 0 Private Const adLockReadOnly As Long = 1 레지스트리나 설치 경로를 하드코딩하지 않는다. 필요한 경우 Environ과 FileSystemObject를 사용하여 동적으로 해결한다.
Function GetSysFolderSysWOW64() As String GetSysFolderSysWOW64 = Environ$("SystemRoot") & "\SysWOW64" End Function | 라이브러리 | 전형적 파일/버전 | 대안/대체 전략 | 비고 |
|---|---|---|---|
| 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 | 대체 컨트롤 또는 배포 포함 | 배포 라이선스 요건 검토 |
Option Explicit 선언 후 컴파일하여 타입 누락을 잡는다.MSForms, ActiveX 컨트롤 의존이 높다. 컨트롤 재등록 또는 64비트 대체가 필요하다.
ADO/ODBC 공급자 버전 불일치일 가능성이 높다. Late Binding으로 전환하고 연결 문자열을 표준화한다.
OLE Automation은 기본 자동화 라이브러리이다. 대개 시스템 손상보다는 다른 참조의 연쇄 오류가 원인이다. 먼저 다른 MISSING 항목을 정리하고 컴파일한 뒤 상태를 재확인한다.
아니다. PC에 해당 버전이 설치되어 있어야 성공한다. 없으면 실패하며 Late Binding 또는 다른 버전으로의 폴백이 필요하다.
코드로 참조를 조작하는 자동 복구는 사용할 수 없다. 수동으로 참조를 정리하고, 설계 단계에서 Late Binding으로 전환하여 관리한다.
Late Binding으로 모두 대체했다면 가능하다. 다만 Excel Object Library 등 핵심 내장 참조는 유지해야 한다.
해당 PC에 관리자 권한이 없어 등록이 실패했거나, 32/64비트 혼용 때문이다. 비트수에 맞는 regsvr32 경로로 재등록한다.