<엑셀VBA 입문 4강> 수식 입력줄에서 함수 실행하기
엑셀은 기본적으로 함수를 제공하고 있다. 우리가 아는 sum, sumif, count, counta 등이 기본함수다. 그런데 추가적으로 사용자가 원하는 함수를 새로 만들어 사용할 수 있다. 함수를 만드는 방법은 크게 3가지가 있다.
함수 만드는 방법 3가지
(1) 단축키로 실행 (매크로)
(2) 버튼을 클릭해서 실행
(3) 수식 입력줄에서 실행
이번에는 3번 방식을 배워본다.
1. 엑셀을 실행하고, Alt+F11 키를 눌러 VBA 윈도우를 연다. 좌측 프로젝트 탐색기에서 [VBAProject] 항목에서 마우스 우클릭 – [삽입] 선택 – [모듈] 클릭한다.
2. 좌측 프로젝트 탐색기에서 [Module1 ]을 더블클릭하여 함수를 만들어본다. 처음에 Module1의 내용은 텅 비어있을 것이다. 아래와 같이 내용을 쓴다.
Function getValue()
getValue = “새 값”
End Function

포인트는 이전과 다르게 “Sub 함수명() ~ End Sub”가 아니라 Function 이라는 단어를 쓴다는 점이다. “Function 함수명() ~ End Function” 으로 함수를 만들면 엑셀 수식 입력줄에서 바로 사용가능한 사용자 정의 함수가 된다.
함수는 특정한 입력값(인풋)을 넣으면 일정한 규칙에 따라 출력값(아웃풋)을 되돌려주는 것을 의미한다. 여기서 getValue라는 함수의 경우 입력값은 없고, 출력값이 “새 값”이다. 다시 말해, “함수명 = 값” 은 해당 함수의 출력값을 결정하는 명령어다. 이해가 잘 안될 수 있는데 쓰다보면 알게되니 걱정말고 넘어가도 좋다.
3. VBA 윈도우를 끄고(엑셀을 종료해선 안됨), 엑셀 시트의 아무곳에나 =getValue() 라는 함수를 입력해본다. 직접 만든 함수를 이렇게 사용할 수 있다.
이 경우 아래와 같이 “새 값”이라는 결과가 나타나는 것을 볼 수 있다. 이제 다시 한 번 VBA 코드를 보면 조금 더 이해하기 쉬울 것이다.
4. 조금 욕심을 부려서 함수의 내용을 개선해보자. 아래와 같이 내용을 입력해보자.
Function getValue(cell)
Dim val
val = Range(cell, cell).Value
getValue = val
End Function

함수의 내용을 간단히 설명하자면, 첫번째 인자로 입력된 셀(ex: A1)의 내용을, 현재 선택한 셀 내용에 입력시키는 것이다. 쉽게 말해 특정셀의 내용을 그대로 가져오는게 이 함수의 내용이다.
잘 이해가 되지 않더라도 결과부터 살펴보도록 하자. 아래와 같이 getValue에 1개의 인자를 넣어 사용한다.

아래와 같이 특정셀의 내용을 그대로 가져오게 된다.

처음부터 VBA 코드를 잘 이해할 수 있다면 좋겠지만, 배우지 않았다면 잘 모르는게 정상이다. 위 VBA 코드를 이해하기 위해서는 변수, 그리고 함수에 대해서 배워야 한다.
5. 함수 이해하기
함수란 입력값을 넣으면 일정한 규칙에 따라 출력값을 되돌려주는 것이다. “Function 함수명(인자값1, 인자값2, …) ~ End Function” 식으로 쓴다. 예제로 등장한 getValue 함수의 경우, 입력값은 1개(cell) 이라고 볼 수 있다.
출력값은 val이다. “함수명 = 값”(ex: getValue = val) 의 형태를 보면 알 수 있다.
그렇다면 입력값과 결과값은 필수인가? 둘 다 필수는 아니다. 입력값이 없는 함수를 만들고 싶다면 인자 없이 “Function 함수명() ~ End Function” 식으로 코딩하면 된다. 결과값(리턴)이 없는 함수도 허용된다.
다만 단축키로 실행(ex: Ctrl + k) 하는 함수의 경우 리턴값이 없는 경우가 많고, 수식 입력줄에서 사용하는 경우 리턴값이 있는 경우가 일반적인 것 같다.
6. 변수 이해하기
중요한 명령어가 나오는데 Dim 이다. 변수를 선언할 때 쓰는 명령어다. 프로그래밍에서 변수란 아주 중요한 개념이므로, 잘 모르고 있다면 여기서 반드시 이해하고 넘어가자.
Dim 은 변수를 선언하는 명령어다. “Dim 변수명” 식으로 쓴다. 그렇다면 변수란 무엇인가? 프로그래밍을 처음 배울 때 변수를 “상자(Box)”라고 생각하라고들 하는데, 괜찮은 설명이라고 생각한다. 변수란 어떤 값(데이터)를 저장해두는 상자라고 생각하면 편하다. 예를 들어 aa라고 이름 붙여진 상자를 생각해보자.
dim aa
dim aa 라고 쓰면 aa라는 변수(상자)가 만들어지게 된다.
aa = 2
이제 aa라는 변수(상자)에는 2라는 값이 담겨졌다. MsgBox(aa) 를 실행하면 메시지박스에 2라는 값이 표시될 것이다. 참고로 프로그래밍의 등호(=)는 “같다”는 뜻이 아니다. 프로그래밍의 등호(=)는 “우측값을 좌측변수에 대입한다”는 뜻으로, 기호로 표현하면 “←”에 가깝다.
aa = 2 + 1
이제 aa라는 변수의 값은 3이 된다.
aa = aa + 3
이번에는 기존 aa값에 따라 결과값이 달라질 것이다. 기존값이 3이라면 답은 6이 된다.
정리하자면,
Dim aa
aa = 2
aa = 2+1
aa = aa + 3
MsgBox(aa)
라고 실행했을 때 메시지 박스에는 6이라는 숫자가 표시될 것이다.
7. getValue(cell) 함수의 이해
함수 각 라인마다 주석을 달아 설명해보자면 다음과 같다. 참고로 주석이란 VBA에서 홑따옴표(‘)로 표시하며, 홑따옴표(‘) 뒤쪽의 텍스트는 코드의 실행에 영향을 끼치지 못하도록 무시된다. 주석은 소스코드로 표현하지 못하는 참고사항을 적는 용도로 쓴다.
Function getValue(cell)
Dim val ‘val 이라는 이름의 변수를 선언한다.
val = Range(cell, cell).Value ‘Range(cell, cell).Value 는 특정 셀 한 칸의 값을 가져온다.
‘참고 : ‘Range(셀1, 셀2) 함수는 영역을 지정한다. 여기서는 셀1과 셀2가 같으므로, cell 한 칸이 된다.
getValue = val ‘val을 리턴한다(결과값 삼는다).
End Function
5강에서는 VBA 기초 명령어를 배우고 계속해서 함수를 만들어보도록 하자.
이어지는 글 <엑셀VBA 입문 5강> 특정 단어를 포함하는지 확인하는 함수 : https://blog.naver.com/bb_/221249954442
이어지는 글 <엑셀VBA 입문 7강> VBA 기초 명령어 : https://blog.naver.com/bb_/221253767009