• 최초 작성일: 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

이 자료들 중에서 특정한 위치에 있는 단어들을 추려내야 한다면 여러분은 어떻게 하시겠습니까?

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

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

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


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

특정위치 단어 추출하기

핵심 요약: 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-11354-89
아무도 미워하지 않는 자의 죽음2(공백)미워하지
고도를 기다리며 사뮤엘 베케트2(공백)기다리며
111,222,333,444,555,66,777775,555
Time/And/Tide/Waits/Nobody3/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. 데이터-텍스트 나누기와 어떤 점이 다른가요?

텍스트 나누기는 한 번만 실행하는 작업이지만 함수는 원본이 바뀌어도 수식으로 결과를 다시 계산합니다.

마치며

구분자를 세는 간단한 순환문만으로 어떤 문자열에서든 원하는 위치의 단어를 뽑아내는 함수를 만들 수 있습니다.