DB (데이터베이스)/엑셀

[엑셀] VBA Range(범위)로 입력받아서 계산하는 Fcuntion만들기

뜽배 2024. 1. 19. 10:51
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. 엑셀에 문제 작성

 
 
 

2. 개발도구 -> Visual Basic

 

 

3. 왼쪽 프로젝트 VBA_Project 마우스우클릭 -> 삽입 -> 모듈

 
 

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. 실제 엑셀에서 활용

 

 
이처럼 엑셀 Function을 작성하여 엑셀에 활용할 수 있다.

728x90
반응형