엑셀에서 많이 나오는 문제이다.
각 키값을 조회하여 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
'VBA > 엑사남_기초방' 카테고리의 다른 글
[기초방] VBA 100제 #66 [ 문자열 정렬하기(feat. 배열정렬) ] (0) | 2023.09.21 |
---|---|
[기초방] VBA 100제 #65 [ 유효성 검사를 통한 필터링 ] (0) | 2023.09.20 |
[기초방] VBA 100제 #63 [ X축, Y축 최대 최소값 구하기 ] (0) | 2023.09.19 |
[기초방] VBA 100제 #62 [ 홀수_짝수차 구별하기 ] (0) | 2023.09.18 |
[기초방] VBA 100제 #61 [ 사진 정보 가져오기 ] (2) | 2023.09.15 |
댓글