본문 바로가기
VBA/365 FUNCTION

[365 함수리뷰] 해당기간의 [월]을 표시

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

 

이번에 리뷰해볼 수식은 서랍님이 엑사남 방에 올려주신  시작일과 종료일사이에 해당하는 월을 O으로 표기하는 수식을 리뷰해 보려고 한다.

 

시작일과 종료일의 날짜의 차이에 +1을 하는 이유는 

시작일 : 2016-03-25
종료일 : 2023-06-05

라고 할때,

2023 - 2016의 차는 7이지만 실제로는 8부터이기 때문에 모든 날짜 계산에 +1을 해야한다.

 

 _day_list, UNIQUE(EOMONTH(SEQUENCE(_end - _start + 1, , _start), -1) + 1),

두기간 사이의 날짜를 구해서 그 날짜들의 EOMONTH(날짜 , -1)를 구하면 전월의 마지막이 나오게 되는데 그 값의 +1을 하게되면 결국 해당월의 처음을 구할 수 있고 그 값들의 고유값을 구하게 되면 각 해당 월에 해당하는 1일을 구할 수 있다.

 

 

_t2, --(TRANSPOSE(_day_list) = _t1),

이렇게 하면 해당월의 시작일과 해당연도의 시작일 사이의 교차점에 TRUE , FALSE를 반환하는데  --을 통해서 1과 0으로 변하게 된다.

 

 

_td, WRAPROWS(IF(BYROW(_t2, LAMBDA(x, SUM(x))) = 1, "O", ""), 12),

BYROW로 함수로 앞서 구한 값들의 교차점의 합을 구하면 1이 되는데 그것들 통해 교차점에는 O / 아니면 빈값을 반환하는 한줄의 값들이 쭈욱 나열되는데 WRAPROWS를 통해서 위에서 부터 12개씩 ( 1월부터 12월) 짤라서 열방향으로 쌓으면서 TABLE 형태의 값을 도출하게 되는것이다.

 

더보기
=LET(
    _start, $B$1,
    _end, $B$2,
    _year_list, SEQUENCE(YEAR(_end) - YEAR(_start) + 1, , YEAR(_start)),
    _month_list, SEQUENCE(, 12),
    _day_list, UNIQUE(EOMONTH(SEQUENCE(_end - _start + 1, , _start), -1) + 1),
    _t1, TOCOL(DATE(_year_list, _month_list, 1)),
    _t2, --(TRANSPOSE(_day_list) = _t1),
    _td, WRAPROWS(IF(BYROW(_t2, LAMBDA(x, SUM(x))) = 1, "O", ""), 12),
    _output, VSTACK(HSTACK("구분", _month_list), HSTACK(_year_list, _td)),
    _output
)

 

 

본인 역시 365함수가 익숙치않아 코드를 하나하나 리뷰할때마다, 몇번씩 뜯어보곤한다.

본인의 리뷰를 몇번씩 보다 보면 이글을 읽고 있는 당신도 금방 365에 익숙해질수 있을 것이다.

 

기간별월표시(서랍리뷰).xlsx
0.03MB

댓글