- 최초 작성일: 2002-02-19
- 최종 수정일: 2026-09-30
- 조회수: 12 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 영문자만 골라내기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
실로 오랜만에 강좌 파일을 올립니다. 놀 땐 놀고, 쉴 땐 쉬기 위해(같은 말이군요 ^^) 기왕 쉬는 김에 거의 일주일을 과감하게 쉬었습니다. 새해 福은 많이들 받으셨나요?
바야흐로 졸업 시즌입니다. 우리말로 卒業은 말 그대로 학업을 마치는 것이지만 영어로는 Commencement 입니다(물론 graduation이라는 표현을 쓰기도 하지만…). '졸업(Graduation)'은 곧, '새로운 시작(Commencement)'이라는 의미입니다. 우리 한글이야 두말할 것도 없이 아주 과학적인 언어인데… 영어는 참으로 합리적인 언어라는 생각이 새삼 들게하는 대목입니다.
졸업을 맞이하신 많은 분들, 졸업을 진심으로 축하합니다. 하지만 얼마 후에 사회에 나와서는 엑셀(& VBA)을 모르고서는 원활한 업무처리는 물론, 선배들과 의사 소통이 잘 안될 것이므로 틈틈히 익혀두시기 바랍니다.
영문자만 골라내기
핵심 요약: 아스키 코드로 영문자 판별하기
Mid로 문자를 하나씩 떼어 Asc로 코드 값을 구한 뒤 65~90, 97~122 범위인 문자만 모으면 영문자만 골라낼 수 있습니다.
- 1단계: UsedRange의 셀을 하나씩 순환하며 문자열 길이만큼 반복합니다.
- 2단계: Mid와 Asc로 각 문자의 아스키 코드 값을 구합니다.
- 3단계: A~Z, a~z 범위의 문자만 strTemp에 모아 새 시트에 옮깁니다.
Step 1: 이번 시간의 메일 한 통
메일 하나
안녕하십니까
명쾌한 해답을 얻고자 이렇게 MAIL을 띄웁니다.
txt화일로 된 영어단어장이 있습니다.
영어단어가 한줄로 쭈욱 있고 같은 행으로 영영으로 영어단어의 뜻이 있고
영영 바로 뒤에 영어단어의 한글뜻이 붙어 있습니다.
그런데 운좋게도 영어단어와 영영은 TAB으로 처리되어 있어서
EXCEL로 읽어 들이면서 분리가 가능했습니다.
즉 영어단어 한 열, 영영+한글뜻이 한 열, 모두 두 열이 되었습니다.
그러나 문제는 바로 여기서 발생했습니다.
영영+한글뜻을 분리하려고 보니 여기에는 전혀 TAB처리가 되어 있지 않았고
영영+한글뜻에는 쉼표(,)와 공백밖에 없지만 그래도 분리를 하려고
공백과 쉼표로 분리시도를 했는데 잘 안 되더군요.
그래서 영영+한글뜻열에서 "바꾸기 ; ctrl+H "를 시도했습니다.
즉 a, b, c, d등 모든 알파벳을 "공백(스페이스는 아님)"으로 바꾸니까
쉼표는 남지만 한글만을 어설프게 분리해낼 수는 있더군요.
그런데 이 "바꾸기"기능에서 한글은 전혀 바꾸기가 안 되더군요.
즉 "가"를 "나"로 바꿀 수는 있어도 "ㄱ"을 "ㄴ"으로 바꿀 수는 없더라구요.
그래서 "iextrct"라는 "사용자 정의함수"를 사용했어요.
문자열에서 숫자, 영어, 한글을 추출해내는 함수지요. 그런데 이 함수는 띄어쓰기나
쉼표등은 무시하고 분리를 하더라구요. 이런 모양을 원한 것은 아니었는데…
잘 정리된 강의를 부탁드립니다.
인천에서 한결이 아빠
엑셀을 아주 다양한 용도로 잘 활용하고 계시는군요. 누가 만들었는지 모르겠지만 스프레드시트(Spreadsheet)라는 용어, 우리말로 "표계산 프로그램"이라는 단어는 별로 마음에 들지 않습니다. 이런 해괴한(?) 이름을 붙여 놓으니까 엑셀이라고 하면,
"아~ 그거, 복잡한 숫자를 많이 다루는 사람들이나 사용하는 프로그램이지!"
이런 선입견을 가지게 되는 것이지요. 하여튼 아래의 버튼을 누르면 현재 시트 내에서 알파벳만 모조리 골라서 새로운 시트로 옮겨줍니다.
잘 되지요? 코드를 보시기 전에 머리 속으로 작업 순서를 한번 떠올려 보세요. 어떤 오브젝트나 프로퍼티, 메서드를 사용할 것인가가 떠오르면 좋겠지만 단순히 시나리오만 짜 보는 것도 괜찮습니다.
Step 2: ExtractAlphabet 프로시저
Sub ExtractAlphabet()
Dim rngSource As Range
Dim rngCell As Range
Dim rngTarget As Range
Dim i As Integer
Dim j As Integer
Dim intLen As Integer
Dim intCode As Integer
Dim shtTarget As Worksheet
Dim shtSheet As Worksheet
Dim strTemp As String
Dim strChar As String
Set shtSheet = Sheets("Preface")
Set rngSource = shtSheet.UsedRange
Set shtTarget = Worksheets.Add
Set rngTarget = shtTarget.Columns(1)
'''필요한 변수와 타입, 즉 등장인물과 배역을 설정해 주었습니다.
For Each rngCell In rngSource
If IsError(rngCell.Value) Then GoTo NextCell
'''rngSource는 현재 시트의 UsedRange가 지정되어 있습니다. 따라서 Preface 시트 내에서
'''사용된 영역의 셀을 하나씩 돌아가면서 검색을 하는 것입니다.
intLen = Len(rngCell)
For i = 1 To intLen
'''셀을 하나씩 검색할 때 그냥 검색하는 것이 아니라 각 셀에 들어있는 문자열 정보를
'''하나씩 조사를 합니다. 무슨 조사냐구요? 각각의 문자가 한글인지 알파벳인지를 일단
'''알아야 나중에 어디로 옮겨도 옮기겠지요?
strChar = Mid(rngCell, i, 1)
intCode = Asc(strChar)
If (intCode >= 65 And intCode <= 90) Or (intCode >= 97 And intCode <= 122) Then _
strTemp = strTemp & strChar
'''이 부분이 오늘의 핵심입니다. 65, 90 등과 같은 숫자는 어디 하늘에서 떨어진 것일까요?
'''컴퓨터는 모든 것을 숫자로 받아들입니다. 한글이나 한자, 영어는 물론이고 심지어는
'''그림이나 소리까지도 말입니다.
'''65라는 것은 대문자 A, 90은 대문자 Z에 해당하는 아스키 코드 값입니다.
'''그것을 어떻게 알 수 있느냐구요? 워크시트 함수 중에 Char 이라는 것이 있습니다.
'''이것은 코드 번호에 해당하는 문자열을 알려주는 함수인데… 확인을 해 볼까요?
'''아래의 회색 셀에 1~255 사이의 숫자값을 넣어 보세요.
'''따라서 영어 대문자 A~Z, 소문자 a~z 값일 경우에만 strTemp 변수에 차곡차곡 담습니다.
Next i
rngTarget.Cells(1).Offset(j) = strTemp
'''알파벳만 다 골라 낸 다음 새로 삽입한 시트에 뿌려 줍니다.
If Len(strTemp) > 0 Then j = j + 1
strTemp = ""
NextCell:
Next rngCell
rngTarget.Columns.AutoFit
End Sub
필요한 변수와 타입, 즉 등장인물과 배역을 설정해 주었습니다. rngSource는 현재 시트의 UsedRange가 지정되어 있으므로 Preface 시트 내에서 사용된 영역의 셀을 하나씩 돌아가면서 검색을 합니다. 그냥 검색하는 것이 아니라 각 셀에 들어있는 문자열 정보를 하나씩 조사를 합니다. 무슨 조사냐구요? 각각의 문자가 한글인지 알파벳인지를 일단 알아야 나중에 어디로 옮겨도 옮기겠지요?
Step 3: 오늘의 핵심, 아스키 코드
이 부분이 오늘의 핵심입니다. 65, 90 등과 같은 숫자는 어디 하늘에서 떨어진 것일까요? 컴퓨터는 모든 것을 숫자로 받아들입니다. 한글이나 한자, 영어는 물론이고 심지어는 그림이나 소리까지도 말입니다. 65라는 것은 대문자 A, 90은 대문자 Z에 해당하는 아스키 코드 값입니다. 그것을 어떻게 알 수 있느냐구요? 워크시트 함수 중에 Char 이라는 것이 있습니다. 이것은 코드 번호에 해당하는 문자열을 알려주는 함수인데… 확인을 해 볼까요? 아래의 셀에 1~255 사이의 숫자값을 넣어 보세요.
| 숫자값 | =CHAR(숫자값) |
|---|---|
| 65 | A |
따라서 영어 대문자 A~Z, 소문자 a~z 값일 경우에만 strTemp 변수에 차곡차곡 담습니다. 알파벳만 다 골라 낸 다음 새로 삽입한 시트에 뿌려 줍니다.
Step 4: 숙제
엄청 간단하지요? 거~ 뭐, 쉽구만. 아무 것도 아니네. 이런 생각에 하산 하시려는 분들을 위해 숙제를 내어 드리겠습니다. ^^
우선, 질문하신 분의 경우, 영한 사전의 내용을 분리하는데 위의 코드를 사용하면 공란이나 콤마 등이 모두 제거되어 버리므로 띄어쓰기가 전혀 되지 않을 것입니다. 이것을 해결해 보세요. 힌트를 드리자면… 콤마는 아스키 코드값이 44, 공란은 32 입니다.
그리고 또 한가지! 셀 하나 검사하고 결과값을 워크시트에 옮기고, 또 다음 셀 검사하고 워크시트에 옮기고… 이렇게 매번 메모리 변수와 워크시트 사이를 왔다갔다 하면서 작업하는 방법은 그다지 효율적이지 못합니다. 배열을 사용하여 값을 차례대로 담아 두었다가 맨 마지막에 한꺼번에 좌악 워크시트로 옮기는 방법을 연구해 보세요.
오늘은 여기까지…
정리 — 영문자 추출 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 새 시트 | Worksheets.Add | 추출 결과를 담을 시트 |
| 문자 추출 | Mid(rngCell, i, 1) | 한 글자씩 분리 |
| 코드 값 | Asc(strChar) | 아스키 코드 값 |
| 영문자 판별 | 65~90 또는 97~122 | A~Z, a~z 범위 |
| 결과 기록 | rngTarget.Cells(1).Offset(j) = strTemp | 골라낸 문자열 출력 |
자주 묻는 질문 (FAQ)
Q1. 65와 90은 무슨 값인가요?
각각 대문자 A와 Z의 아스키 코드 값입니다. 소문자 a~z는 97~122입니다.
Q2. 아스키 코드 값은 어떻게 확인하나요?
워크시트 함수 CHAR에 1~255 사이의 숫자를 넣으면 해당 코드의 문자를 알 수 있습니다.
Q3. 쉼표나 공백을 살리려면 어떻게 하나요?
쉼표는 아스키 코드 값이 44, 공란은 32이므로 조건에 이 값도 포함시키면 됩니다.
마치며
엑셀은 복잡한 숫자만 다루는 프로그램이 아니라 문자열 처리까지 아주 다양한 용도로 활용할 수 있습니다.