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

[기초방] VBA 100제 #77 [ 고유값 pivot ]

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

 

고유값을 Pivot 하는 문제이다.

 

이문제의 관건은 담당자의 고유값을 세로에서 가로로 뿌린 후 FILER함수를 이용하여 값을 구할 수 있느냐에 있다.

통상 FILTER함수는

= FILTER(배열, 조건, [못찾을때])

 

이것을 VBA 식으로 표현하면

With Application                                
       
   V = Application.Filter(rngAll.Columns(2), rngAll.Columns(1) = rngA, "not Found"))

   rngA(2, 1).Resize(UBound(V, 1), 1) = V     

End With

 

이렇게 하면 될것 같지만 해당되지 않는다.

 

FILTER함수의 부분일치값을 가져오는 ISNUMBER + SEARCH 조합으로 구하면 해결된다.

 

For Each rngA In rngF
    
   With Application    

       V = Application.Filter(rngAll.Columns(2), .IsNumber(.Search(rngA, rngAll.Columns(1))))

       rngA(2, 1).Resize(UBound(V, 1), 1) = V     

   End With
Next rngA

 

안그러면 영역을 다중 FOR문으로 돌거나 FIND를 하여 찾아 나가야 하는데, 이러한 건 기존에 많이 했기 때문에 본인의 포스팅을 찾아보길 바란다.

 

더보기
Option Explicit

Sub 기초방77()

    Dim rngAll As Range: Set rngAll = [a4:b49]
    Dim rngX As Range: Set rngX = [f12]
    Dim rngF As Range
    Dim rngA As Range
    Dim vtemp, V
    
    [f13:t100].ClearContents                         
    
    vtemp = Application.Unique(rngAll.Columns(1))       
    
    rngX.Resize(1, UBound(vtemp, 1)) = Application.Transpose(vtemp) 
    
    Set rngF = [f12].CurrentRegion
    
    For Each rngA In rngF
    
       With Application                                 
       
           V = Application.Filter(rngAll.Columns(2), .IsNumber(.Search(rngA, rngAll.Columns(1))))
           
           rngA(2, 1).Resize(UBound(V, 1), 1) = V        
           
       End With
    Next rngA



End Sub

 

365 함수에 관한 설명은 우노사설님 채널에서 확인해보길 바란다.

https://www.youtube.com/watch?v=0-0H_hIhVBk&ab_channel=%EC%9A%B0%EB%85%B8%EC%82%AC%EC%84%A4

 

 

 

기초방77.xlsm
0.02MB

댓글