최근 엑셀에는 배열을 좀 더 강력하게 다룰 수 있는 LAMBDA 함수와 LAMBDA지원 함수들이 많이 추가되어서 참 좋긴 한데,최근추가된엑셀LAMBDA지원함수의한계구글시트와비교클리앙
분명 구글스프레드시트와 동일한 함수인데도, 엑셀의 함수는 이상한 경우가 많습니다.
엑셀 LAMBDA지원 함수의 대표적인 문제점들
1. 배열을 입력하면 터지는 함수들
=LET(list,B1:B10,ulist,UNIQUE(list),MAP(ulist,LAMBDA(v,COUNTIF(list,v))))
(중첩된 결과가 아닌데, 중첩 오류를 뱉는 엑셀의 버그;;)
이렇게 COUNTIF 같은 몇몇 함수는 셀 범위 참조가 아닌, 배열을 입력하면 함수가 터집니다. -_-
반면 구글시트에선 같은 함수로 수식을 작성해도 아무 문제가 없어요.
엑셀은 이런 함정 함수들이 많이 있기 때문에, 이런 벽을 만나면 최대한 잔머리 굴려서 다른 방법으로 우회가 가능한지 생각해야합니다. ㅋㅋ
위 수식은 다행스럽게도 이렇게 우회할 만한 방법이 있네요.
=LET(list,B1:B10,ulist,UNIQUE(list),MAP(ulist,LAMBDA(v,REDUCE(0,list,LAMBDA(a,c,IF(c=v,a+1,a))))))
2. 2022년에 추가된 람다지원함수(MAP, REDUCE, BYROW 등)의 빈약한 확장성
예를 들어 MAP(array1, lambda_or_array) 함수의 경우
다른 언어에서 흔히 보는 MAP함수처럼, 배열의 요소를 하나하나 훑어가면서 무언가 작업을 한 후에 새로운 배열을 리턴합니다.
그런데 엑셀에서는 람다함수가 리턴하는 요소는 무조건 단일값이여야 합니다.
만약 배열을 리턴하면, MAP함수는 터져버려요. (중첩된 배열이 아니여도 '중첩된 배열' 오류 )
반면 구글시트는 람다함수 리턴값으로 배열이 나와도 문제가 없습니다.
그래서 람다지원함수를 2개 중첩해서, 2차원 배열을 결과값으로 뽑고 싶어도 엑셀은 답이 없어요.
하지만 구글시트는 배열을 다루는 함수들이 배열 리턴값을 처리 가능해서, 2차원 배열을 간단히 결과로 뽑아내죠.
(MAP으로 2차원 배열을 문제없이 뽑아내는 구글시트의 모습)
이 문제는 엑셀 함수만으론 답이 없는 경우가 있어서... 그럴 땐 다른 방법(구글시트 혹은 스크립트 등)을 쓰는게 낫습니다.
(혹은 MAKEARRAY로 기적의 XX쇼를 하는 방법도 있지만ㅋㅋ 정말 크게 돌아가는 우회방법이죠)
REDUCE 같은 함수의 결과값도, 누적값을 배열로 만들 경우, 구글시트는 의도한대로 정확하게 결과가 나옵니다.
하지만 엑셀은? 엑셀은 REDUCE 누적값으로 배열을 만들면 그냥 버그 터져요.;; 엑셀에선 이런식으로 아예 못써먹습니다.
예를 들면,
=REDUCE("",A1:A4,LAMBDA(a,c,IF(a="",VSTACK(c,""),VSTACK(a,c,""))))
이렇게 누적값에 1칸씩 공백을 주면서 붙여나가는 수식을 엑셀에 적어보면,
이렇게됩니다.
하지만 구글시트는 의도한대로 잘 나오죠.
2-1. TEXTSPLIT 함수 역시 엑셀은 빈약합니다
TEXTSPLIT은 텍스트를 특정한 기호로 나누는 함수인데 (엑셀 메뉴에 있는 '텍스트나누기'의 함수 버전)
단일 텍스트는 편리하게 잘 나눠주지만, 텍스트 목록을 배열로 받기 시작하면, 위에 말한 '배열을 리턴하지 못하는 문제' 때문에
TEXTBEFORE 함수처럼 작동해버립니다. 뒷부분은 다 버리는거죠.
이것도 참 어처구니가 없어요. ㅋㅋ
만약 이 문제를 해결하기위해 MAP함수를 이용해서 배열을 하나씩 뜯어다가 TEXTSPLIT에 넣어준다면?
역시 MAP함수가 배열리턴을 처리 못하기 때문에 터져버립니다. ㅋㅋㅋ
물론 구글시트에서 같은 기능을 하는 함수 SPLIT은 배열로 입력 받아도 문제없이 처리 가능해요.
분명 엑셀은
LET, CHOOSEROWS(COLS), DROP, TAKE, EXPAND, TOCOL(ROW), EXPAND, TEXTSPLIT의 세로 나누기 추가
같은 아직 구글시트엔 없는 추가 함수들이 몇 가지 더 있어서 간단한 수식의 편의성 면에서는 더 좋은데,
함수를 여러개 섞어서 응용하다보면, 엑셀함수 자체의 문제 때문에 '지나가지 못하는 벽'이 생깁니다.
반면 구글시트는 위에 언급된 일부 엑셀 추가 함수들이 없긴 하지만
(구글시트에 위 함수명들이 예약이 된 걸 보면, 구글시트에도 조만간 추가될 것으로 보입니다..)
저 기능들은 충분히 동일하게 구현 가능합니다. 미리 만들어서 네임드 펑션으로 지정해놓으면 쓰기도 편하죠.
아무튼 저것들은 직접 구현해야 한다는게 좀 귀찮긴 하지만, 어쨌든 구글시트는 '안 되는 것'은 없어요.
그리고 엑셀은 정규표현식 지원 함수가 하나도 없다는 것 역시 많이 아쉬운 점이죠.
텍스트 처리는 분명 엑셀에서 많이 하는 작업일텐데, 기초적인 MID 같은 위치 기반 커팅 함수와 그나마 최근에 추가된 TESTSPLIT가 전부
그래도 엑셀의 LET함수는 진짜 편하긴 합니다. ㅋㅋㅋ 이녀석 때문에 엑셀수식이 더 선호될 정도..
이걸 구글시트에서 똑같이 사용하려면, 람다함수 늘어지는 모습이 마치 무한 콜백지옥처럼 나와버리거든요. 수식이 진짜 너덜너덜해져서 가독성 똥망 ㅋㅋ
간단 요약:
엑셀에서 본격적으로 배열을 다루는 람다지원 함수들은 간단하게 사용할 땐 구글시트와 차이가 없지만, 뭔가 여러가지를 섞다보면 엑셀 자체의 버그와 한계로 답이 안 나오기 때문에,
뭔가 이상하다 싶을 땐 엑셀에서 씨름하지 말고(수식의 논리 문제가 아니라 엑셀의 문제일 가능성이 있으니), 구글시트에서 같은 수식을 작성해 보세요. ㅋㅋ