- 최초 작성일: 2001-09-29
- 최종 수정일: 2026-09-30
- 조회수: 6 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 문자열 분리하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이 세상은 참으로 재미있는 곳이라는 생각이 듭니다. Excel이 좋아서, 다른 사람과 경험을 공유하는 것이 좋아서 무작정 시작한 일이 어떻게 하다 보니 이제는 책까지 내게 되었으니까 말입니다. *^^* 자신과 비슷한 생각을 하는 사람들이 있고, 자신의 경험을 그들과 공유한다는 것이 얼마나 즐겁고 신나는 것인지는 해보지 않은 사람은 아마 모를 것입니다. 모쪼록 여러분들도 자신의 경험을 다른 사람과 함께하는 기쁨을 누리시기를 바랍니다.
낼 모레가 추석이군요. 고향에 잘들 다녀오시고 즐겁게 보내시기를 진심으로 기원합니다.
문자열 분리하기
핵심 요약: 문자열 분리 원리와 자동화
구분 문자의 위치를 찾고 그 앞뒤를 잘라 내는 방식으로 이름과 전화번호를 분리하며, VBA에서는 InStr 함수로 같은 작업을 반복합니다.
- 1단계: FIND 함수로 "(" 위치를 찾습니다.
- 2단계: LEFT와 RIGHT 함수로 이름과 전화번호를 잘라 냅니다.
- 3단계: VBA에서는 InStr, Left, Right로 순환문을 돌며 나누어 담습니다.
Step 1: 이번 시간의 질문
…()안에 숫자만 잘라서 구하기 함수인데 아무리 생각해도 이해가 안 가네요.
혹시 조금 쉽게 설명해 주실 수 있는지요? 부탁합니다.
특히 마지막 Find 함수가 이해가 안가네요.=MID(A1,FIND("(",A1)+1,FIND(")",A1)-FIND("(",A1)-1)
언젠가 강좌시간에 설명을 드린 것 같은데… 몇 회에서 였는 지 잘 기억이 나지 않습니다. 누구 찾으신 분 좀 알려주시기 바랍니다. Remind하기 위해서 다시 알아보도록 하지요. 일단 예제 데이터를 만듭니다.
예제 데이터 펼쳐 보기 (Source Data / Name / Phone)
| Source Data | Name | Phone |
|---|---|---|
| 이순신(051)123-2456 | 이순신 | (051)123-2456 |
| 박경근(02)222-2225 | 박경근 | (02)222-2225 |
| 박유진(02)333-1485 | 박유진 | (02)333-1485 |
| 권예지(02)555-1574 | 권예지 | (02)555-1574 |
| 권율(031)123-1212 | 권율 | (031)123-1212 |
| 최지혜(063)787-1298 | 최지혜 | (063)787-1298 |
| 최지웅(053)123-4567 | 최지웅 | (053)123-4567 |
| 주병규(051)987-1258 | 주병규 | (051)987-1258 |
| 나도몰라(031)946-4527 | 나도몰라 | (031)946-4527 |
| 주정은(051)321-4577 | 주정은 | (051)321-4577 |
| 유필화(02)545-6577 | 유필화 | (02)545-6577 |
Name과 Phone 부분에는 아래와 같은 수식이 사용되었습니다.
Name: =LEFT(B31,FIND("(",B31)-1)
Phone: =RIGHT(B31,LEN(B31)-FIND("(",B31)+1)
Step 2: FIND 함수 이해하기
Find 함수는 텍스트 중에서 지정한 문자열의 위치를 리턴해 주는 함수입니다. 예를 들어 어느 셀에 "Digital dream Company"라는 데이터가 있을 경우,
=FIND("d",B51) → 9
=FIND("D",B51) → 1
(B51 셀에는 "Digital dream Company"가 들어 있습니다.)
이와 같이 사용자가 검색하고자 하는 문자열의 위치를 알려주는 것입니다. 이 때 대소문자를 구분해서 검색한다는 사실에 주의하시기 바랍니다.
그렇다면 이제 위의 Name과 Phone 부분에 들어있는 수식을 이해하시겠지요? (부호를 기준으로 이름과 전화번호가 구분되어 있으니까 Find 함수로 위치를 먼저 찾은 다음 Left나 Right와 같은 문자열 함수를 사용하여 발췌를 하면 됩니다. 그래도 수식이 잘 이해가 안되는 분은 수식의 범위를 지정하신 다음 <F9>키를 눌러 즉석 수식 계산 기능을 사용해 보세요.
Step 3: VBA로 자동화하기 (SeparateString)
그런데 가만히 보니까 이번 강좌가 EXCEL 강좌가 아니라 VBA 강좌이지요? 해서 위에서 설명드린 것을 VBA로 자동화시켜 보도록 하겠습니다. 버튼을 눌러 보세요.
코드를 보도록 합니다. 몇 줄 안되는 아주 짧은 코드입니다.
Sub SeparateString()
Dim rngCell As Range, rngTarget As Range
Dim strName As String, strPhone As String
Set rngTarget = Range([Start], [Start].End(xlDown))
'''등장 인물과 배역을 설정해 줍니다. 소스 데이터의 첫번째 셀에 Start라는 이름을 미리
'''정의해 두었습니다. 이름을 정의해 두고 사용하면 여러 모로 편리하므로 여러분들도
'''특별히 바쁜 일이 없는 한 이름을 정의하는 습관을 기르시기 바랍니다. ^^
[Contents].ClearContents
MsgBox "내용을 모두 지웠습니다. 이제 이름과 전화번호를 분리합니다!", , "작업 개시//By Exceller"
'''Contents도 마찬가지입니다. 이름과 전화번호가 들어갈 부분에 이름을 정의해 두었습니다.
'''Contents라는 영역에 있는 내용들을 모두 지웁니다.
For Each rngCell In rngTarget
If InStr(rngCell, "(") > 0 Then
strName = Left(rngCell, InStr(rngCell, "(") - 1)
strPhone = Right(rngCell, Len(rngCell) - InStr(rngCell, "(") + 1)
rngCell.Offset(0, 2) = strName
rngCell.Offset(0, 3) = strPhone
End If
'''이제 순환문을 돌면서 이름과 전화번호를 구분합니다. 위에서 워크시트 상에서
'''구분할 때 Find 함수를 사용하였었지요? 코드에서도 이 방법을 그대로 사용합니다.
'''그런 다음에 셀에 나누어 담으면 되는 것이지요. 워크시트 상에서 할 때와 하나도
'''다를 것이 없습니다.
Next rngCell
MsgBox "작업을 완료하였습니다. 잘 되지요?", , "작업 종료//By Exceller"
End Sub
마무리
오늘은 여기까지…
정리 — 문자열 분리 핵심
| 구분 | 워크시트 수식 | VBA 코드 |
|---|---|---|
| 위치 찾기 | FIND("(", B31) | InStr(rngCell, "(") |
| 이름 분리 | LEFT(B31, FIND("(",B31)-1) | Left(rngCell, InStr(rngCell, "(") - 1) |
| 전화번호 분리 | RIGHT(B31, LEN(B31)-FIND("(",B31)+1) | Right(rngCell, Len(rngCell) - InStr(rngCell, "(") + 1) |
| 대소문자 | FIND는 대소문자를 구분 | InStr 기본은 구분(vbBinaryCompare) |
| 영역 지정 | 이름 정의 Start, Contents | [Start], [Contents] |
자주 묻는 질문 (FAQ)
Q1. 괄호 안의 숫자만 잘라 내는 수식은 어떻게 이해하나요?
FIND로 여는 괄호와 닫는 괄호의 위치를 각각 찾고, MID 함수로 그 사이의 글자 수만큼 가져오는 것입니다.
Q2. FIND 함수는 대소문자를 구분하나요?
네, 구분합니다. "d"와 "D"는 서로 다른 문자로 취급되어 위치가 다르게 반환됩니다.
Q3. 수식이 잘 이해되지 않을 때는 어떻게 하나요?
수식의 일부를 범위로 지정하고 F9 키를 눌러 즉석 수식 계산 기능으로 각 부분의 결과를 확인해 보세요.
마치며
워크시트 수식의 원리를 그대로 VBA로 옮기면 문자열 분리 작업을 한 번에 자동화할 수 있습니다.