컴알못/VBA
[VBA] Function과 Subroutine
난프로
2023. 8. 22. 10:13

VBA에서 Function과 Subroutine의 차이점을 살펴보겠습니다.
두 프로시저의 주요 특징은 아래 표와 같으며 가장 중요한 차이점은 반환 값 유/무입니다.
반환 값 | 반환하지 않음 | 값을 반환함 |
실행 결과 | 직접 작업을 수행함 | 값을 계산하고 반환함 |
호출 방법 | 명시적으로 호출됨 | 수식으로 셀에 입력되거나 호출됨 |
사용처 | 프로시저 내에서 사용됨 | 수식, 다른 함수의 인자로 사용됨 |
반환 값 활용 | 불가능 | 값 할당, 함수 인자 등에 활용됨 |
데이터 수정 여부 | 직접 데이터 수정 가능 | 데이터 수정 불가능 |
코드 내 위치 | 프로시저 내에 작성됨 | 프로시저 내/외에 작성될 수 있음 |
예외 처리 | 오류 처리 가능 | 오류 처리 가능 |
반환 타입 지정 | 반환 타입 지정하지 않음 | 반환 타입 지정 가능 |
반환 변수 사용 | 반환 변수 사용 불가능 | 반환 변수 사용 가능 |
- 활용 방식:
- Array Function: 주로 워크시트 내에서 셀 수식을 이용하여 데이터를 조작하거나, 다른 함수의 인자로 사용될 때 활용됩니다.
- Subroutine: 주로 VBA 프로시저 내에서 작업을 수행하거나, 사용자가 버튼을 클릭하거나 특정 이벤트가 발생할 때 실행됩니다.
- 수정 가능성:
- Array Function: 반환 값을 다른 셀에 할당하거나 다른 함수의 인자로 전달함으로써 수정 가능합니다.
- Subroutine: 인자로 전달된 범위의 데이터를 수정하여 호출한 위치에서 데이터가 변경됩니다.
- 예외 처리 :
- 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

Option Explicit
를 사용하여 변수를 미리 선언하지 않으면 오류를 발생시키도록 설정합니다.Option Base 1
을 사용하여 배열의 인덱스를 1부터 시작하도록 설정합니다. VBA에서 배열의 인덱스는 기본적으로 0부터 시작합니다. 하지만 Option Base 1을 사용하면 배열의 인덱스를 1부터 시작하도록 설정할 수 있습니다. 이를 활용하면 배열의 인덱스를 자연스럽게 다룰 수 있습니다.FlipFunc라는 함수를 선언합니다.
이때 FlipFunc는rng
이라는 입력 범위를 매개변수로 받아들이며, 이 범위의 데이터를 뒤집어서 새로운 배열을 반환합니다.nr
과nc
변수는 입력 범위의 행과 열의 개수를 저장합니다.ReDim A(nr, nc)
를 통해 배열A
의 크기를nr
행과nc
열로 조절합니다.- ReDim은 배열의 크기를 동적으로 조절하는 데에 사용되는 VBA 명령어입니다. 이를 사용하여 배열 선언 시 알 수 없었던 배열의 크기를 변경할 수 있습니다.
- ReDim을 사용하면 배열의 크기를 동적으로 조절하여 데이터를 효율적으로 처리할 수 있습니다. 이는 메모리 관리와 코드 최적화 측면에서 유용한 기능입니다.
- 중첩된 루프를 사용하여 입력 범위의 데이터를 뒤집어 배열
A
에 저장합니다. 루프 변수i
는 행을,j
는 열을 나타냅니다. - 함수의 마지막 줄에서
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을 사용한 코드와 유사하지만 아래의 몇가지 차이점이 있습니다.
- 본 SUBROUTINE에서는 매개변수를 받지 않고 해당 영역을 선택 후 프로시저를 실행합니다.
- 반환값을 돌려주는 대신 지정된 영역에 직접 결과를 표시합니다.
- Array Function은 값을 반환합니다. 이 반환값은 셀에 직접 입력할 수 있으며, 다른 함수에 인자로 전달할 수 있습니다.
- Array Function은 워크시트 내 셀에 함수로 입력하여 값을 얻을 수 있습니다. 예를 들어, =FlipFunc(A1:C3)과 같이 입력합니다.
- Subroutine은 값을 반환하지 않습니다. 대신, 인자로 전달된 범위의 데이터를 직접 수정합니다.
- Subroutine은 VBA 코드 내에서 Subroutine을 호출하여 작업을 실행합니다. 예를 들어,
flipSub Range("A1:C3")
과 같이 호출합니다.