- 최초 작성일: 2005-08-11
- 최종 수정일: 2026-09-26
- 조회수: 21 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 숫자 데이터만 추려내기2
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
문자열과 수식이 뒤섞여 있는 자료가 있는데, 여기서 숫자 데이터만 추출해 낼 수
없겠는가 하는 질문을 가끔 받곤 합니다(잊을만 하면 한번씩 받습니다. 해서...
잊어 먹을래야 그럴 수 없다는 장점이 있습니다. ^^)
X0107 강좌에서 VBA를 사용하여 간단히 해결하는 방법을 알려드렸는데…
VBA는 복잡하니까 수식이 좀 길어지더라도 엑셀 함수로 해결하는 방법을
알려주세요!
라고 하시는 분들이 계십니다.
숫자 데이터만 추려내기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를 배워야겠다는 생각이 팍(!) 드시지요? 그렇다면 오늘 강좌의 목적 달성!!
오늘은 여기까지…
마치며
문자열 속 숫자만 추출하는 여러 가지 방법을 비교해 보았습니다. 함수만으로 해결할 수도 있지만 수식이 복잡해질 수 있으므로, 원래 목적에 맞는 방법을 선택하는 것이 중요합니다.