본문 바로가기
VBA/365 FUNCTION

[365 함수리뷰] 각행에서 숫자들만 뽑아서 출력하기

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

 

 

서랍님의 문제이다..

 

각행에서 숫자만 뽑아서 나열하는것이다. 

VBA로 하면 정규식으로 뽑았을 것이다. 

 

최근에도 비슷한 문제를 다룬적이 있어서 그것에 대해서 리뷰는 하지 않겠다.

 

행 단위로 움직이기 때문에 BYROW 함수를 만지작 거릴수도 있으나, BYROW함수는 배열을 인자로 받아서 하나의 결과값만을 도출한다.

 

가령 각셀에 값들을 출력하는 문제가 아니라 한셀에 콤마 또는 구분자로 연결된 식의 문제이면 BYROW를 사용하여도 된다.

 

이버네 서랍님은 영역을 순환하는 함수중 기초방77번에서 다룬 REDUCE함수를 사용하여 문제를 풀었는데, 그 코드에 대해서 리뷰를 해보려면 이렇다.

 

=LET(
    →step1, 전체영역설정,
    _r, B4:B6,

    →step2, 대분류  LAMBDA설정,
    _f, LAMBDA(x,

    →step3, 각행마다 데이터를 가공할 사용자 함수부분,
        LET(

            →step3-1, 각행의 문자의 길이 만큼 문자를 하나씩 출력,
            a, MID(x, SEQUENCE(LEN(x)), 1) * 1,

            →step3-2, 숫자인건 출력 / 아닌건 공백처리,
            b, TEXTSPLIT(CONCAT(IF(ISNUMBER(a), a, " ")), " "),

            →step3-3, 공백이 아닌 숫자들만 출력,
            FILTER(b, b <> "") * 1
        )
    ),

    →step4, 한행씩 반복하며 step3에서 만들어진 사용자함수 결과출력,
    IFNA(
        DROP(REDUCE("", _r, LAMBDA(a, b, VSTACK(a, _f(b)))), 1),
        ""
    )
)

코드를 크게 분류하기 위해 코드를 약간 달리해서 보기로 하자

 

=REDUCE("",B4:B6,LAMBDA(a,b,VSTACK(a,b)))

REDUCE 함수는 영역의 각행을 순환하면서 함수결과에 따라 결과물을 출력하는 함수이다.

 

VSTACK(a,b) 에서 a는 이전 결과값 / b는 현재 결과값으로 구분되어지는데, 우린 저 b값에 해당되는 사용자 함수만 만들면 결과를 도출할 수 있다.

 

 

=REDUCE("",B4:B6,LAMBDA(a,b,VSTACK(a,

LET(
c, MID(b, SEQUENCE(LEN(b)), 1) * 1,
d, TEXTSPLIT(CONCAT(IF(ISNUMBER(c), c, " ")), " "),
FILTER(d, d <> "") * 1

))))

b의값을 LET함수로 함수화하여 결과값을 얻을 수 있다.

 

 

REDUCE함수의 특징을 안다면 이러한 형태에 대해서 당황하지 않을 것이다. 마지막으로 에러부분과 실제 결과로 가져올 영역에 대한 추가 코드를 진행하면

 

=IFNA(DROP(REDUCE("",B4:B6,LAMBDA(a,b,VSTACK(a,

LET(
c, MID(b, SEQUENCE(LEN(b)), 1) * 1,
d, TEXTSPLIT(CONCAT(IF(ISNUMBER(c), c, " ")), " "),
FILTER(d, d <> "") * 1

)))),1),"")

우리가 원하는 형태의 값을 얻어올 수 있다.

 

 

본인은 REDUCE함수 보다는 TEXTJOIN + TEXTSPLIT가 더 익숙해서,

 

 

=IFNA(TEXTSPLIT(TEXTJOIN(";",,BYROW(B4:B6, LAMBDA(x, 

LET(

a, MID(x,SEQUENCE(LEN(x)),1)*1,

b,TEXTSPLIT(CONCAT(IF(ISNUMBER(a),a," "))," "),

TEXTJOIN(",",,FILTER(b,b<>"")*1))))),",",";"),"")

 

이렇게 결과물을 도출하였다..

BYROW함수는 앞서 배열을 인자로 받아서 단일값으로 반환한다고 하였다. 그래서 값들을 단일값으로 만들기 위해 TEXTJOIN 함수와 이것을 다시 분리하여 각 셀에 풀어 넣기 위한 TEXTSPLIT함수를 사용하였다.

 

여러방법이 있겠지만, REDUCE함수를 통한 서랍님의 코드를 더 공부해보길 바란다.

 

 

숫자골라내기(서랍).xlsx
0.01MB

 

 

 

 

댓글