우노 사설님의 강의에서 문제를 가져와 보았다.
https://www.youtube.com/watch?v=16_mEL_B6lM&t=615s
전통적인(?) 방법은 이러한 순서로 진행하게 될것이다.
1. rngH [A4:H4]를 순환하면서 지역 RANGE("K4")에서 해당 지역이 포함되어 있는지를 확인후에
2. 해당되는 지역이 있다면 그 지역의 데이터를 순환하면서 CheckStr을 호출하여 카운트된 수를 반환하여 그 합을 구하는 방식이다.
For Each rngQ In rngH
If InStr(rngR, rngQ) > 0 Then
Set rngY = rngQ.Offset(1)
NumCnt = NumCnt + CheckStr(Range(rngY, rngY.End(4)), rngC.Value)
End If
Next rngQ
Function CheckStr(rngY As Range, str$)
Dim rngQ As Range
Dim num&
For Each rngQ In rngY
If InStr(str, rngQ.Value) > 0 Then num = num + 1
Next rngQ
CheckStr = num
End Function
약간은 복잡하게 보이지만, 많은 시간동안 이런식의 풀이 방법이 정석처럼 받아들여졌다.
우노사설님의 말씀처럼 [잠깐 다르게 생각하라] 를 받아들이면 좀더 창의적인 방법이 나오게 된다.
처음 풀이 방법은 헤더영역을 순환하면서 일치된 헤더의 내용이 있다면 그 하위의 데이터를 다시한번 순환해야 했다면, 두번째 방법은 데이터 영역을 순환하면서 Check영역[K5]과 비교하여 일치된 값이 있으면 단순 헤더만 비교하기만 하기 때문에 또다시 순환문이 필요없게 된다.
For Each rngQ In rngD
If InStr(rngC, rngQ) > 0 Then
If InStr(rngR, Cells(4, rngQ.Column)) > 0 Then NumCnt = NumCnt + 1
End If
Next rngQ
많은 시간을 첫번째 방법처럼 풀었던거 같다... 이글을 본 사람들은 본인과 같은 수업료(?)를 안내길 바란다.
물론 이렇게 눈을 뜨게 한건 역시 365이다.
=LET(
a, --ISNUMBER(MATCH(A4:H4, TEXTSPLIT(K4, ","), 0)),
b, --ISNUMBER(TRANSPOSE(MATCH(A5:H24, TEXTSPLIT(K5, ","), 0))),
SUM(MMULT(a, b))
)
위 코드에 대해서는 우노사설님의 영상을 보고 확인하면 좀더 쉽게 이해가 되리라본다.
그럼 이만 아디오스
'VBA > 엑사남_기초방' 카테고리의 다른 글
[기초방] VBA 100제 #93 [ 엑셀 테이블 변환 ] (0) | 2024.10.20 |
---|---|
[기초방] VBA 100제 #92 [ 엑셀 데이터 병합 자동화 ] (4) | 2024.10.18 |
[기초방] VBA 100제 #90 [ 부분합 구하기 ] (2) | 2023.11.01 |
[기초방] VBA 100제 #89 [ 쇼핑몰 키워드 정리하기 ] (0) | 2023.10.28 |
[기초방] VBA 100제 #88 [ 리스트에서 해당 월 카운트하기 ] (0) | 2023.10.28 |
댓글