Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Contents 호환성 문제의 정의와 증상 분류 즉시 조치 체크리스트(빠른 복구) 파일 형식별 특성과 선택 기준 버전 차이로 인한 기능 손실과 대체 전략 조직 환경 차이: 32/64비트, 추가기능, 보안 정책 CSV·텍스트 파일 호환성: 인코딩·구분 기호·서식 날짜·숫자 변형 방…
글 전체 보기이 글의 목적은 엑셀에서 매크로 실행 창(Alt+F8) 목록이 갱신되지 않거나 새 매크로가 보이지 않을 때, 원인별로 신속하게 진단하고 실무에서 바로 적용 가능한 해결 절차를 제공하는 것이다.
다음 순서대로 점검하면 대다수 사례를 즉시 해결할 수 있다.
Public Sub이며 매개변수 없음인지 확인한다.Option Private Module이 있으면 제거한다..xlsx가 아닌 .xlsm 또는 .xlam으로 저장한다.Sub만 표시되며 Function, Private Sub, 매개변수 있는 Sub는 기본적으로 보이지 않는다.Alt+F8 또는 개발 도구 → 매크로에서 매크로 목록이 이전 상태에 머무르거나 일부만 보이는 문제가 발생한다. 대표 증상은 다음과 같다.
| 범주 | 세부 원인 | 핵심 징후 | 즉시 조치 |
|---|---|---|---|
| 코드 범위 | 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 목록에 나오지 않는다.Option Private Module 줄을 삭제한다..xlsm으로 저장한다..xlsm(통합 문서) 또는 .xlam(추가 기능)으로 저장해야 한다..xlsx로 저장하면 코드가 제거되므로 목록 갱신 이전에 이미 손실될 수 있다..xlsm를 함께 관리한다.Alt+F8 창 하단의 매크로 포함 위치 드롭다운이 다른 통합 문서로 고정되어 있으면 현재 파일의 매크로가 보이지 않는다. 다음을 수행한다.
개인용 매크로가 보이지 않으면 다음을 확인한다.
조직 정책 또는 기본 보안 설정으로 매크로가 차단되면 목록이 비어 보일 수 있다. 다음을 수행한다.
컴파일 에러가 남아 있으면 목록 반영이 지연되거나 실행이 불가하다. 다음을 수행한다.
모듈 이름과 프로시저 이름이 같거나 예약어와 충돌하면 목록 표시나 실행이 실패한다. 예를 들어 모듈명이 Print이거나 프로시저명이 모듈명과 동일하면 문제가 발생한다. 안전한 네이밍 규칙을 적용한다.
' 안전한 네이밍 예시 ' 모듈: modTaskRunner ' 프로시저: Public Sub TaskRunner_Main()
Public Sub TaskRunner_Main()
' 구현
End Sub
다음 선언이 있으면 Alt+F8 목록에서 숨겨진다.
Option Private Module 일반 사용 용도라면 위 선언을 삭제한다. 라이브러리화된 내부 모듈에서만 유지한다.
매개변수 있는 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 추가 기능은 로드되어야 Alt+F8 목록에 매크로가 보인다.Option Private Module이 있으면 숨겨진다.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
| 체크 항목 | 검증 방법 | 기대 상태 | 조치 |
|---|---|---|---|
| 프로시저 시그니처 | VBA에서 선언 확인 | Public Sub Name() | 매개변수 제거 |
| 모듈 속성 | 모듈 상단 텍스트 확인 | 숨김 선언 없음 | Option Private Module 삭제 |
| 파일 확장자 | 제목 표시줄/파일 정보 확인 | .xlsm 또는 .xlam | 다시 저장 |
| 컴파일 상태 | 디버그 → 컴파일 | 오류 없음 | 오류 수정 |
| 보안 차단 | 보안 센터 설정 | 허용 또는 신뢰 위치 | 정책 조정 |
| Alt+F8 범위 | 드롭다운 확인 | 모든 통합 문서 | 알맞게 변경 |
| PERSONAL.XLSB | 숨기기 취소 또는 기록 | 로드됨 | 생성/표시 |
.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로 래핑한다..xlsx로 저장한다. 정정 : .xlsm으로 저장한다.Entry_ 접두사를 통일하여 검색과 검증을 단순화한다.해당 이름의 Public Sub가 표준 모듈에 없거나 숨김 선언이 있을 가능성이 높다. 모듈 위치와 선언, 매개변수 유무를 점검한다.
PERSONAL.XLSB가 로드되지 않았거나 보안 설정으로 차단되었을 수 있다. 새 매크로 기록으로 PERSONAL.XLSB를 생성하고 신뢰 위치에 XLSTART 경로를 추가한다.
추가 기능이 로드되지 않았거나 모듈이 비공개 처리되어 있다. 추가 기능 관리자에서 로드 상태를 확인하고 Option Private Module을 해제한다.
누락 참조가 있거나 구문 오류가 남아 있다. 도구 → 참조에서 누락 항목을 정리하고 오류 라인을 수정한다.
함수는 실행 창 대상이 아니다. 함수를 호출하는 Public Sub 래퍼를 작성한다.