문자열을 정렬하는 구문이다.
정렬을 위해서 지나칠 정도로 꼬아놓은 문제이다.
우선 몇일동안 본인이 올려놓은 코드들중에 일부 코드가 오피스 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
'VBA > 엑사남_기초방' 카테고리의 다른 글
[기초방] VBA 100제 #68 [ 테이블 결합하기 ] (0) | 2023.10.01 |
---|---|
[기초방] VBA 100제 #67 [ 테이블 요약하기 ] (0) | 2023.10.01 |
[기초방] VBA 100제 #65 [ 유효성 검사를 통한 필터링 ] (0) | 2023.09.20 |
[기초방] VBA 100제 #64 [ 유효성 검사를 통한 총 수량 구하기 ] (0) | 2023.09.19 |
[기초방] VBA 100제 #63 [ X축, Y축 최대 최소값 구하기 ] (0) | 2023.09.19 |
댓글