• 최초 작성일: 2005-08-11
  • 최종 수정일: 2026-09-26
  • 조회수: 21 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 숫자 데이터만 추려내기2

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

문자열과 수식이 뒤섞여 있는 자료가 있는데, 여기서 숫자 데이터만 추출해 낼 수

없겠는가 하는 질문을 가끔 받곤 합니다(잊을만 하면 한번씩 받습니다. 해서...

잊어 먹을래야 그럴 수 없다는 장점이 있습니다. ^^)

X0107 강좌에서 VBA를 사용하여 간단히 해결하는 방법을 알려드렸는데…

VBA는 복잡하니까 수식이 좀 길어지더라도 엑셀 함수로 해결하는 방법을

알려주세요!

라고 하시는 분들이 계십니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 지음

📊 신간 전자책(PDF) · 287쪽 · 13500원

엑셀 대시보드를 만드는 최적의 '표준 3계층 구조'

  • 3초 안에 읽히는 화면 설계 감각 습득
  • Microsoft Excel MVP의 실전 노하우 수록
  • 중간마진 없는 합리적인 가격, 오직 아이엑셀러에서만!
지금 구매하기 완성 화면 보기

숫자 데이터만 추려내기2

핵심 요약

  • 문자열과 숫자가 섞인 데이터에서 숫자만 추출하는 방법을 비교합니다.
  • 함수만으로 처리하는 배열 수식의 구조를 네 부분으로 나누어 살펴봅니다.
  • 숫자가 연속적이지 않은 경우의 한계와 다른 해법도 확인합니다.

문자열과 수식이 뒤섞여 있는 자료가 있는데, 여기서 숫자 데이터만 추출해 낼 수

없겠는가 하는 질문을 가끔 받곤 합니다(잊을만 하면 한번씩 받습니다. 해서...

잊어 먹을래야 그럴 수 없다는 장점이 있습니다. ^^)

X0107 강좌에서 VBA를 사용하여 간단히 해결하는 방법을 알려드렸는데…

VBA는 복잡하니까 수식이 좀 길어지더라도 엑셀 함수로 해결하는 방법을

알려주세요!

라고 하시는 분들이 계십니다.

<표 1> 사용자 정의 함수 예제

대상 문자숫자 추출
abc123de=숫자만(B20)
kor4567=숫자만(B21)
zd70365ppr=숫자만(B22)
798stadi=숫자만(B23)
129adbd=숫자만(B24)
15tntar=숫자만(B25)
yuri1113=숫자만(B26)
oew 133tni=숫자만(B27)
m 9973xa=숫자만(B28)

함수만으로 숫자 추출하기

물론 엑셀의 함수들만을 조합해도 가능은 합니다!

숫자를 추출하기 위해 사용한 사용자 정의 함수는 이러했는데… 함수만 사용하면

이것보다 간단히 해결할 수 있을 것인지 확인해 보도록 하지요.

함수만 사용한 예제

대상 문자숫자 추출 ← 함수만 사용(1)
abc123de=MID(B38,MATCH(TRUE(),ISNUMBER(1*MID(B38,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B38,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
kor4567=MID(B39,MATCH(TRUE(),ISNUMBER(1*MID(B39,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B39,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
zd70365ppr=MID(B40,MATCH(TRUE(),ISNUMBER(1*MID(B40,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B40,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
798stadi=MID(B41,MATCH(TRUE(),ISNUMBER(1*MID(B41,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B41,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
129adbd=MID(B42,MATCH(TRUE(),ISNUMBER(1*MID(B42,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B42,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
15tntar=MID(B43,MATCH(TRUE(),ISNUMBER(1*MID(B43,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B43,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
yuri1113=MID(B44,MATCH(TRUE(),ISNUMBER(1*MID(B44,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B44,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
oew 133tni=MID(B45,MATCH(TRUE(),ISNUMBER(1*MID(B45,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B45,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
m 9973xa=MID(B46,MATCH(TRUE(),ISNUMBER(1*MID(B46,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B46,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))

배열 수식 살펴보기

보시는 것처럼 엑셀의 여러 가지 함수를 조합해도 가능은 합니다.

위의 빨간색 셀에는 이런 수식이 들어있습니다.

{=MID(B38,MATCH(TRUE,ISNUMBER(1*MID(B38,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),

이 수식(배열 수식)을 보니 어떤 생각이 드십니까?

VBA로 해결할 문제를 함수를 사용해서 해결을 하고 보니 거기서 쾌감을 느끼실

분도 전혀 없지는 않겠습니다만... 저는 억장이 무너져 내리는군요. ^^;

이것은 Microsoft Online 도움말에 있는 것을 일부 수정한 것입니다.

이 수식은 크게 4개의 부분으로 나누어 살펴볼 수 있습니다.

'복잡한 수식은 항상 맨 안쪽부터, 토막을 내서 살펴본다!'… 는 규칙 아시지요?

대상 영역 중에서 가장 긴 문자열이 어느 셀인지를 파악한 다음,

데이터를 개별 문자 단위로 분해합니다.

각각의 문자열이 숫자인지 아닌지 파악합니다.

수식 입력줄에서 이 부분을 범위로 지정하고 <F9> 키를 눌러보면

{FALSE;FALSE;FALSE;TRUE;TRUE;TRUE;FALSE;FALSE;FALSE;FALSE}

라고 표시되는데, 분리된 문자열이 숫자이면 True, 그렇지 않으면 False로

표현된 것입니다.

문자열 중에서 숫자가 시작되는 위치를 파악합니다.

문자열 중에서 숫자가 몇 개인지 파악합니다.

이상의 결과값을 Mid 함수를 사용하여 최종적으로 조합하면 우리가 원하는

결과값이 구해지는 것입니다.

숫자가 연속적이지 않은 경우

그런데 이 수식도 약간의 문제점을 가지고 있습니다. 즉, 다음과 같이 대상 문자에

숫자가 연속적이지 않을 경우에는 제대로 숫자를 걸러내지 못합니다.

숫자가 연속적이지 않은 경우

대상 문자숫자 추출
abc123de45=MID(B88,MATCH(TRUE(),ISNUMBER(1*MID(B88,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B88,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
kor4567=MID(B89,MATCH(TRUE(),ISNUMBER(1*MID(B89,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B89,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
10zd70365ppr=MID(B90,MATCH(TRUE(),ISNUMBER(1*MID(B90,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B90,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
798stadi=MID(B91,MATCH(TRUE(),ISNUMBER(1*MID(B91,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B91,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
129adbd=MID(B92,MATCH(TRUE(),ISNUMBER(1*MID(B92,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B92,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
15tntar=MID(B93,MATCH(TRUE(),ISNUMBER(1*MID(B93,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B93,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
yuri1113=MID(B94,MATCH(TRUE(),ISNUMBER(1*MID(B94,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B94,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
o1ew 133tni=MID(B95,MATCH(TRUE(),ISNUMBER(1*MID(B95,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B95,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))
m 99-73xa=MID(B96,MATCH(TRUE(),ISNUMBER(1*MID(B96,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)),0),COUNT(1*MID(B96,ROW(INDIRECT("1:"&MAX(LEN($B$38:$B$46)))),1)))

다른 해법 살펴보기

엑사모에서 '허허허'님이 다음과 같이 해법을 주셨더군요.

엑사모에서 제시한 해법

대상 문자숫자 추출
abc123de45=MID(SUM(MID("01"&B102,LARGE(IF(ISNUMBER(MID("01"&B102,ROW($1:$100),1)*1),ROW($1:$100),1),ROW($1:$100)),1)*POWER(10,ROW($1:$100)-1)),2,100)
kor4567=MID(SUM(MID("01"&B103,LARGE(IF(ISNUMBER(MID("01"&B103,ROW($1:$100),1)*1),ROW($1:$100),1),ROW($1:$100)),1)*POWER(10,ROW($1:$100)-1)),2,100)
10zd70365ppr=MID(SUM(MID("01"&B104,LARGE(IF(ISNUMBER(MID("01"&B104,ROW($1:$100),1)*1),ROW($1:$100),1),ROW($1:$100)),1)*POWER(10,ROW($1:$100)-1)),2,100)
798stadi=MID(SUM(MID("01"&B105,LARGE(IF(ISNUMBER(MID("01"&B105,ROW($1:$100),1)*1),ROW($1:$100),1),ROW($1:$100)),1)*POWER(10,ROW($1:$100)-1)),2,100)
129adbd=MID(SUM(MID("01"&B106,LARGE(IF(ISNUMBER(MID("01"&B106,ROW($1:$100),1)*1),ROW($1:$100),1),ROW($1:$100)),1)*POWER(10,ROW($1:$100)-1)),2,100)
15tntar=MID(SUM(MID("01"&B107,LARGE(IF(ISNUMBER(MID("01"&B107,ROW($1:$100),1)*1),ROW($1:$100),1),ROW($1:$100)),1)*POWER(10,ROW($1:$100)-1)),2,100)
yuri1113=MID(SUM(MID("01"&B108,LARGE(IF(ISNUMBER(MID("01"&B108,ROW($1:$100),1)*1),ROW($1:$100),1),ROW($1:$100)),1)*POWER(10,ROW($1:$100)-1)),2,100)
o1ew 133tni=MID(SUM(MID("01"&B109,LARGE(IF(ISNUMBER(MID("01"&B109,ROW($1:$100),1)*1),ROW($1:$100),1),ROW($1:$100)),1)*POWER(10,ROW($1:$100)-1)),2,100)
m 99-73xa=MID(SUM(MID("01"&B110,LARGE(IF(ISNUMBER(MID("01"&B110,ROW($1:$100),1)*1),ROW($1:$100),1),ROW($1:$100)),1)*POWER(10,ROW($1:$100)-1)),2,100)

자, 어떤 방법이 더 간단합니까?

이참에 VBA를 배워야겠다는 생각이 팍(!) 드시지요? 그렇다면 오늘 강좌의 목적 달성!!

오늘은 여기까지…

마치며

문자열 속 숫자만 추출하는 여러 가지 방법을 비교해 보았습니다. 함수만으로 해결할 수도 있지만 수식이 복잡해질 수 있으므로, 원래 목적에 맞는 방법을 선택하는 것이 중요합니다.