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

[기초방] VBA 100제 #66 [ 문자열 정렬하기(feat. 배열정렬) ]

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

 

문자열을 정렬하는 구문이다.

 

정렬을 위해서 지나칠 정도로 꼬아놓은 문제이다.

 

우선 몇일동안 본인이 올려놓은 코드들중에 일부 코드가 오피스 2019버전 이하에서는 적용이 안될수 있다.

 

이번 문제를 풀기 위해서 키 역할을 한 녀석이 SortBy인데 역시 하위버전에서는 작동이 안될 수 있다.

 

우선 엑셀 sort 함수를 이용한 배열 정렬이다.

ReDim maxNum(1 To UBound(Vall, 1), 1 To 2)
       
   For Each Va In Vall
       i = i + 1
       maxNum(i, 1) = Va
       maxNum(i, 2) = .MaxIfs(rngAll.Offset(, 1), rngAll, Va)  

   Next Va

maxNum = application.Sort(maxNum)

배열을 정렬하여 maxNum 배열에 넣는 구문이다. 기본값은 오름차순 정렬이다. 

1: 오름차순 / 2: 내림차순

 

 

Application.SortBy를  이용한 배열 정렬이다.

 vtemp = Application.SortBy(vtemp, .Index(vtemp, , 1), -1, .Index(vtemp, , 2), 1, .Index(vtemp, , 3), 1)

1: 오름차순 / -1:내림차순

 

매개상수가 sort 와 sortby 가 차이가 있음을 유념하길 바란다.

 

 

rowV = Application.Evaluate("ROW(1:" & UBound(vtemp, 1) & ")")

위 코드는 본인이 배열 슬라이싱 포스팅에 올려놓았던 내용으로 배열에서 두개 이상의 배열의 요소를 슬라이싱 할때

사용되는 구문이다.

 

rowV = Application.Evaluate("ROW(1:" & UBound(vtemp, 1) & ")")

[k7].Resize(UBound(vtemp, 1), 2) = .Index(vtemp, rowV, Array(2, 3))

이 개념들을 알면 정렬시 셀에 출력을 한 후 재 정렬하기 보다는 배열 상태에서 바로 정렬을 한 후 그 결과를 출력할 수 있어 코드 진행 절차상 더 유리하게 코드 진행을 이어 나갈 수 있다.

 

더보기
Option Explicit
Sub 기초방66()

    Dim rngAll As Range: Set rngAll = Range([c8], [c8].End(4))
    Dim Vall, Va, rowV
    Dim maxNum(), i&
    Dim vtemp()
    
    With Application
    
       Vall = .Unique(rngAll)                                       '= 유일값 구하기
       ReDim maxNum(1 To UBound(Vall, 1), 1 To 2)
       
       For Each Va In Vall
           i = i + 1
           maxNum(i, 1) = Va
           maxNum(i, 2) = .MaxIfs(rngAll.Offset(, 1), rngAll, Va)   '= 최대값 구하기
       
       Next Va
       
       maxNum = .Sort(maxNum)                                       '= 최대값 구한것에 대한 오름차순 정렬
       
       Vall = Union(rngAll, rngAll.Offset(, 1))                     '= 두개의 영역을 합쳐서 Vall 배열에 담아라
       
       ReDim vtemp(1 To UBound(Vall, 1), 1 To 3)                    '= 임시배열에 VAll 행의 길이와 3의 열의 길이를 설정
       
       i = 0
       For Each Va In .Index(Vall, , 1)
       
           i = i + 1
           vtemp(i, 1) = Left(Va, 1): vtemp(i, 2) = Right(Va, 1)
           vtemp(i, 3) = .Index(Vall, i, 2)
        
       Next Va                                                   '= Vtemp배열에 문자 + 숫자 + 점수를 담아라
        
           vtemp = .SortBy(vtemp, .Index(vtemp, , 1), -1, .Index(vtemp, , 2), 1, .Index(vtemp, , 3), 1)  '= 정렬해라
           
       For i = 1 To UBound(vtemp, 1)
           vtemp(i, 2) = .Index(vtemp, i, 1) & .Index(vtemp, i, 2)   '= vtemp 배열 2열에 1열과 2열을 합친 결과를 담아라
       Next i
       
       rowV = Application.Evaluate("ROW(1:" & UBound(vtemp, 1) & ")")
       
       [g7].Resize(UBound(maxNum, 1), 2) = maxNum
       [k7].Resize(UBound(vtemp, 1), 2) = .Index(vtemp, rowV, Array(2, 3))  '= 결과를 출력해라
    
    End With

End Sub

기초방 66.xlsm
0.04MB

댓글