엑셀 VBA 절차적 프로그래밍 – 함수와 루틴 선언 및 호출

엑셀 VBA는 기본적으로 절차적(Procedural) 프로그래밍을 기반으로 동작합니다. 절차적 프로그래밍에서는 프로그램을 순차적으로 실행하며, 특정 기능을 수행하는 **함수(Function) 및 루틴(Sub)**을 사용하여 코드의 재사용성과 가독성을 높일 수 있습니다.


1. 함수(Function)와 루틴(Sub)의 차이점

VBA에서 특정 작업을 수행하기 위해 두 가지 유형의 프로시저(절차)를 사용할 수 있습니다.

유형 선언 방식 반환 값 호출 방식

Sub(서브 루틴) Sub 이름() 없음 (단순 실행) Call 또는 직접 호출
Function(함수) Function 이름() As 데이터형 있음 값 반환 후 사용

2. Sub 프로시저(서브 루틴)

**서브 루틴(Sub)**은 특정 작업을 수행하지만 값을 반환하지 않습니다. 버튼 클릭, 이벤트 처리 등에서 주로 사용됩니다.

(1) Sub 프로시저 선언

Sub HelloWorld()
    MsgBox "안녕하세요, VBA입니다!"
End Sub
  • MsgBox는 메시지 박스를 띄우는 기본 제공 함수입니다.
  • HelloWorld는 호출되면 메시지 창을 띄우지만, 값은 반환하지 않습니다.

(2) Sub 프로시저 호출 방법

1) 직접 호출

HelloWorld

2) Call 키워드 사용

Call HelloWorld
  • Call 키워드는 선택 사항이며, 사용해도 되고 안 해도 됩니다.

3) 매개변수가 있는 Sub 호출

Sub GreetUser(name As String)
    MsgBox "안녕하세요, " & name & "님!"
End Sub

호출 예시:

GreetUser "홍길동"

3. Function 프로시저(함수)

Function 프로시저는 값을 반환하는 기능을 하며, Function 키워드를 사용하여 선언합니다.

(1) Function 프로시저 선언

Function AddNumbers(a As Integer, b As Integer) As Integer
    AddNumbers = a + b
End Function
  • 두 개의 정수 a와 b를 더한 후 그 값을 반환합니다.
  • 함수의 반환 값은 AddNumbers = 값과 같은 형태로 지정합니다.

(2) Function 호출 방법

1) 셀에서 직접 호출

  • VBA에서 작성한 함수는 Excel 셀에서 일반 함수처럼 사용 가능함.
=AddNumbers(10, 20)

2) VBA 코드에서 호출

Sub TestFunction()
    Dim result As Integer
    result = AddNumbers(5, 7)
    MsgBox "결과 값: " & result
End Sub
  • result = AddNumbers(5, 7) → 함수 호출 후 결과를 변수에 저장.
  • MsgBox를 통해 결과 값 표시.

4. ByRef와 ByVal – 매개변수 전달 방식

VBA에서는 매개변수를 ByRef(참조 전달) 또는 ByVal(값 전달) 방식으로 전달할 수 있습니다.

전달 방식 설명

ByVal(값 전달) 함수 내에서 값을 변경해도 원본 변수는 유지됨 (기본값)
ByRef(참조 전달) 함수 내에서 값을 변경하면 원본 변수도 변경됨

(1) ByVal 예제 (기본값)

Sub ChangeValue(ByVal num As Integer)
    num = num * 2
End Sub

Sub TestByVal()
    Dim x As Integer
    x = 10
    Call ChangeValue(x)
    MsgBox "x 값: " & x ' 여전히 10 (변경되지 않음)
End Sub

(2) ByRef 예제 (원본 변경)

Sub ChangeValueByRef(ByRef num As Integer)
    num = num * 2
End Sub

Sub TestByRef()
    Dim x As Integer
    x = 10
    Call ChangeValueByRef(x)
    MsgBox "x 값: " & x ' 값이 20으로 변경됨
End Sub
  • ByRef를 사용하면 x의 값이 함수 실행 후 변경됨.

5. VBA에서 Function과 Sub의 활용 예제

(1) 두 수를 입력받아 합을 구하는 함수와 호출하는 Sub

Function SumNumbers(a As Integer, b As Integer) As Integer
    SumNumbers = a + b
End Function

Sub CalculateSum()
    Dim num1 As Integer, num2 As Integer
    Dim result As Integer

    num1 = 10
    num2 = 20

    result = SumNumbers(num1, num2)
    
    MsgBox "두 수의 합: " & result
End Sub

(2) 특정 범위의 셀 값을 합산하는 함수

Function SumRange(rng As Range) As Double
    Dim cell As Range
    Dim total As Double
    total = 0

    For Each cell In rng
        total = total + cell.Value
    Next cell

    SumRange = total
End Function

엑셀 셀에서 호출 가능:

=SumRange(A1:A10)

6. 결론

  • Sub 프로시저는 특정 작업을 실행하지만 값을 반환하지 않음.
  • Function 프로시저는 값을 반환하며, 엑셀 셀에서도 직접 호출 가능.
  • 매개변수 전달 방식은 기본적으로 ByVal이며, ByRef를 사용하면 원본 변수 값이 변경될 수 있음.
  • VBA의 절차적 프로그래밍을 활용하면 반복 작업을 효율적으로 자동화할 수 있음.

+ Recent posts