RPA/VBA

[VBA] - 모듈안에 여러 프로시저(매크로), Sub, Function, Property

Ch's Lee 2026. 1. 8. 21:00

1. 모듈 (Module) = "코드를 적는 종이"

엑셀 VBE 창 왼쪽 프로젝트 탐색기에 보이는 폴더나 파일 아이콘들입니다. 코드를 어디에 적을지 결정하는 장소입니다.

  • 표준 모듈 (Module1, Module2...):
    • 위치: [삽입] > [모듈]을 누르면 생기는 흰색 창입니다.
    • 용도: 우리가 흔히 말하는 '매크로'를 기록하거나 작성하는 곳입니다. 90% 이상의 코드는 여기에 적습니다.
  • 클래스 모듈 / 시트 모듈:
    • 특정 시트(Sheet1)나 엑셀 자체(ThisWorkbook)에 딸려 있는 종이입니다. "이 시트가 열릴 때 실행해라" 같은 특수한 경우에 씁니다.

2. 프로시저 (Procedure) = "종이에 적힌 코드 덩어리"

모듈(종이) 안에 적혀 있는 Sub로 시작해서 End Sub로 끝나는 코드 한 묶음입니다.

  • Sub (서브 프로시저): "동작 담당"
    • 엑셀에서의 모습: 버튼을 만들고 우클릭해서 **[매크로 지정]**할 때 연결할 수 있는 녀석입니다.
    • 하는 일: "A1 셀 지워", "폰트 빨갛게 해" 같은 명령을 수행합니다.
    • 코드 모양:
    • VBA
       
      Sub 청소하기()      ' 시작
          Range("A1").Clear
      End Sub            ' 끝
      
  • Function (펑션 프로시저): "수식 담당"
    • 엑셀에서의 모습: 엑셀 셀에 =SUM() 처럼 직접 입력해서 쓰는 나만의 함수입니다.
    • 하는 일: 값을 던져주면 계산해서 결과를 돌려줍니다. (매크로 목록에는 안 뜹니다.)
    • 코드 모양:
    • VBA
       
      Function 부가세계산(금액)
          부가세계산 = 금액 * 0.1  ' 결과값을 함수 이름에 넣음
      End Function
      
  • Property (프로퍼티): "속성 담당" (고급)
    • 엑셀에서의 모습: 일반적인 모듈에서는 거의 안 씁니다. **사용자 정의 폼(UserForm)**이나 클래스를 만들 때, 글자 크기나 색깔 같은 '설정값'을 저장하거나 꺼낼 때 씁니다. 초중급 단계에서는 몰라도 전혀 지장 없습니다.

3. 매크로 (Macro) = "실행 가능한 목록"

사용자가 엑셀에서 Alt + F8 단축키를 눌렀을 때 팝업창 리스트에 뜨는 이름들입니다.

  • 중요한 차이:
    • 개발자가 작성한 모든 코드는 프로시저입니다.
    • 그중에서 **Public Sub (공용 서브)**로 만든 것만 매크로 목록에 뜹니다.
    • Function(함수)이나 Private Sub(비공개)는 매크로 목록(Alt+F8)에 뜨지 않습니다.

🔎 한눈에 요약 (엑셀 화면 기준)

  1. 모듈: 코드를 적기 위해 새로 추가한 흰색 창.
  2. Sub: 버튼에 연결해서 실행시키는 코드 덩어리.
  3. Function: 엑셀 셀에 =함수명()으로 수식처럼 쓰는 코드 덩어리.
  4. 매크로: Alt + F8 눌렀을 때 실행하려고 뜨는 목록.

 

 

추가적으로...

 

엑셀 VBA에서 이 3가지를 언제 쓰는지, 실무 상황에 빗대어 명확하게 구분해 드릴게요.


1. Sub (서브) : "엑셀을 조작할 때" (가장 많이 씀)

**"버튼을 눌러서 뭔가 실행하고 싶다"**면 무조건 Sub입니다. 엑셀의 셀, 시트, 파일을 건드려서 상태를 변경할 때 씁니다.

  • 언제 쓰나요?
    • "매월 1일, 버튼 하나 누르면 전 지점 매출 데이터를 취합해서 보고서 시트를 만들고 싶을 때"
    • "A열에 있는 데이터 중 값이 0인 행을 싹 다 지우고 싶을 때"
    • "작성된 시트를 PDF로 저장해서 이메일로 보내고 싶을 때"
  • 특징:
    • 반환값(Return)이 없습니다. 그냥 일을 저지르고 끝납니다.
    • Alt + F8 매크로 목록에 뜹니다.

2. Function (펑션) : "계산해서 값을 원할 때"

"엑셀 수식(=SUM, =VLOOKUP)으로는 도저히 해결 안 되는 복잡한 계산이 필요할 때" 씁니다. 시트를 건드리지 않고, 오직 계산 결과값만 뱉어냅니다.

  • 언제 쓰나요?
    • 나만의 함수 만들기: 엑셀 셀에 =MyTax(A1) 처럼 입력하면, 복잡한 세법 로직을 태워서 세액을 바로 보여주고 싶을 때.
    • 복잡한 텍스트 추출: "괄호 () 안에 있는 글자만 빼내고 싶은데, MID, FIND 함수 쓰려니 수식이 너무 복잡할 때" (VBA로 정규식 함수를 만들어서 해결)
    • 반복 계산: Sub 안에서 "이 날짜가 휴일인지 아닌지(True/False)"만 계속 판별해 주는 로직이 필요할 때.
  • 특징:
    • 반드시 결과값(Return)을 돌려줍니다.
    • 엑셀 셀에 =함수명() 형태로 직접 쓸 수 있습니다.

3. Property (프로퍼티) : "나만의 도구를 만들 때" (고급)

일반적인 엑셀 업무 자동화에서는 거의 안 씁니다. **사용자 정의 폼(UserForm)**을 만들거나, 클래스 모듈을 써서 구조적인 툴을 만들 때 씁니다.

  • 언제 쓰나요? (주로 클래스 모듈 사용 시)
    • 데이터 검증: "직원 정보 관리 도구"를 만드는데, 직원ID에는 무조건 숫자 5자리만 들어오게 강제하고 싶을 때. (값이 들어올 때 Property Let에서 검사해서 막아버림)
    • 읽기 전용 데이터: "로그인한 사용자 이름"은 프로그램 실행 중에 절대 바뀌면 안 될 때. (Property Get만 만들고 Let을 안 만들면 읽기 전용이 됨)
  • 특징:
    • 변수를 안전하게 관리(캡슐화)하기 위한 용도입니다.

💡 한눈에 보는 실무 요약

구분 목적 엑셀에서의 사용 느낌 비유
Sub 행동 (Action) "야, 이거 처리해!" (버튼 클릭) 작업반장 (시켜서 일을 처리함)
Function 계산 (Calc) "이거 값 얼마야?" (수식 입력) 계산기 (답만 알려줌)
Property 설정 (Setting) "이 변수 조건 확인해" (내부 로직) 금고지기 (값을 넣고 뺄 때 검사함)