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

[기초방] VBA 100제 #82 [ 테이블 정렬 + 합계구하기 ]

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

 

표를 정렬하고 합계를 구하는 문제이다.

 

이문제는 365 함수의 MAKEARRAY + 테이블 정렬을 복습하는 차원으로 만들었다.

 

=HSTACK(
MAKEARRAY(ROWS($B$4:$F$13),COLUMNS($B$4:$F$13),
		  LAMBDA(r,c,INDEX(SORT(INDEX($B$4:$F$13,r,),,,1),c))),
          
BYROW(B4:F13,LAMBDA(s,SUM(s)))
)

 

이문제의 관건은 역시나 가로행의 정렬이었는데 시훈아빠님께서 정말 놀라운 꿀팁으로 풀어버렸다.

 

 

코드는 이렇다.

 

 

SMALL 함수로 정렬을 하는 TRICK을 선보였다...지림

 

 

시훈 아빠님의 코드를 참고하여 본인 코드를 공개하려고 한다

 

 

하나는 셀기반으로 출력을 한거구

또 하나는 TEXTSPLIT + 배열상수 방식을 VBA로 풀어낸 것이다.. 재밌고 편한걸로 공부하길 바란다.

 

위에는 알거고, TEXTSPLIT 방식을 좀 더 설명하면 

 

 For i = 1 To UBound(vAll, 1)
    
        str = IIf(str = "", Join(.Small(.Index(vAll, i), Array(1, 2, 3, 4, 5)), ","), str & ";" & _
                            Join(.Small(.Index(vAll, i), Array(1, 2, 3, 4, 5)), ",")) & "," & _
                            .Sum(.Index(vAll, i))
        
       
        
    Next i
    
    End With                                                                    
                                                                
    rngX.Formula2 = "=TEXTSPLIT(" & "{" & str & "}" & "," & """,""" & "," & """;""" & ")"

뭔가 복잡해보이지만 함수식으로 고치면

점수1, 점수2, 점수3, 점수4, 점수5, 합계;점수6, 점수7, 점수8, 점수8, 점수10, 합계;

이런식으로 같은 행은 콤마(,) 이어지고, 행구분은 세미콜론(;)으로 이뤄짐

이것을 365 함수인 TEXTSPLIT로 TEXTSPLIT(문자, "행구분자", "열구분자") 로 표기 한것이다.

실제 이것은 배열에서 이루어지는것으로 문자를 VBA에서 배열상수화 시키기 위해서 앞뒤로 { }로 붙혀주고 구분자로 콤마와 세미콜론을 VBA식으로 넣어준것이다.

 

마지막으로 가장 중요한것은 이렇게 VBA 에서 배열상수를 사용하려면 반드시 FORMULA2를 사용하여야 한다.

 

기초방82.xlsm
0.02MB

댓글