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

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

by 일등미노왕국 2023. 10. 1.

 

 

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

 

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

 

 

댓글