- 최초 작성일: 2001-05-24
- 최종 수정일: 2026-09-30
- 조회수: 17 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 특정위치 단어 추출하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 강좌에서는 특정한 위치에 있는 단어를 추출하는 사용자 정의 함수를 만들어 보도록 하겠습니다. 특정 위치의 단어를 추출한다는 것이 도대체 무슨 소리냐구요? 아래와 같은 자료들이 있다고 가정합니다.
- 123-456-7-89-0-1135
- 아무도 미워하지 않는 자의 죽음
- 고도를-기다리며-사뮤엘-베케트
- 111,222,333,444,555,66,77777
- Time/And/Tide/Waits/Nobody
이 자료들 중에서 특정한 위치에 있는 단어들을 추려내야 한다면 여러분은 어떻게 하시겠습니까?
특정위치 단어 추출하기
핵심 요약: ExtractWord 함수
문자열, 추출 위치, 구분자 세 인수를 받아 구분자를 세면서 n번째 단어를 돌려주는 사용자 정의 함수입니다.
- 1단계: 대상 문자열 끝에 구분자를 붙여 마지막 단어도 처리합니다.
- 2단계: 순환문에서 구분자를 만날 때마다 개수를 세고 단어를 모읍니다.
- 3단계: 개수가 추출 위치와 같아지면 모은 단어를 돌려줍니다.
Step 1: 기존 방법의 한계
아마 별의별 사람들이 다 있을 것입니다. ^^
- Substitute, Find, Search, Mid, Left, Right 함수 등을 이용하여 해결하려는 분
- VBA에 자신이 있다면 순환문과 InStr 함수를 사용하여 해결을 시도하는 분
- '데이터-텍스트 나누기' 메뉴를 사용하는 분
어떤 방법을 사용하든 힘은 들겠지만 해결은 할 수 있습니다. 하지만 그 어느 방법도 그다지 융통성있는 방법은 되지 못하리란 생각이 듭니다. 그래서 이 문제를 해결할 수 있는 사용자 정의 함수를 한번 만들어 보았습니다(사실은 Walkenbach 아저씨의 코드를 베껴다가 약간 수정을 한 것입니다. ^^).
Step 2: 실행 결과
| DATA | 추출 위치 | 구분자 | Results |
|---|---|---|---|
| 123-456-7-89-0-1135 | 4 | - | 89 |
| 아무도 미워하지 않는 자의 죽음 | 2 | (공백) | 미워하지 |
| 고도를 기다리며 사뮤엘 베케트 | 2 | (공백) | 기다리며 |
| 111,222,333,444,555,66,77777 | 5 | , | 555 |
| Time/And/Tide/Waits/Nobody | 3 | / | Tide |
수식은 =ExtractWord(B35,F35,G35)와 같이 입력합니다.
Step 3: ExtractWord 함수
코드는 이렇습니다.
Function ExtractWord(XXX, nth, separator) As String
Dim strText As String, strTemp As String
Dim i As Integer, intCount As Integer, intLen As Integer
strText = XXX
intLen = Len(strText)
'''우선 이 함수는 세 개의 인수를 넘겨받습니다. 첫번째 XXX는 추출하고자 하는 대상
'''문자열입니다. Nth는 몇 번째 단어를 추출할 것인지에 대한 정보를 담고 있고,
'''마지막에 있는 separator는 각 단어가 어떤 구분자에 의해 나뉘어져 있는지를
'''담고 있습니다.
If Right(strText, Len(separator)) <> separator Then strText = strText & separator
If separator = Chr(32) Then strText = Application.Trim(strText)
'''구분자가 공백
'''(Space)으로 되어있다면 문자열 좌우에 혹시 있을 지도 모르는 불필요한 공백을
'''제가합니다.
For i = 1 To intLen
If Mid(strText, i, Len(separator)) = separator Then
intCount = intCount + 1
If intCount = nth Then
ExtractWord = strTemp
Exit Function
Else
strTemp = ""
End If
Else
strTemp = strTemp & Mid(strText, i, 1)
End If
'''단어 수만큼 순환문을 돌면서 문자를 추출하는 작업을 합니다.
'''strTemp 변수에 한 글자씩 저장한 채 순환문을 돌다가 구분자의 위치가 지정한
'''nth와 같으면 결과를 돌려주고 그렇지 않으면 계속 순환합니다.
'''위와 같은 순환문의 구조를 파악하는 가장 좋은 방법은 종이를 한장 펼쳐놓고
'''실제 숫자를 대입해가면서 순환문을 몇 바퀴 돌려보는 것입니다.
Next i
ExtractWord = ""
End Function
마무리
오늘은 여기까지 하지요.
다음 시간에...
정리 — ExtractWord 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 인수 | XXX, nth, separator | 대상 문자열, 위치, 구분자 |
| 구분자 보정 | strText & separator | 마지막 단어 처리 |
| 공백 정리 | Application.Trim | 불필요한 공백 제거 |
| 구분자 세기 | intCount = intCount + 1 | 단어 위치 확인 |
| 결과 반환 | ExtractWord = strTemp | n번째 단어 |
자주 묻는 질문 (FAQ)
Q1. 구분자로 나뉜 문자열에서 특정 위치의 단어만 뽑으려면?
사용자 정의 함수로 구분자를 세면서 원하는 순서의 단어를 돌려주도록 만들면 됩니다.
Q2. 구분자가 공백일 때는 어떻게 처리하나요?
Application.Trim으로 문자열 좌우의 불필요한 공백을 제거합니다.
Q3. 데이터-텍스트 나누기와 어떤 점이 다른가요?
텍스트 나누기는 한 번만 실행하는 작업이지만 함수는 원본이 바뀌어도 수식으로 결과를 다시 계산합니다.
마치며
구분자를 세는 간단한 순환문만으로 어떤 문자열에서든 원하는 위치의 단어를 뽑아내는 함수를 만들 수 있습니다.