크기가 서로 다른 표를 결합하여 정렬하는 문제이다.
본인은 이번 문제를 두가지 방법으로 풀어보았다. 365함수까지 생각하면 세가지 방법이 맞을것 같다.
첫번째는, 전형적인 셀기반 방식이다.
표1과 표2를 표3에 붙힌 후 이를 정렬하여, 문제에 따라 일부열의 위치를 서로 바꾸는 형태이다.
두번째는, 각 영역을 배열상수 형태로 변경해주는 ArrayToText방식으로 하는 배열 형태이다.
배열상수 형태라고 하는것은 형렬의 형태를
{"회색","부산",117,"2023";"회색","부산",124,"2022";"파랑","강원",157,"2023";"노랑","부산",166,"2021"}
이렇게 나타내주는것을 말한다. 이를 구현하기 위해서는
[j7]= "=" & Application.ArrayToText((rngB), 1)
위의 형태가 아닌 출력할 셀 위치에 Formula2를 사용하여야 정상적으로 배열 형태로 출력된다.
[j7].Formula2 = "=" & Application.ArrayToText((rngB), 1)
365함수인 ArrayToText는 표현 방법에 따라 [간결과 고급]으로 나눠지는데 배열상수 형태로 표기하기 위해서는 상수가 1이며, 그렇지않고 그냥 콤마(,)형태로 쭈욱 나열하려면 상수 0을 사용하면 된다.
더보기
Option Explicit
Sub 기초방68()
Dim rngA As Range: Set rngA = [a6].CurrentRegion
Dim rngB As Range: Set rngB = [e6].CurrentRegion
Dim rngC As Range: Set rngC = [j6]
Set rngC = rngC.Resize(rngA.Rows.Count + rngB.Rows.Count, 4)
rngC.Delete shift:=xlUp
Range("표2[#All]").Copy [j6]
Range("표1").Copy Cells(Rows.Count, "j").End(3)(2)
Set rngC = [j6].CurrentRegion
rngC.SpecialCells(4) = "2021이전"
ActiveSheet.ListObjects(3).Unlist
ActiveSheet.ListObjects.Add(1, rngC).Name = "표3"
ActiveSheet.ListObjects("표3").Sort.SortFields.Clear
Range("표3").Sort Key1:=Range("표3[[#All],[지역명]]"), Key2:=Range("표3[[#All],[개수]]"), Key3:=Range("표3[[#All],[연도]]"), Header:=xlYes
Range("표3[[#All],[지역명]]").Cut
Range("표3[[#all],[색상]]").Insert shift:=xlToRight
With Range("표3")
.Interior.ColorIndex = xlNone
.Borders.LineStyle = xlNone
ActiveSheet.ListObjects(3).TableStyle = "TableStyleMedium2"
End With
End Sub
Sub 기초방68_1()
Dim rngA As Range: Set rngA = ActiveSheet.ListObjects("표1").DataBodyRange
Dim rngB As Range: Set rngB = ActiveSheet.ListObjects("표2").DataBodyRange
Dim rngX As Range: Set rngX = [j6]
Dim Vall
rngX.Resize(100, 4).ClearContents '= 초기화
rngX.Resize(1, 4) = Array("지역명", "색상", "개수", "연도")
[j7].Formula2 = "=" & Application.ArrayToText((rngB), 1)
Cells(Rows.Count, "j").End(3)(2).Formula2 = "=" & Application.ArrayToText((rngA), 1)
rngX.CurrentRegion.SpecialCells(4) = "2021이전"
Set rngX = Range([j7], [m7].End(4))
Vall = rngX
With Application
'= 배열정렬
Vall = .SortBy(Vall, .Index(Vall, , 2), 1, .Index(Vall, , 3), 1, .Index(Vall, , 4), 1)
[j7].Resize(UBound(Vall, 1), 1) = .Index(Vall, , 2)
[k7].Resize(UBound(Vall, 1), 1) = .Index(Vall, , 1)
[l7].Resize(UBound(Vall, 1), 1) = .Index(Vall, , 3)
[m7].Resize(UBound(Vall, 1), 1) = .Index(Vall, , 4)
End With
End Sub
마지막으로 365함수식이다.
다시한번 공부를 해야하는 이유를 찾길 바란다.
'VBA > 엑사남_기초방' 카테고리의 다른 글
[기초방] VBA 100제 #70 [ 구간별 값 구하기 ] (0) | 2023.10.02 |
---|---|
[기초방] VBA 100제 #69 [ 테이블 순환하며 결합하기 ] (0) | 2023.10.02 |
[기초방] VBA 100제 #67 [ 테이블 요약하기 ] (0) | 2023.10.01 |
[기초방] VBA 100제 #66 [ 문자열 정렬하기(feat. 배열정렬) ] (0) | 2023.09.21 |
[기초방] VBA 100제 #65 [ 유효성 검사를 통한 필터링 ] (0) | 2023.09.20 |
댓글