728x90
반응형
엑셀 VBA(Visual Basic) 엑셀에 있는 셀을 Range(범위)로 입력받아 Function으로 작성하는 예제를 만들어 보겠습니다.
우선 문제를 하나 만든 후 해당 연습문제를 풀어가는 방식으로 코드를 작성하도록 합니다.
연습문제
A학교에는 학생들이 사과를 매일 먹는다. A학교의 공용창고에는 500개의 사과를 보관중이다.
A학교에는 1반,2반,3반으로 구성된 3개의 반이 존재한다.
각 반은 반별로 창고가 존재하며 여기에도 사과를 보관중이다. 1반은 10개, 2반은 15개, 3반은 60개의 사과를 보관중이다.
각 반별로 매일 사과의 소모량은 다르다. 1반은 7개, 2반은 11개, 3반은 8개이다.
이 때 A학교의 공용창고에 모든 사과가 소모되는 날은 몇일 후 인가?
위 문제를 마주하였다고 하자.
c나 java와 같은 언어를 이용해 콘솔로 값을 입력받는다면 굉장히 쉬운 문제이지만
엑셀값을 인자로 받아와서 VBA로 해결을하려면 변수를 받아오는 과정을 알아야한다.
이 변수를 받아오는 과정을 위 예제를 통해 풀어보고자 한다..
1. 엑셀에 문제 작성
![](https://blog.kakaocdn.net/dn/OWIeR/btsDCPGZ79Q/wPvXIH80XqBGfHgKAhSlK0/img.png)
2. 개발도구 -> Visual Basic
![](https://blog.kakaocdn.net/dn/b99wGt/btsDDajRCzf/erpICjK3CelBdrTzD0QfgK/img.png)
3. 왼쪽 프로젝트 VBA_Project 마우스우클릭 -> 삽입 -> 모듈
![](https://blog.kakaocdn.net/dn/cyFHif/btsDEkT5ggu/Tg20ciNOAm4OKuQ3f0vZY1/img.png)
4. 코드작성
Function 명은 'REMAINING_DAYS'로 남은일수를 계산한다는 의미로 명명했습니다.
엑셀 VBA소스코드가 옆으로 너무 길면 코드를 줄바꿈(개행) 해야하는데 언더바(_)를 꼭 넣어줘야 줄바꿈이 됩니다.
그리고 언더바(_)앞에는 꼭 띄어쓰기를 해주셔야 애러가 안납니다.
Function REMAINING_DAYS(P_PUBLIC_WAREHOUSE As Long, _
P_PRIVATE_REMAIN As Range, _
P_PRIVATE_EAT As Range) As Long
' Function의 return 값이 Long이기 때문에 선언부 마지막에 As Long을 넣는다
'파라미터 설명
'P_PUBLIC_WAREHOUSE 공용창고의 사과 갯수이며 Long으로 받고 한개의 셀값만 받는다
'P_PRIVATE_REMAIN 각 반의 창고에서 남은 사과양이며 Range(범위)로 셀값을 받는다
'P_PRIVATE_EAT 각 반이 하루에 먹는 사과의 양이며 Rnage(범위)로 셀값을 받는다.
'입력받은 파라미터를 변수로 옮겨준다
Dim v_public_warehouse As Long
Dim v_private_remain() As Variant
Dim v_private_eat() As Variant
v_public_warehouse = P_PUBLIC_WAREHOUSE
v_private_remain = P_PRIVATE_REMAIN.Value
v_private_eat = P_PRIVATE_EAT.Value
'몇일 걸리는지 변수선언
Dim v_total_days As Long
v_total_days = 0
'for문 변수 선언
Dim v_i As Integer
v_i = 0
'1반~3반 까지의 먹고남은 사과량을 다 더하는 변수
Dim v_private_remain_sum As Long
v_private_remain_sum = 0
'공용창고의 사과가 모두 소모되는데 얼만큼의 일자가 걸리는지 계산한다.
Do
v_private_remain_sum = 0
For v_i = 1 To P_PRIVATE_REMAIN.Rows.Count
'반 창고의 사과개수 = 반 창고의 사과개수 - 해당 반의 하루 소모량은
v_private_remain(v_i, 1) = v_private_remain(v_i, 1) - v_private_eat(v_i, 1)
v_private_remain_sum = v_private_remain_sum + v_private_remain(v_i, 1)
Next v_i
'1반,2반,3반 의 남은 사과개수가 공용창고 사과까지 모두 소모했는지를 확인하는 if문
'또는 무한반복을 막기위해 소모되는 일자가 9999일을 넘길경우
'위 두가지 조건의 경우에는 Function을 종료시킨다
If v_public_warehouse + v_private_remain_sum < 0 _
Or v_total_days >= 9999 Then
Exit Do
End If
'하루를 증가시킨다
v_total_days = v_total_days + 1
Loop
'총 소요된 일수 반환
REMAINING_DAYS = v_total_days
End Function
위와 같이 Function을 작성한다.
5. 실제 엑셀에서 활용
![](https://blog.kakaocdn.net/dn/bZu3DI/btsDCPNLGxs/3ZCZnkC1xjSTygp3771Q01/img.png)
![](https://blog.kakaocdn.net/dn/uVuyz/btsDGlEWs1J/B5BuRsFUU95oNn9naKj4AK/img.png)
이처럼 엑셀 Function을 작성하여 엑셀에 활용할 수 있다.
728x90
반응형