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

[기초방] VBA 100제 #64 [ 유효성 검사를 통한 총 수량 구하기 ]

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

엑셀에서 많이 나오는 문제이다.

각 키값을 조회하여 sumifs를 통해서 총 수량을 구하는 그런 문제....

 

이런 문제를 VBA로 풀 사람이 있을까도 싶다..ㅋㅋㅋ 

근데 언제는 그런 거 생각하고 문제를 낸게 아니므로...그냥 코드 리뷰를 해보려한다.

 

유효성 검사를 만들어가는 하위 프로시저가 핵심이 아닐까 한다.

Sub Validation(rngX As Range)
    Dim rngV As Range
    Dim V
    
    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
    
End Sub

목록을 2차원 배열로 가져온 후,

유니크한 값만 추출해서 정렬 후 이것을 1차원 배열로 변환시킨 후 Join으로 유효성 검사의 목록을 만들었다.

처음 이코드를 알게 되었을때 너무나 기뻐했던 그때가 갑자기 생각이 난다.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rngAll As Range: Set rngAll = [k6:m6]
    Dim rngX As Range: Set rngX = [n6]
    Dim rngE As Range: Set rngE = Range([e6], [e6].End(4))
    Dim i&
    
    If Intersect(rngAll, Target) Is Nothing Then Exit Sub       '= 유효성검사 영역
    For i = 1 To 3
    
        Validation rngAll.Item(i)                               '= 유횽성검사 호출
        
    Next i
                                                                '= sumifs 계산
    rngX = Application.SumIfs(Range([h6], [h6].End(4)), rngE, [k6], rngE.Offset(, 1), [l6], rngE.Offset(, 2), [m6])
    
End Sub
Sub Validation(rngX As Range)
    Dim rngV As Range
    Dim V
    
    Set rngV = Range(rngX(1, -5), rngX(1, -5).End(4))           '= 각항목의 영역
    
    V = Application.Sort(Application.Unique(rngV))              '= 유니크한 목록들을 정렬해라
        
    V = Join(Application.Transpose(V), ",")                     '= 2차원배열을 1차원 배열로 변경한 후 Join해라
       
    With rngX.Validation                                        '= 유효성검사
        .Delete                                                 '= 기존 유효성검사 삭제
        .Add xlValidateList, Formula1:=V                        '= 새로운 목록 추가
    End With
    
End Sub

기초방64.xlsm
0.25MB

댓글