결합되어 있는 로또번호를 풀어서 각 사람의 로또 번호를 정렬하는 구문이다.
이 문제를 해결하기 위해서는 2가지를 알고 있어야 한다.
1. 문제에서는 숫자들이 문자열로 조합이 되어 있기 때문에 저상태에서 SPLIT를 하게 되면 숫자들이 문자화 되어서 정렬을 하게 될경우, 숫자가 아닌 문자로 인식하기에 문자열 정렬이 된다
rngX.Resize(1, 7).NumberFormatLocal = "G/표준"
rngX.Resize(1, 7).Value = rngX.Resize(1, 7).Value
영역을 선택 후 초기화 한후 다시 VALUE값으로 씌어주면 된다.
두번째는 행단위 정렬이다.
rngX(1, 2).Resize(1, 6).Sort rngX(1, 2), Orientation:=2
이 두 구문을 모를 경우 문제를 쉽게 풀 수 없을 것이다.
이참에 한번 더 들여다 보길 바란다.
더보기
Option Explicit
Sub 기초방79()
Dim rngAll As Range: Set rngAll = [b5:b14]
Dim rngA As Range
Dim rngX As Range: Set rngX = [j18]
Dim V
For Each rngA In rngAll
V = Split(rngA(1, 1) & "," & rngA(1, 2), ",")
rngX.Resize(1, 7) = V
rngX.Resize(1, 7).NumberFormatLocal = "G/표준"
rngX.Resize(1, 7).Value = rngX.Resize(1, 7).Value
rngX(1, 2).Resize(1, 6).Sort rngX(1, 2), Orientation:=2
Set rngX = rngX.Offset(1)
Next rngA
End Sub
마지막으로 365 함수를 리뷰해보도록 하겠다.
MAKEARRAY를 모르면 행단위 정렬이 많이 힘들것이다.
MAKEARRAY는 LAMBDA에 행과 열로 인자를 넘기기 때문에 BYROW, BYCOL과 비슷하게 느낄 수도 있지만
BYROW, BYCOL은 그렇게 넘긴 인자로 결과값을 반환받는 반면, MAKEARRAY는 행과 열로 넘긴 후 반환도 행과 열로 반환을 하게 되기에 행단위 정렬이 가능하다.
더보기
=LET(
_range, TEXTSPLIT(TEXTJOIN({",", "*"}, , B5:H14), ",", "*"),
_name, TAKE(_range, , 1),
_num, DROP(_range, , 1),
_sort_N, MAP(_num, LAMBDA(x, x * 1)),
_result, MAKEARRAY(ROWS(_sort_N), COLUMNS(_sort_N),LAMBDA(r, c, INDEX(SORT(INDEX(_sort_N, r), , , 1), c))),
HSTACK(_name, _result)
)
'VBA > 엑사남_기초방' 카테고리의 다른 글
[기초방] VBA 100제 #81 [ 테이블 형태 변경하기 ] (2) | 2023.10.19 |
---|---|
[기초방] VBA 100제 #80 [ 테이블교차하기 ] (0) | 2023.10.19 |
[기초방] VBA 100제 #78 [ 열선택하여 조건에 맞는값 출력 ] (2) | 2023.10.19 |
[기초방] VBA 100제 #77 [ 고유값 pivot ] (0) | 2023.10.17 |
[기초방] VBA 100제 #76 [ 상위랭커 구하기 ] (0) | 2023.10.17 |
댓글