- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀에서 VBA 프로젝트가 “잠겨 있음” 또는 “Project is unviewable”로 표시될 때 합법적이고 안전한 절차로 문제를 진단하고 해제하거나 복구하는 방법을 현장 실무 수준으로 정리하는 것이다.
VBA 프로젝트가 ‘잠겨 있음’으로 보이는 대표 상황 정의
엑셀에서 개발 도구 → Visual Basic 또는 Alt+F11로 VBA 편집기를 열었을 때 다음과 같은 메시지가 나타나는 경우가 있다.
- “Project is unviewable” 메시지로 코드 창에 접근이 차단되는 경우이다.
- 프로젝트 탐색기에서 프로젝트 아이콘에 자물쇠가 보이며 ‘잠겨 있음’으로 표시되는 경우이다.
- 암호 입력 창이 반복 표시되거나, 올바른 암호를 넣어도 다시 잠김 상태로 돌아가는 경우이다.
이 현상은 크게 네 가지 축에서 원인이 갈린다. 보호 설정, 보안 및 정책, 파일 상태, 환경/캐시 충돌이다.
법적·윤리적 전제
해결 전략 개요: 입력–레버–출력 관점
문제를 빠르게 수습하기 위해 아래와 같이 시스템적으로 접근한다.
- 입력 식별 — 파일 유형, 열람 경로, 보호 상태, 조직 정책, 충돌 여부를 수집한다.
- 레버 선택 — 보호 해제 절차, 보안 신뢰 설정, 파일 상태 정리, 캐시 제거, 인스턴스 정리, 업데이트 복구 같은 가장 영향력이 큰 조치를 우선 적용한다.
- 출력 검증 — VBE에서 프로젝트가 보이는지, 모듈 열람·편집이 가능한지, 재발 방지 설정이 유지되는지 확인한다.
원인별 체크리스트와 즉시 조치
| 증상 | 가능 원인 | 확인 포인트 | 즉시 조치 |
|---|---|---|---|
| Project is unviewable | VBA 보호 설정 또는 애드인 배포 정책이다 | 파일 확장자 xlam/xla인지, 배포용 애드인인지 확인한다 | 소스 원본에서 수정한다 또는 담당자에 암호/원본 요청한다 |
| 자물쇠 아이콘과 암호 입력 창 | VBE 보호 암호 설정이다 | VBE → 도구 → VBAProject 속성 → 보호 탭 확인한다 | 정상 암호로 해제한 뒤 보호 해제 저장한다 |
| 암호 맞아도 다시 잠김 | 다중 인스턴스·파일 잠금·손상 캐시다 | 작업 관리자 EXCEL.EXE 중복, ~임시 잠금파일 존재 확인한다 | 모든 인스턴스 종료, 임시파일·EXD 캐시 삭제 후 재시작한다 |
| 보기는 되나 편집 불가 | 읽기 전용, 권한·정책 제한이다 | 원본 위치, OneDrive/SharePoint 동기 상태, GPO 존재 확인한다 | 로컬 신뢰 위치로 복사, 정책 담당자에 권한 요청한다 |
| VBE 자체 접근 불가 | 조직 보안 정책 또는 레지스트리 제한이다 | IT의 매크로 정책, “VBA 사용 안 함” 통지 확인한다 | 승인 절차에 따라 일시 해제 요청한다 |
| 인터넷에서 받은 파일 | 보호된 보기 및 차단 파일이다 | 속성의 “차단 해제” 또는 보호된 보기 배너 확인한다 | 차단 해제 후 신뢰 위치로 이동한다 |
Step 1. 파일·배포 형태 판별
먼저 파일의 역할과 배포 형태를 구분한다.
- 업무용 애드인(xlam/xla)은 일반적으로 Project is unviewable 상태로 배포한다. 소스 편집은 배포 원본에서만 가능하다.
- 일반 통합문서(xlsm/xlsb)에서 잠김이면 소유자가 보호 암호를 설정했을 가능성이 높다.
- 공유 드라이브/버전관리 중이면 동시에 열린 인스턴스가 잠금을 유지할 수 있다.
Step 2. 보호된 보기·차단 해제
- 파일을 탐색기에서 우클릭하고 속성을 연다.
- 이 파일은 다른 컴퓨터에서 가져온 것으로… 항목이 보이면 차단 해제를 체크하고 적용한다.
- 엑셀을 열어 상단 노란 배너가 보이면 편집 사용과 콘텐츠 사용을 순서대로 허용한다.
- 로컬의 신뢰할 수 있는 위치 폴더로 파일을 이동한 뒤 다시 연다.
Step 3. 암호로 보호된 프로젝트의 정상 해제
정당한 암호를 보유한 경우의 절차이다.
- Alt+F11로 VBE를 연다.
- 왼쪽 프로젝트 탐색기에서 대상 프로젝트를 선택한다.
- 도구 → VBAProject 속성 → 보호 탭을 연다.
- 보기용 잠금 체크가 되어 있으면 암호를 입력해 해제한 후 체크를 해제한다.
- 파일을 저장하고 닫은 뒤 다시 열어 잠김 상태가 풀렸는지 확인한다.
Step 4. 다중 인스턴스·임시 잠금·캐시 충돌 정리
암호가 맞는데도 잠김이 반복되거나, 갑자기 “unviewable”로 바뀌는 경우 아래 절차가 효과적이다.
- 모든 엑셀 창을 저장 후 닫는다.
- 작업 관리자를 열어 EXCEL.EXE 프로세스가 남아 있으면 모두 종료한다.
- 파일이 있는 폴더에서 ~$파일명으로 시작하는 임시 잠금 파일이 있으면 제거한다.
- VBA 컨트롤 캐시를 초기화한다. 다음 폴더의
.exd파일을 삭제한다.
%appdata%\Microsoft\Forms %temp% - 윈도우를 재시작한 뒤 파일을 다시 연다.
Step 5. 보안 정책·신뢰 설정 점검
조직 환경에서는 그룹 정책·엔드포인트 보안 도구가 VBE 접근을 제한할 수 있다. 사용자가 임의로 해제할 수 없는 경우가 많다.
- 매크로 차단 정책이 적용돼 있으면 VBE 접근 자체가 제한될 수 있다. IT 관리자에게 개발 목적 승인 절차를 따른다.
- 신뢰할 수 있는 위치에 코드 파일을 두면 불필요한 차단을 줄일 수 있다. 조직이 허용하는 범위 내에서 사용한다.
- 디지털 서명으로 서명된 매크로는 신뢰 결정을 간소화한다. 사내 코드 서명 인증서 사용을 고려한다.
Step 6. 읽기 전용·동기화 이슈 제거
OneDrive·SharePoint·NAS 환경에서 동시 편집 또는 동기화 지연으로 파일이 읽기 전용으로 열리면 VBE 변경이 반영되지 않거나 잠김이 지속될 수 있다.
- 파일을 다른 이름으로 로컬 드라이브에 저장한다.
- 동기화 상태가 완료인 것을 확인한 뒤 닫고 다시 연다.
- 가능하면 오프라인에서 편집 후 단일 버전으로 업로드한다.
Step 7. 손상 의심 시 모듈 구조 재구성
파일 손상으로 프로젝트 메타데이터가 비정상일 때는 구조를 재구성한다. 암호를 알고 있고 열람 가능한 상황에서만 유효하다.
- VBE에서 각 모듈·폼을 파일 → 내보내기로 추출한다.
- 새 통합문서(xlsm)를 만들고 VBE에서 파일 → 가져오기로 모듈을 삽입한다.
- 참조 설정을 도구 → 참조에서 원본과 동일하게 맞춘다.
- 양식 폼은 종속 파일도 함께 이동한다.
' 예시: 초기화 루틴 최소 검증 코드 Option Explicit Public Sub SelfTest() Debug.Print "VBA 구조 정상 동작 확인" End Sub Step 8. XLSTART·애드인 간섭 제거
시작 시 자동 로드되는 애드인이 VBE 상태를 간섭하는 사례가 있다.
%appdata%\Microsoft\Excel\XLSTART와%programfiles%\Microsoft Office\root\OfficeXX\XLSTART폴더를 확인한다.- 문제 재현 동안 해당 폴더의 파일을 임시로 다른 위치로 이동하여 격리한다.
- 엑셀을 /safe 모드로 기동해 비교한다.
"C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" /safe Step 9. 버전 차이·32/64비트 호환성 점검
구버전에서 만든 애드인이나 외부 COM 구성 요소를 참조한 프로젝트는 다른 버전에서 ‘unviewable’ 또는 예외가 발생할 수 있다.
- 같은 메이저 버전의 엑셀에서 열어 비교한다.
- 외부 참조는 GUID 기준으로 재설정하고, 32/64비트 전용 라이브러리는 아키텍처를 일치시킨다.
재발 방지 가이드
- 배포 전략을 분리한다. 개발 소스는 xlsm로 내부 관리하고, 사용자 배포는 xlam로 서명 후 “보기 잠금” 상태로만 배포한다.
- 소스 관리를 적용한다. Git 등의 버전 관리로 모듈을 파일 단위로 백업한다.
- 백업·복구를 표준화한다. 주기적 내보내기 스크립트를 사용한다.
' 모듈 일괄 내보내기 샘플(Windows, 신뢰된 환경에서만 사용) ' FileSystemObject 참조 필요(Microsoft Scripting Runtime) Option Explicit Public Sub ExportAllModules() Dim vbComp As Object Dim fso As Object Dim tgt As String tgt = Environ$("USERPROFILE") & "\Desktop\VBA_Backup\" Set fso = CreateObject("Scripting.FileSystemObject") If Not fso.folderexists(tgt) Then fso.CreateFolder tgt For Each vbComp In ThisWorkbook.VBProject.VBComponents vbComp.Export tgt & vbComp.Name & ModuleExt(vbComp.Type) Next MsgBox "Export completed to: " & tgt, vbOKOnly End Sub
Private Function ModuleExt(t As Long) As String
Select Case t
Case 1: ModuleExt = ".bas" ' 표준 모듈
Case 2: ModuleExt = ".cls" ' 클래스 모듈
Case 3: ModuleExt = ".frm" ' 사용자 폼
Case Else: ModuleExt = ".txt"
End Select
End Function
현장 트러블슈팅 시나리오별 체크 흐름
시나리오 A. 배포 애드인에서 코드를 열어야 하는 요청
- 확장자가 xlam인지 확인한다.
- 배포 정책 문서를 확인하고, 개발 저장소의 원본 프로젝트를 확보한다.
- 사용자 환경에서는 소스 열람을 시도하지 않고 기능 테스트만 수행한다.
시나리오 B. 개인 프로젝트가 갑자기 unviewable
- 최근 비정상 종료가 있었는지 확인한다.
- 모든 EXCEL.EXE 종료, 임시파일과 EXD 캐시 삭제 후 재부팅한다.
- 필요 시 새 통합문서로 모듈을 내보내기·가져오기 한다.
시나리오 C. 암호를 잊어버린 자체 프로젝트
- 조직 절차에 따라 소유 증빙과 함께 관리자에게 재설정 요청한다.
- 이전 백업에서 모듈 파일을 복원한다.
- 우회 도구 사용은 금지한다.
문제 확인을 위한 점검표
| 점검 항목 | 예/아니오 | 조치 |
|---|---|---|
| 인터넷에서 받은 파일이며 차단 상태인가 | 속성에서 차단 해제 후 신뢰 위치로 이동한다 | |
| 읽기 전용 또는 공유로 열렸는가 | 로컬 사본으로 저장 후 단독으로 연다 | |
| EXCEL.EXE 다중 인스턴스가 남아 있는가 | 모두 종료하고 재시작한다 | |
| 임시 잠금파일(~$)이 남아 있는가 | 파일 닫은 뒤 잠금파일 삭제한다 | |
| EXD 캐시가 손상되었는가 | Forms 폴더의 .exd 삭제 후 재부팅한다 | |
| 조직 정책으로 VBE 접근이 제한되는가 | IT 승인 절차로 예외를 신청한다 | |
| VBA 암호를 합법적으로 보유하는가 | 암호로 해제하고 보호 설정을 저장한다 | |
| 배포 애드인 소스에 접근할 권한이 있는가 | 원본 저장소에서 작업한다 |
FAQ
“Project is unviewable”와 “암호로 잠김”은 무엇이 다른가
“암호로 잠김”은 암호를 아는 사용자가 해제할 수 있는 보호 상태이다. “Project is unviewable”은 배포·정책·상태 문제로 구조 자체가 열람 대상이 아님을 뜻하며, 보통 배포 원본이나 권한 없이는 열람할 수 없다.
암호를 잊었는데 내 프로젝트이다. 복구가 가능한가
우회는 권장하지 않는다. 백업에서 모듈 파일을 복원하거나, 소유 증빙을 갖추고 관리 절차로 재설정을 요청해야 한다. 향후를 위해 주기적 모듈 내보내기와 암호 금고 관리 도입을 권한다.
정상 암호를 넣어도 잠김이 계속된다
다중 인스턴스와 캐시 충돌 가능성이 높다. 모든 EXCEL.EXE를 종료하고 임시 잠금파일과 EXD 캐시를 삭제한 뒤 재부팅한다. XLSTART 애드인을 격리하고 /safe 모드 기동으로 비교한다.
회사 PC에서만 잠김이고 개인 PC에서는 정상이다
조직 보안 정책 또는 신뢰 위치 제한일 가능성이 높다. 사유와 목적을 명확히 하여 IT에 예외 승인을 요청한다. 개인 장비로의 소스 이동은 정책을 우선 확인해야 한다.
배포 애드인(xlam)에서 일부 사용자만 잠김 현상을 보고한다
사용자 환경의 보호된 보기, 차단 상태, 동기화 충돌, 애드인 충돌을 우선 점검한다. 동일 빌드·동일 서명 상태인지 확인하고, 신뢰 위치 배포와 자동 업데이트 절차를 정비한다.