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

[기초방] VBA 100제 #91 [ 표에서 다중검색하기 ]

by 일등미노왕국 2024. 1. 7.

 
 
우노 사설님의 강의에서 문제를 가져와 보았다.
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))
)

 
 
위 코드에 대해서는 우노사설님의 영상을 보고 확인하면 좀더 쉽게 이해가 되리라본다.
 
그럼 이만 아디오스
 

기초방91.xlsm
0.02MB

댓글