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

[기초방] VBA 100제 #79 [ 로또번호 정렬하기 ]

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

 

결합되어 있는 로또번호를 풀어서 각 사람의 로또 번호를 정렬하는 구문이다.

 

이 문제를 해결하기 위해서는 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)
)

 

기초방79.xlsm
0.02MB

댓글