- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이 글의 목적은 엑셀에서 매크로 실행 창(Alt+F8) 목록이 갱신되지 않거나 새 매크로가 보이지 않을 때, 원인별로 신속하게 진단하고 실무에서 바로 적용 가능한 해결 절차를 제공하는 것이다.
핵심 요약: 가장 빠른 복구 절차
다음 순서대로 점검하면 대다수 사례를 즉시 해결할 수 있다.
- 매크로 범위 확인 : 표준 모듈(Module) 안의
Public Sub이며 매개변수 없음인지 확인한다. - 숨김 설정 확인 : 모듈 상단에
Option Private Module이 있으면 제거한다. - 파일 형식 확인 :
.xlsx가 아닌.xlsm또는.xlam으로 저장한다. - Alt+F8 범위 : 매크로 창의 매크로 포함 위치(Macros in) 드롭다운을 현재 통합 문서나 모든 통합 문서로 바꿔본다.
- 디버그 컴파일 : VBA 편집기에서 디버그 → VBAProject 컴파일을 실행한다.
- PERSONAL.XLSB 확인 : 개인 매크로가 보이지 않으면 보기 → 숨기기 취소로 PERSONAL.XLSB를 표시하거나 새로 기록하여 생성한다.
- 모듈/프로시저 이름 충돌 해결 : 모듈 이름과 프로시저 이름 중복을 피한다.
- 보안 설정 : 파일 → 옵션 → 보안 센터에서 매크로가 차단되지 않는지 확인한다.
- 저장 후 재열기 : 저장하고 엑셀을 닫았다가 다시 열어 캐시를 초기화한다.
Sub만 표시되며 Function, Private Sub, 매개변수 있는 Sub는 기본적으로 보이지 않는다.문제 정의와 증상 분류
Alt+F8 또는 개발 도구 → 매크로에서 매크로 목록이 이전 상태에 머무르거나 일부만 보이는 문제가 발생한다. 대표 증상은 다음과 같다.
- 새로 만든 매크로가 목록에 나타나지 않는다.
- 일부 매크로만 보이고 나머지는 보이지 않는다.
- PERSONAL.XLSB에 저장한 매크로가 누락된다.
- 실행 버튼이 비활성화되거나 이름을 입력해도 실행되지 않는다.
원인 체계도
| 범주 | 세부 원인 | 핵심 징후 | 즉시 조치 |
|---|---|---|---|
| 코드 범위 | Private Sub, 매개변수 존재, Function만 작성 | Alt+F8에 매크로가 전혀 안 보임 | Public Sub 이름()으로 변경하고 매개변수 제거 |
| 모듈 속성 | Option Private Module 선언 | 해당 모듈의 모든 Sub가 목록에서 숨김 | 선언 삭제 후 저장 |
| 파일 형식 | .xlsx로 저장 | 코드가 저장되지 않음 | .xlsm으로 다시 저장 |
| 저장 위치 | 시트/ThisWorkbook 모듈에 Sub 작성 | Alt+F8 목록에 잘 안 뜸 | 표준 모듈에 이동 |
| 개인 매크로 | PERSONAL.XLSB 미존재 또는 숨김 | 다른 통합 문서에서 개인 매크로가 안 보임 | 새 매크로 기록으로 PERSONAL.XLSB 생성 및 표시 |
| 보안/차단 | 보안 센터 차단, 신뢰할 수 있는 위치 아님 | 매크로가 자동 비활성 | 신뢰할 수 있는 위치 지정 및 설정 조정 |
| 컴파일 오류 | 참조 깨짐, 구문 오류 미해결 | 컴파일 실패, 목록 반영 지연 | 디버그 → 컴파일 실행 및 오류 수정 |
| 이름 충돌 | 모듈명=프로시저명, 예약어 충돌 | 실행 안 됨 또는 표시 불가 | 모듈명/프로시저명 변경 |
| 범위 필터 | Alt+F8의 매크로 포함 위치가 다른 파일로 설정 | 현재 문서 매크로 미표시 | 드롭다운에서 모든 통합 문서 선택 |
정상적으로 표시되는 매크로 최소 요건
' 표준 모듈(Module1 등)에 위치해야 한다. ' 모듈 상단에 Option Private Module이 없어야 한다. ' 프로시저는 Public Sub이며 매개변수가 없어야 한다.
Public Sub SampleTask()
MsgBox "Hello"
End Sub
Sub SampleTask(ByVal x As Long)처럼 매개변수가 있으면 Alt+F8 목록에 나오지 않는다.표준 모듈로 옮기는 절차
- ALT+F11로 VBA 편집기를 연다.
- 프로젝트 탐색기에서 삽입 → 모듈을 클릭한다.
- 시트 모듈이나 ThisWorkbook에 있던 코드를 잘라내어 새로 만든 Module1에 붙여넣는다.
- 모듈 상단의
Option Private Module줄을 삭제한다. - 디버그 → VBAProject 컴파일을 실행한다.
- 통합 문서를
.xlsm으로 저장한다.
파일 형식과 저장 정책
- 매크로를 포함하려면
.xlsm(통합 문서) 또는.xlam(추가 기능)으로 저장해야 한다. .xlsx로 저장하면 코드가 제거되므로 목록 갱신 이전에 이미 손실될 수 있다.- 버전 관리가 필요한 경우 코드 내보내기(.bas)와
.xlsm를 함께 관리한다.
Alt+F8 목록 범위 설정
Alt+F8 창 하단의 매크로 포함 위치 드롭다운이 다른 통합 문서로 고정되어 있으면 현재 파일의 매크로가 보이지 않는다. 다음을 수행한다.
- Alt+F8을 열고 드롭다운을 모든 통합 문서로 설정한다.
- 특정 파일의 매크로만 보려면 해당 파일 이름을 선택한다.
- 추가 기능(.xlam)의 매크로는 해당 추가 기능이 로드되어야 보인다.
PERSONAL.XLSB 점검
개인용 매크로가 보이지 않으면 다음을 확인한다.
- 보기 → 숨기기 취소로 PERSONAL.XLSB를 표시한다.
- PERSONAL.XLSB가 없다면 간단한 매크로를 기록할 때 저장 위치를 개인용 매크로 통합 문서로 선택하여 자동 생성한다.
- 생성 후 Alt+F8 목록에서 모든 통합 문서를 선택해 표시 여부를 확인한다.
보안 센터와 신뢰할 수 있는 위치
조직 정책 또는 기본 보안 설정으로 매크로가 차단되면 목록이 비어 보일 수 있다. 다음을 수행한다.
- 파일 → 옵션 → 보안 센터 → 보안 센터 설정을 연다.
- 매크로 설정에서 적절한 허용 수준을 선택한다.
- 신뢰할 수 있는 위치에 프로젝트 폴더를 추가하여 차단을 방지한다.
컴파일 오류와 참조 깨짐 해결
컴파일 에러가 남아 있으면 목록 반영이 지연되거나 실행이 불가하다. 다음을 수행한다.
- VBA 편집기에서 디버그 → VBAProject 컴파일을 실행한다.
- 도구 → 참조에서 누락됨(Missing) 표시 참조를 해제하거나 대체 라이브러리를 설정한다.
- 오류가 발생한 모듈에서 구문 오류를 정정한다.
모듈/프로시저 이름 충돌
모듈 이름과 프로시저 이름이 같거나 예약어와 충돌하면 목록 표시나 실행이 실패한다. 예를 들어 모듈명이 Print이거나 프로시저명이 모듈명과 동일하면 문제가 발생한다. 안전한 네이밍 규칙을 적용한다.
' 안전한 네이밍 예시 ' 모듈: modTaskRunner ' 프로시저: Public Sub TaskRunner_Main()
Public Sub TaskRunner_Main()
' 구현
End Sub
숨김 모듈 선언 점검
다음 선언이 있으면 Alt+F8 목록에서 숨겨진다.
Option Private Module 일반 사용 용도라면 위 선언을 삭제한다. 라이브러리화된 내부 모듈에서만 유지한다.
매개변수 있는 Sub를 UI에 노출하는 방법
매개변수 있는 Sub를 Alt+F8에서 직접 노출할 수 없다. 다음과 같이 래퍼를 만든다.
Public Sub RunReport_UI() Call RunReportCore("2025-10-01", True) End Sub
Private Sub RunReportCore(ByVal StartDate As String, ByVal IncludeSummary As Boolean)
' 실제 구현
End Sub
추가 기능(.xlam)과 표시 동작
.xlam추가 기능은 로드되어야 Alt+F8 목록에 매크로가 보인다.- 추가 기능 내부 모듈에
Option Private Module이 있으면 숨겨진다. - 메뉴/리본에서만 호출하고 Alt+F8에 노출하지 않으려면
Private Sub또는Option Private Module을 사용한다.
자동화된 자체 점검 매크로
다음 코드는 프로젝트에서 Alt+F8 후보가 될 수 있는 프로시저를 점검하고 보고한다. VBIDE 참조가 필요하다.
' 준비: VBA 편집기 → 도구 → 참조 → "Microsoft Visual Basic for Applications Extensibility 5.3" 체크 ' 신뢰 액세스: 파일 → 옵션 → 보안 센터 → 보안 센터 설정 → "VBA 프로젝트 개체 모델에 대한 신뢰 액세스" 체크
Public Sub AuditMacroCandidates()
Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule
Dim i As Long, lineText As String
Debug.Print "=== Alt+F8 후보 검사 시작 ==="
Set VBProj = Application.VBE.ActiveVBProject
For Each VBComp In VBProj.VBComponents
Set CodeMod = VBComp.CodeModule
' 모듈 상단 숨김 선언 탐지
For i = 1 To Application.WorksheetFunction.Min(10, CodeMod.CountOfLines)
lineText = Trim$(CodeMod.Lines(i, 1))
If LCase$(lineText) = "option private module" Then
Debug.Print VBComp.Name & ": Option Private Module 발견"
End If
Next i
' 간단한 Public Sub 시그니처 탐지
For i = 1 To CodeMod.CountOfLines
lineText = LCase$(Trim$(CodeMod.Lines(i, 1)))
If Left$(lineText, 9) = "public sub" And InStr(lineText, "(") > 0 And InStr(lineText, ")") > 0 Then
If Replace$(Mid$(lineText, InStr(lineText, "(") + 1, InStr(lineText, ")") - InStr(lineText, "(") - 1), " ", "") = "" Then
Debug.Print VBComp.Name & ": 매개변수 없는 Public Sub 후보 라인 " & i
End If
End If
Next i
Next VBComp
Debug.Print "=== 검사 종료 ==="
End Sub
워크시트/통합문서 이벤트 코드 분리
다음 형태의 이벤트 프로시저는 Alt+F8 목록에 나타나지 않는다. 표준 모듈의 공개 Sub로 분리하여 호출 경로를 만든다.
' 시트 모듈의 이벤트 예시(Alt+F8 표시 대상이 아님) Private Sub Worksheet_Change(ByVal Target As Range) ' ... End Sub
' 권장: 표준 모듈에 공개 래퍼 제공
Public Sub WorksheetChangeTask()
' 실제 구현을 호출
End Sub
버전 및 플랫폼 이슈
- Windows와 Mac 모두 원칙은 동일하다. 다만 Mac의 보안 정책과 파일 경로 차이로 PERSONAL.XLSB 경로가 상이하다.
- 조직 배포 버전에서는 그룹 정책으로 매크로 실행이 제한될 수 있다. IT 정책 문서를 확인한다.
고급 문제 해결 체크리스트
| 체크 항목 | 검증 방법 | 기대 상태 | 조치 |
|---|---|---|---|
| 프로시저 시그니처 | VBA에서 선언 확인 | Public Sub Name() | 매개변수 제거 |
| 모듈 속성 | 모듈 상단 텍스트 확인 | 숨김 선언 없음 | Option Private Module 삭제 |
| 파일 확장자 | 제목 표시줄/파일 정보 확인 | .xlsm 또는 .xlam | 다시 저장 |
| 컴파일 상태 | 디버그 → 컴파일 | 오류 없음 | 오류 수정 |
| 보안 차단 | 보안 센터 설정 | 허용 또는 신뢰 위치 | 정책 조정 |
| Alt+F8 범위 | 드롭다운 확인 | 모든 통합 문서 | 알맞게 변경 |
| PERSONAL.XLSB | 숨기기 취소 또는 기록 | 로드됨 | 생성/표시 |
문제 재현과 회피 전략
- 매크로 기록기로 만든 절차가 시트 모듈에 저장되면 Alt+F8에 보이지 않을 수 있다. 기록 후 즉시 표준 모듈로 이동한다.
- 템플릿 배포 시
.xltm을 사용하고 신뢰할 수 있는 위치에 배포한다. - 다중 개발자가 협업할 때 모듈 네이밍 규칙을 문서화한다.
샘플 템플릿: 팀 표준 모듈 헤더
' ========================================= ' Module : modEntryPoints ' Purpose: Alt+F8 공개 엔트리 포인트 집합 ' Rules : Public Sub, no params, no Option Private Module ' =========================================
Public Sub Entry_RunAll()
Call Task_Cleanup
Call Task_BuildReport
Call Task_ExportCSV
End Sub
Public Sub Entry_CleanupOnly()
Call Task_Cleanup
End Sub
자주 발생하는 실수와 정정
- 실수 :
Function으로 작성하고 Alt+F8에서 실행하려 한다. 정정 :Sub로 래핑한다. - 실수 : 프로시저에 인수를 설계한다. 정정 : UI 엔트리를 위한 무인수 래퍼를 둔다.
- 실수 : 모듈 상단 숨김 선언을 그대로 둔다. 정정 : 제거한다.
- 실수 :
.xlsx로 저장한다. 정정 :.xlsm으로 저장한다.
운영 환경에서의 배포 팁
- 배포 전 컴파일과 신뢰 위치 구성을 자동화 스크립트에 포함한다.
- 엔트리 포인트는
Entry_접두사를 통일하여 검색과 검증을 단순화한다. - PERSONAL.XLSB 의존을 최소화하고 공용 추가 기능(.xlam)으로 표준화한다.
FAQ
매크로를 분명히 만들었는데 Alt+F8에서 이름을 직접 입력해도 실행되지 않는다.
해당 이름의 Public Sub가 표준 모듈에 없거나 숨김 선언이 있을 가능성이 높다. 모듈 위치와 선언, 매개변수 유무를 점검한다.
개인용 매크로가 특정 PC에서만 보이지 않는다.
PERSONAL.XLSB가 로드되지 않았거나 보안 설정으로 차단되었을 수 있다. 새 매크로 기록으로 PERSONAL.XLSB를 생성하고 신뢰 위치에 XLSTART 경로를 추가한다.
추가 기능(.xlam)에 있는 매크로가 목록에 안 뜬다.
추가 기능이 로드되지 않았거나 모듈이 비공개 처리되어 있다. 추가 기능 관리자에서 로드 상태를 확인하고 Option Private Module을 해제한다.
디버그 컴파일에서 오류가 계속 발생한다.
누락 참조가 있거나 구문 오류가 남아 있다. 도구 → 참조에서 누락 항목을 정리하고 오류 라인을 수정한다.
함수를 Alt+F8에서 실행하고 싶다.
함수는 실행 창 대상이 아니다. 함수를 호출하는 Public Sub 래퍼를 작성한다.
- 공유 링크 만들기
- X
- 이메일
- 기타 앱