VBA/엑사남_기초방

[기초방] VBA 100제 #68 [ 테이블 결합하기 ]

일등미노왕국 2023. 10. 1. 16:51

 

 

크기가 서로 다른  표를 결합하여 정렬하는 문제이다.

 

본인은 이번 문제를 두가지 방법으로 풀어보았다. 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함수식이다.

 

다시한번 공부를 해야하는 이유를 찾길 바란다.

 

기초방68.xlsm
0.03MB