컴알못/VBA

[VBA] Function과 Subroutine

난프로 2023. 8. 22. 10:13


VBA에서 Function과 Subroutine의 차이점을 살펴보겠습니다.
두 프로시저의 주요 특징은 아래 표와 같으며 가장 중요한 차이점은 반환 값 유/무입니다.

반환 값반환하지 않음값을 반환함
실행 결과직접 작업을 수행함값을 계산하고 반환함
호출 방법명시적으로 호출됨수식으로 셀에 입력되거나 호출됨
사용처프로시저 내에서 사용됨수식, 다른 함수의 인자로 사용됨
반환 값 활용불가능값 할당, 함수 인자 등에 활용됨
데이터 수정 여부직접 데이터 수정 가능데이터 수정 불가능
코드 내 위치프로시저 내에 작성됨프로시저 내/외에 작성될 수 있음
예외 처리오류 처리 가능오류 처리 가능
반환 타입 지정반환 타입 지정하지 않음반환 타입 지정 가능
반환 변수 사용반환 변수 사용 불가능반환 변수 사용 가능
  1. 활용 방식:
    • Array Function: 주로 워크시트 내에서 셀 수식을 이용하여 데이터를 조작하거나, 다른 함수의 인자로 사용될 때 활용됩니다.
    • Subroutine: 주로 VBA 프로시저 내에서 작업을 수행하거나, 사용자가 버튼을 클릭하거나 특정 이벤트가 발생할 때 실행됩니다.
  2. 수정 가능성:
    • Array Function: 반환 값을 다른 셀에 할당하거나 다른 함수의 인자로 전달함으로써 수정 가능합니다.
    • Subroutine: 인자로 전달된 범위의 데이터를 수정하여 호출한 위치에서 데이터가 변경됩니다.
  3. 예외 처리 :
    • Array Function: 일반적으로 값이 유효하지 않을 때 오류가 발생합니다.
    • Subroutine: 오류를 처리하기 위해 추가적인 코드를 작성하여 예외 상황을 다룰 수 있습니다.

1-1. VBA 코드 - FUNCTION

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Option Explicit
Option Base 1
 
Function FlipFunc(rng As Range)
 
Dim nr As Integer, nc As Integer, i As Integer, j As Integer
Dim A()
nr = rng.Rows.Count
nc = rng.Columns.Count
 
ReDim A(nr, nc)
 
For i = 1 To nr
    For j = 1 To nc
        A(i, j) = rng.Cells(nr + 1 - i, j)
    Next j
Next i
 
FlipFunc = A
 
End Function
cs

 

1-2. 코드 설명 - FUNCTION

  1. Option Explicit를 사용하여 변수를 미리 선언하지 않으면 오류를 발생시키도록 설정합니다.
  2. Option Base 1을 사용하여 배열의 인덱스를 1부터 시작하도록 설정합니다. VBA에서 배열의 인덱스는 기본적으로 0부터 시작합니다. 하지만 Option Base 1을 사용하면 배열의 인덱스를 1부터 시작하도록 설정할 수 있습니다. 이를 활용하면 배열의 인덱스를 자연스럽게 다룰 수 있습니다.
  3. FlipFunc라는 함수를 선언합니다.이때 FlipFunc는rng이라는 입력 범위를 매개변수로 받아들이며, 이 범위의 데이터를 뒤집어서 새로운 배열을 반환합니다.
  4. nrnc 변수는 입력 범위의 행과 열의 개수를 저장합니다.
  5. ReDim A(nr, nc)를 통해 배열 A의 크기를 nr 행과 nc 열로 조절합니다.
    • ReDim은 배열의 크기를 동적으로 조절하는 데에 사용되는 VBA 명령어입니다. 이를 사용하여 배열 선언 시 알 수 없었던 배열의 크기를 변경할 수 있습니다. 
    • ReDim을 사용하면 배열의 크기를 동적으로 조절하여 데이터를 효율적으로 처리할 수 있습니다. 이는 메모리 관리와 코드 최적화 측면에서 유용한 기능입니다.
  6. 중첩된 루프를 사용하여 입력 범위의 데이터를 뒤집어 배열 A에 저장합니다. 루프 변수 i는 행을, j는 열을 나타냅니다.
  7. 함수의 마지막 줄에서 FlipFunc = A를 통해 뒤집힌 데이터가 포함된 배열 A를 반환합니다.

2-1. VBA 코드 - SUBROUTINE

Subroutine은 함수와 유사하지만 값을 반환하지 않고 직접 작업을 수행하는 프로시저입니다. 아래는FlipSub라는 Subroutine을 작성하여 데이터를 뒤집는 예제 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Option Explicit
Option Base 1
 
Sub FlipSub()
    Dim nr As Integer, nc As Integer, i As Integer, j As Integer
    Dim A()
    nr = Selection.Rows.Count
    nc = Selection.Columns.Count
    ReDim A(nr, nc)
    For i = 1 To nr
        For j = 1 To nc
            A(i, j) = Selection.Cells(nr + 1 - i, j)
        Next j
    Next i
    Selection.Offset(nr + 2, 0= A
End Sub
cs

2-2. 코드 설명 - SUBROUTINE

위 FUNCTION을 사용한 코드와 유사하지만 아래의 몇가지 차이점이 있습니다.

  1. 본 SUBROUTINE에서는 매개변수를 받지 않고 해당 영역을 선택 후 프로시저를 실행합니다.
  2. 반환값을 돌려주는 대신 지정된 영역에 직접 결과를 표시합니다.
    • Array Function은 값을 반환합니다. 이 반환값은 셀에 직접 입력할 수 있으며, 다른 함수에 인자로 전달할 수 있습니다.
    • Array Function은 워크시트 내 셀에 함수로 입력하여 값을 얻을 수 있습니다. 예를 들어, =FlipFunc(A1:C3)과 같이 입력합니다.
    • Subroutine은 값을 반환하지 않습니다. 대신, 인자로 전달된 범위의 데이터를 직접 수정합니다.
    • Subroutine은 VBA 코드 내에서 Subroutine을 호출하여 작업을 실행합니다. 예를 들어, flipSub Range("A1:C3")과 같이 호출합니다.