본문 바로가기
VBA/엑사남_기초방

[기초방] VBA 100제 #71 [ 전체누적 + 월별누적 ]

by 일등미노왕국 2023. 10. 8.

자 이번 문제는 전체누계와 월별 누계를 따로 계산해야 하는 문제이다. 

 

전체누계야 그냥 처음부터 계속 더하면서 나가면 될것이고

 

월별누계가 약간 머리를 써야 한다.

원래는 엑셀 수식처럼 해당일자와 전일 일자와의 월을 비교해서 구하는게 정석이지만, 문제를 만들때 2023-01-01부터 9월까지 쭉 만들어 놓은거라.. DAY 함수를 사용하여 1일 인지를 파악하여 월별 누계를 구하였다.

 

If Day(rngA(1, 0)) = 1 Then                          
   Val2 = Val2 * 0 + rngA
Else: Val2 = IIf(Val2 = 0, rngA, Val2 + rngA): End If

 

핵심 구문은 이렇다.

해당일자의 일자가 1일인지를 확인해서 1일이며 새로운 달이 시작한 의미이기 때문에 누계값을 초기화 해준 후 해당일자의 값을 담아주었고, 그렇지 않으면 전체 누계를 구하는것처럼 계속 하나씩 누적으로 쌓아나갔다.

 

rngA(1, 4).Resize(1, 2) = Array(Val1, Val2)

 

이 구문은 전체누계와 월별 누계를 구한 후 기준값에서 4 -1 열 이동한 위치에서 1행2열의 크기에 [ 전체누계 , 월누계 ] 를 셀에 뿌리겠다는 구문이다. 참고로 Array 함수는 1차원 배열로 값을 넘겨준다.

 

전체 코드는 아래와 같다.

 

더보기
Option Explicit

 Sub 기초방71()
 
    Dim Val1&, Val2
    Dim rngAll As Range: Set rngAll = Range([c4], [c4].End(4))
    Dim rngA As Range
    Dim bln As Boolean
    
    For Each rngA In rngAll
    
        If Day(rngA(1, 0)) = 1 Then                            '= 매월초가 되면 초기값으로 전환
           Val2 = Val2 * 0 + rngA
        Else: Val2 = IIf(Val2 = 0, rngA, Val2 + rngA): End If  '= 월별누적
        
              Val1 = IIf(Val1 = 0, rngA, Val1 + rngA)          '= 전체누적
              rngA(1, 4).Resize(1, 2) = Array(Val1, Val2)      '= 출력
    
    Next rngA
    
 
 End Sub

 

 

이건 VBA보다 수식이 더 어려워보인다.

그러나 이것만 기억하면 된다. 

 

LAMBDA 함수는 사용자 정의 함수여서 반드시 인자를 하나이상 받아야 하는데, 이 람다함수를 도와주는 함수들이 있는데 그중에 하나가 SCAN 함수이다. 스캔함수는 REDUCE함수와 달리 스캔함수의 범위가 100이면 100행을 모두 계산하지만 REDUCE 함수는 그 결과값으로 한번 전체 계산을 한다.

 

복잡해 보이지만 기준이 되는 수량 열에서 해당 일자와 전일 날짜와의 [ 월 ] 을 비교하여 월별 누계를 구하겠다 ...뭐 이런 뜻이다. 

 

지금이 새벽 2시다..100문제중에 이젠 30문제도 남지 않았다. 다들 열심히 따라와주길 바란다.

그런와중에 와...졸립다.

 

기초방71.xlsm
0.03MB

댓글