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

[기초방] VBA 100제 #65 [ 유효성 검사를 통한 필터링 ]

by 일등미노왕국 2023. 9. 20.

기초방 64번 문제에 필터링까지 발전한 문제이다.
 
처음에 의도한건 Filter함수로 해결하는 의도였지만, 엑셀 2021버전이상 가능한 함수여서 고급필터와 정렬함수로 해결하였다.

더보기
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
 
    Dim rngAll As Range: Set rngAll = [e5].CurrentRegion
    Dim rngA As Range: Set rngA = [k6:m6]
    Dim rngX As Range
    Dim i&
    
    If Intersect(Target, [k6:m6]) Is Nothing Then Exit Sub
    
    For i = 1 To 3
    
        Validation rngA.Item(i)                                     '= 유횽성검사 호출
        
    Next i
    
    Set rngX = [k8].CurrentRegion.Offset(1): rngX.Clear
    
    rngAll.AdvancedFilter xlFilterCopy, [k5:m6], [k8:n8], False     '= 고급필터
    
    Range([n8], [n8].End(4)).Sort [n9], 1, Header:=xlYes            '= 정렬
    
        
    
End Sub

Sub Validation(rngX As Range)
    Dim rngV As Range
    Dim V
    Dim rngE As Range: Set rngE = Range([e6], [e6].End(4))
    
    Set rngV = Range(rngX(1, -5), rngX(1, -5).End(4))
    
    V = Application.Sort(Application.Unique(rngV))
        
    V = Join(Application.Transpose(V), ",")
       
    With rngX.Validation
        .Delete
        .Add xlValidateList, Formula1:=V
    End With
    
    [n6] = Application.SumIfs(Range([h6], [h6].End(4)), rngE, [k6], rngE.Offset(, 1), [l6], rngE.Offset(, 2), [m6])
    
End Sub
=SORT(FILTER($E$6:$H$10757,
($E$6:$E$10757=K6)*($F$6:$F$10757=L6)*($G$6:$G$10757=M6),
"없음"),
4,
1)

 

기초방65.xlsm
0.25MB

 
 
이렇게 함수식으로도 가능하다...물론 2021버전 이상부터

댓글