- 최초 작성일: 2002-05-28
- 최종 수정일: 2026-09-30
- 조회수: 15 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 모듈 시트 추가·제거하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
두 질문이 비슷한 내용입니다. 즉 모듈 시트를 삽입하고 삭제하는 것을 수작업으로 하지 않고 코드 상에서 제어하고 싶다는 것입니다.
모듈 시트 추가·제거하기
핵심 요약: 모듈을 코드로 추가·제거하기
VBProject의 VBComponents 컬렉션을 이용하면 모듈을 파일로 내보내고 가져오며, 삭제와 추가도 코드로 처리할 수 있습니다.
- 1단계: VBA 프로젝트 개체 모델에 대한 액세스를 허용합니다.
- 2단계: Export와 Import 메서드로 모듈을 .bas 파일로 주고받습니다.
- 3단계: Remove, Add, AddFromFile로 모듈을 삭제하고 새로 만들어 코드를 삽입합니다.
Step 1: 어떤 질문이었을까요?
매크로를 만들어 직원들에게 배포했는데 추가할 내용이 생겼다. 직원들이 각자 자기 컴퓨터에 복사해서 자료를 많이 입력해 두어 파일을 일괄적으로 덮어쓸 수도 없고, 매크로에 대한 기본 개념이 없어 직접 수정하도록 안내하기도 어렵다. 매크로를 기록하는 모듈 시트를 매크로로 추가하거나 삭제할 수 있느냐는 질문이었습니다.
같은 취지로, 프로그램에서 모듈 1, 모듈 2, 모듈 3 중 모듈 1만 삭제하고 싶다는 질문도 있었습니다.
Step 2: 모듈 내보내기와 가져오기
두 질문은 결국 모듈을 삽입하고 삭제하는 작업을 수작업이 아니라 코드로 제어하고 싶다는 것입니다. 예제 파일에서 버튼을 누르면 TestModule이라는 모듈이 ModuleXXX.bas 파일로 내보내지고(Exporting), 반대로 ModuleXXX.bas 파일을 가져오는(Importing) 버튼도 있습니다.
참고: 오류가 발생하면 '도구-매크로-보안'의 '신뢰할 수 있는 원본' 탭에서 'Visual Basic 프로젝트에 안전하게 액세스할 수 있음' 항목에 체크되어 있는지 확인하세요. 최신 엑셀에서는 '보안 센터-매크로 설정'의 'VBA 프로젝트 개체 모델에 안전하게 액세스할 수 있음' 옵션이 같은 역할을 합니다.
코드를 보도록 하지요. 먼저 모듈시트를 내보내는 코드…
Sub ExportModuleSheet()
Dim Msg As String
Application.VBE.ActiveVBProject.VBComponents.Item("TestModule").Export ThisWorkbook.Path & "\ModuleXXX.bas"
' Application 오브젝트의 VBE 프로퍼티의 ActiveVBProject 프로퍼티의 VBComponents
' 프로퍼티 중에서 Item 프로퍼티의 Export 메서드를 이용합니다. 족보가 좀 복잡하지요? ^^
Msg = Msg & "현재 파일과 같은 폴더에 " & vbCr
Msg = Msg & """ModuleXXX.bas"" 라는 이름의 파일이 생성되었습니다"
MsgBox Msg, , "www.iExceller.com"
End Sub
Application 개체의 VBE 속성, ActiveVBProject 속성, VBComponents 속성, Item 속성을 거쳐 Export 메서드를 호출합니다. 족보가 좀 복잡합니다.
이번에는 내보냈던 것을 다시 불어오는 코드입니다.
Sub ImportModuleSheet()
Dim Msg As String
On Error Resume Next
' 만약 에러가 발생하더라도 궁시렁 거리지 말고 무조건 다음 구문을 실행하도록 설정합니다.
' 이렇게 해 주는 이유는… 아래에 가면 나옵니다.
With ActiveWorkbook.VBProject
.VBComponents.Remove .VBComponents("TestModule")
' 모듈명이 TestModule인 것이 있으면 Remove, 즉 제거합니다. TestModule이라는
' 모듈이 만약 있으면야 상관없지만 없다면 에러가 발생하겠지요? 이 경우에 대비하여
' 위에서 On Error Resume Next 문을 사용하여 궁시렁 거리지 않토록 한 것입니다.
End With
On Error GoTo 0
' 이제는 특별히 에러가 날 것이 없으므로 에러시 제어를 원 상태로 되돌립니다.
Application.VBE.ActiveVBProject.VBComponents.Import ThisWorkbook.Path & "\ModuleXXX.bas"
' Application 오브젝트의 VBE 프로퍼티의 ActiveVBProject 프로퍼티의 VBComponents
' 프로퍼티 중에서 Item 프로퍼티의 Import 메서드를 이용하여 읽어 들이기를 합니다.
Msg = Msg & "현재 파일과 같은 폴더에 있는" & vbCr
Msg = Msg & """ModuleXXX.bas"" 라는 이름의 파일을 Importing 하였습니다"
MsgBox Msg, , "www.iExceller.com"
End Sub
모듈명이 TestModule인 것이 있으면 Remove로 제거한 뒤 가져옵니다. TestModule이 없다면 오류가 발생하므로 이에 대비해 On Error Resume Next 문을 사용하여 무조건 다음 구문을 실행하게 했습니다. 이후에는 오류가 날 일이 없으므로 On Error GoTo 0으로 원래 상태로 되돌립니다.
Step 3: 두 과정을 합쳐 응용하기
이번에는 위의 두 과정을 합쳐서 약간 응용해 보도록 하지요.
위의 두 프로시저를 이해하신다면 아래 코드는 모두 이해가 되실 것입니다.
Sub DelModuleSheet()
Dim vbcModule As Object
Dim Msg As String
On Error Resume Next
ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents("TestModule")
On Error GoTo 0
' 이미 TestModule이 있으면 먼저 삭제합니다. 없으면 오류가 나므로 On Error Resume Next를 사용하였습니다.
Set vbcModule = ThisWorkbook.VBProject.VBComponents.Add(1)
' 표준 모듈(vbext_ct_StdModule = 1)을 새로 추가합니다.
vbcModule.Name = "TestModule"
vbcModule.CodeModule.AddFromFile ThisWorkbook.Path & "\TestModule.txt"
' 텍스트 파일의 내용을 모듈에 삽입합니다.
Msg = Msg & vbcModule.Name & " 모듈 시트가 성공적으로 생성 되었습니다" & vbCr
Msg = Msg & "이제 TestModule.txt 파일의 내용을 실행합니다"
MsgBox Msg, , "www.iExceller.com"
Application.Run "MyTest"
End Sub
텍스트 파일(TestModule.txt)에 들어 있는 코드를 새 모듈에 넣고, 그 안의 프로시저를 Run 메서드로 실행합니다. 이 방법을 응용하면 배포한 파일에 새 기능을 담은 모듈을 코드로 삽입할 수 있습니다.
다음 시간에...
정리 — 모듈 제어 핵심 코드
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 내보내기 | VBComponents.Item("TestModule").Export 경로 | 모듈을 .bas로 저장 |
| 가져오기 | VBComponents.Import 경로 | .bas 파일을 모듈로 추가 |
| 삭제 | VBComponents.Remove VBComponents("TestModule") | 모듈 제거 |
| 새 모듈 | VBComponents.Add(1) | 표준 모듈 추가 |
| 코드 삽입 | CodeModule.AddFromFile 경로 | 텍스트 파일의 코드 삽입 |
자주 묻는 질문 (FAQ)
Q1. VBA 코드로 모듈을 삭제하거나 추가할 수 있나요?
네, VBProject.VBComponents 컬렉션의 Remove, Add, Import, Export 메서드를 사용하면 됩니다.
Q2. 실행하면 오류가 나는 이유는 무엇인가요?
VBA 프로젝트 개체 모델에 대한 안전한 액세스가 허용되어 있지 않을 때 오류가 발생합니다. 매크로 보안 설정에서 해당 항목을 확인하세요.
Q3. 없는 모듈을 Remove하면 어떻게 되나요?
오류가 발생하므로 On Error Resume Next로 감싸 실행한 다음 On Error GoTo 0으로 오류 처리를 원래대로 되돌립니다.
마치며
모듈을 코드로 제어할 수 있으면 여러 PC에 배포한 매크로를 한꺼번에 갱신하는 방법도 만들 수 있습니다.