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

[기초방] VBA 100제 #70 [ 구간별 값 구하기 ]

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

 

우노사설님의 강의를 리뷰한 문제이다.

https://www.youtube.com/watch?v=5X_NhTJUpGM 

본인의 코드 진행이 이해가 안된다면 강의를 보고 진행하는것을 추천한다.

 

이번 문제는 테이블에서 각 구간에 해당되는 값들의 갯수를 출력하는 문제이다.

 

그러기 위해서는 일단 양수라는 조건하에 테이블의 최대값을 구한 후, 그것을 CEILING_MATH 함수로 각 조건의 STEP의 배수로 재조정하여야 한다.

MaxVal = .Ceiling_Math(.Max(rngAll), Step)

 

 

이렇게 구해진 값으로, 각 구간을 SEQUENCE로 분리해야 한다.

아래의 코드는 SEQUENCE함수로 구한 값을 ARRAYTOTEXT로 배열상수화 시키는 구문이다.

Vlist = .ArrayToText(.Sequence(MaxVal / Step, , Step, Step), 1)

 

 

그 다음은 구해진 구간을 셀에 출력한 후 각 구간에 맞는 계산을 하게 되는데 결과물과 같이 ' <= ' 을 포함하기 위해 한번의 작업이 더 들어가야 한다.

[l8].Formula2 = "=" & Vlist                
[m8].Formula2 = "=" & .ArrayToText(.Index(.Frequency(rngAll, Range([l8], [l8].End(4))), .Sequence(listcnt)), 1)
                                           
str = """<=""" & "&"                       

[l8].Formula2 = "=" & str & Vlist

 

첨부한 우노사설님 강의를 보시면 알겠지만 CEILING_MATH 함수는 항상 마지막 값을 도출하게 되는데 이걸 정리하기 위해서 365 함수를 이용해서는 마지막을 정리하기 위해서는

DROP(배열, -1) 또는 INDEX(배열, SEQUENCE(행의길이) 로 잘라주면 되는데 VBA에서는 아직 DROP함수를 사용할 수 없기 때문에  이번 구문에서는 SEQUENECE를 사용하였다. 

 

[m8].Formula2 = "=" & .ArrayToText(.Index(.Frequency(rngAll, Range([l8], [l8].End(4))), _
.Sequence(listcnt)), 1)

 

365함수를 이용해서는 LAMDA함수를 이용하였는데

 

만들어진 람다함수를 이용해서, 이름정의를 통해서 사용자함수를 구성할 수 있다.

 

 

본인의 글만 보고서는 감이 잘 안잡히고 복잡해 볼일 수 있지만, 우노사설님 강의를 듣고 온다면, 본인이 365함수를 두고 굳이 이렇게 vba함수를 통해서 결과값을 도출하는것이 안쓰럽게 보일 수 있을것이다. ㅋㅋㅋ

 

언제 우리가 누구한테 보여주려고 이 짓(?)을 했는가....내 만족이지

 

기초방70.xlsm
0.03MB

댓글