엑셀에서 배열을 이용하게 되면 편하긴 하지만, 배열이 많아지게 되면 연산이 너무 오래걸려 개인적으로 배열 함수를 좋아하지 않습니다.
ex) {=large(if(조건.......)}
그래서 배열을 사용하지 않는 방법을 찾아보았습니다.
large 함수에 조건 걸기
https://www.extendoffice.com/documents/excel/4938-excel-large-if-multiple-conditions.html
sumifs, countifs 는 존재하는데, largeifs 는 없습니다.
해당 방식을 응용해서 largeifs 처럼 사용할 수 있을 듯 싶습니다.
링크된 내용을 이용하여 위의 내용을 아래의 요약처럼 바꿔볼 수 있습니다.
우측에 연두색의 값을 조정하면 자동으로 변경됩니다.
이 것을 위해서 약간의 계산이 필요합니다.
쉽게 따라할 수 있도록 한 셀에 수식을 몰아넣지 않고 단계별로 작성하였습니다.
옆에 계산할 수 있도록 칸을 만들어 수식을 입력하도록 하겠습니다.
열번호는 해당 row() 값을 나타냅니다. 개인적으로 매우 유용한 함수라고 생각됩니다.
구분 | 함수 |
열번호 | =ROW() |
년도 | =YEAR(A2) |
월 | =MONTH(A2) |
일 | =DAY(A2) |
전월구분1 | =IF(A2<=DATE($AA$1,$AA$2,1)-1,"전월","") |
전월구분2 | =SUMPRODUCT(LARGE(($B$2:$B$19=B2)*($N$2:$N$19="전월")*($J$2:$J$19),1)) |
전월구분최종 | =IF(J2=O2,"전월","") |
열번호는 해당 열값을 참조하기 위해서 만들었습니다.
년도, 월, 일은 요약의 우측 상단에 녹색배경값과 비교하기 위함입니다.
전월구분1은 요약에서 '전월 잔고'를 구하기 위한 첫번째 함수 입니다. 녹색배경 값보다 이전 내용이라면 '전월'이라고 표시됩니다. 년 : 2019, 월 : 2 일 때 DATE(2019,2,1) 는 2019-2-1 입니다. 따라서 DATE함수 값에서 '-1'를 입력해서 DATE(2019,2,1)-1 : 2019-01-31 로 됩니다. DATE함수 값보다 작거나 같으면 '전월' 이라는 글자가 나오게 됩니다.
전월구분2는 이 글의 상단의 링크를 이용한 함수 법입니다. 실제 최종 '전월 잔고'의 열번호를 얻을 수 있습니다. 첫번째 조건 '$B$2:$B$19=B2' 는 이름이 같을 때 조건입니다. '홍길동' 이름일 때 TRUE 값(숫자로는 1)을 얻을 수 있습니다. 그 외에는 FALSE 값(숫자로는 0)이 됩니다. 두번째 조건 '$N$2:$N$19="전월"' 은 해당 범위에서 '전월' 이 있을 때 TRUE 값을 얻을 수 있습니다. 세번째 조건 '$J$2:$J$19' 는 해당 값을 곱해줍니다.
조건1*조건2*조건3 의 결과로는 이름이 홍길동이면서 '전월'인 열번호를 나타냅니다.
이 때 SUMPRODUCT와 LARGE 함수를 이용하여 조건1*조건2*조건3 의 값 중 가장 큰 값을 구할 수 있습니다.
전월최종 구분은 최종적인 '전월' 을 구해줍니다.
위의 값들을 가지고 요약정리 하면 다음과 같습니다.
청구액 | =SUMIFS($D$2:$D$19,$B$2:$B$19,$R4,$K$2:$K$19,$AA$1,$L$2:$L$19,$AA$2) |
전월 잔금 | =SUMIFS($H$2:$H$19,$B$2:$B$19,$R4,$P$2:$P$19,"전월") |
카드입금 | =SUMIFS($E$2:$E$19,$B$2:$B$19,$R4,$K$2:$K$19,$AA$1,$L$2:$L$19,$AA$2) |
현금입금 | =SUMIFS($F$2:$F$19,$B$2:$B$19,$R4,$K$2:$K$19,$AA$1,$L$2:$L$19,$AA$2) |
입금합 | =U4+V4 |
잔금 | =S4+T4-W4 |
번외로 전월구분2와 전월최종을 만들지 않고 하는 방법도 있습니다.
전월 열번호에 SUMPRODUCT 함수를 넣는 방법입니다.
전월 열번호 | =SUMPRODUCT(LARGE(($B$2:$B$19=Z17)*($N$2:$N$19="전월")*($J$2:$J$19),1)) |
청구액 | =SUMIFS($D$2:$D$19,$B$2:$B$19,$R16,$K$2:$K$19,$AA$1,$L$2:$L$19,$AA$2) |
전월 잔금 | =INDEX($A$1:$H$19,VLOOKUP(R16,$Z$16:$AA$19,2,FALSE),8) |
카드입금 | =SUMIFS($E$2:$E$19,$B$2:$B$19,$R16,$K$2:$K$19,$AA$1,$L$2:$L$19,$AA$2) |
현금입금 | =SUMIFS($F$2:$F$19,$B$2:$B$19,$R16,$K$2:$K$19,$AA$1,$L$2:$L$19,$AA$2) |
입금합 | =U16+V16 |
잔금 | =S16+T16-W16 |
해당하는 이름의 열번호를 '전월 열번호'에서 얻습니다(VLOOKUP 함수 이용). 이 열번호를 가지고 INDEX 함수를 통해 잔금 위치를 가져오는 방식입니다.
* SUMPRODUCT 함수 범위 설정할 때 조건1, 조건2, 조건3의 범위는 같아야 합니다. (꼭!)
* 조건 1 범위 : A1:A5
* 조건 2 범위 : B1:B5
* 조건 3 범위 : C1:C4
* 이렇게 되면 에러가 뜹니다. 조건 3의 범위를 C1:C5 로 변경해줍니다.
* SUMIFS, COUNTIFS 도 마찬가지로 범위는 동일해야 합니다.
'엑셀(Excel)' 카테고리의 다른 글
엑셀 특정값 여러개 찾기 (배열 방식) (0) | 2018.06.12 |
---|