- 최초 작성일: 2001-09-11
- 최종 수정일: 2026-09-30
- 조회수: 15 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 특정위치 문자로 정렬하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
Exceller가 다니는 회사 창립기념일에, 외부 교육이 3일, 해서 지난 일주일을 화끈하게(?) 재꼈습니다. 이번 주도 교육 일정이 예정되어 있어 다시 한번 화끈하게(^^) 재낄 수 있을 것 같습니다.
특정위치 문자로 정렬하기
핵심 요약: 특정 위치 문자 기준 추출과 정렬
Mid 함수로 두 번째 글자가 입력한 값과 같은 데이터만 Result 위치로 추출하고 Sort 메서드로 정렬합니다.
- 1단계: Do~Loop로 숫자가 입력될 때까지 InputBox를 반복 표시합니다.
- 2단계: Mid(rngCell, 2, 1)이 입력값과 같은 데이터만 Offset으로 옮겨 적습니다.
- 3단계: 추출된 데이터가 있으면 Sort 메서드로 정렬하고 건수를 알립니다.
Step 1: 이번 시간의 질문
셀에 데이터가 들어 있습니다.
문제는 여러 정보가 한꺼번에 하나의 셀에 들어있다는 데 있습니다.
이것을 가지고 정렬을 하고 싶은데 첫번째 글자가 아닌 두번째 글자를 가지고
정렬을 할 수 있는지요?
매번 필요할 때마다 불쑥 찾아와서 질문만 드려 죄송스럽습니다.
꼭 좀 부탁드립니다.
예제를 보내주셨더라면 좋았을 것을… 일단 예제를 하나 만듭니다.
예제 데이터 펼쳐 보기 (제품 코드 / 거래처)
| 코드 | 거래처 |
|---|---|
| A1001-1001 | 거래처1 |
| A1001-1002 | 거래처2 |
| A1001-1003 | 거래처3 |
| A1101-1004 | 거래처4 |
| A3101-1005 | 거래처5 |
| A2111-1001 | 거래처6 |
| A2011-1002 | 거래처7 |
| A2011-1003 | 거래처8 |
| A2011-1004 | 거래처9 |
| A2211-1005 | 거래처10 |
| A3228-2135 | 거래처11 |
| A3228-2136 | 거래처12 |
| A3228-2137 | 거래처13 |
| A3228-2138 | 거래처14 |
| A3328-2139 | 거래처15 |
| B2315-4376 | 거래처16 |
| B2015-4377 | 거래처17 |
| B2015-4378 | 거래처18 |
| B2015-4379 | 거래처19 |
| B2115-4380 | 거래처20 |
| C1101-1001 | 거래처21 |
| C1201-1002 | 거래처22 |
| C1201-1003 | 거래처23 |
| C1301-1004 | 거래처24 |
| C1301-1005 | 거래처25 |
Start 이름은 B23 셀, Result 이름은 E31 셀에 정의되어 있습니다.
Step 2: SortnthLetter 프로시저
코드를 보도록 하지요.
Sub SortnthLetter()
Dim rngCell As Range
Dim rngTarget As Range, rngResult As Range
Dim strCriteria As String
Dim i As Integer
Dim blnOK As Boolean
Set rngTarget = Range([Start], [Start].End(xlDown))
Set rngResult = [Result]
'''등장 인물(변수)을 선언해 주고 두 개의 이름을 정의해 두었습니다.
'''이름 상자에서 Start와 Result가 어느 셀인지 확인해 보세요.
Do While Not blnOK
strCriteria = InputBox("제품 유형을 입력하세요!(1~3)", "숫자 입력//By Exceller")
If IsNumeric(strCriteria) Then
blnOK = True
ElseIf strCriteria = "" Then
MsgBox "아무 것도 입력하지 않으셨으므로 종료합니다", , "작업 종료//By Exceller"
Exit Sub
Else
MsgBox "숫자값을 입력하세요!!!", , "입력 오류//By Exceller"
End If
'''Do~Loop 순환문이 사용되었습니다. 만약 사용자가 숫자가 아닌 다른 데이터 타입을
'''입력하였을 경우, 계속 InputBox를 화면 상에 나타나도록 하기 위한 것입니다.
Loop
With rngResult
.CurrentRegion.ClearContents
For Each rngCell In rngTarget
If Mid(rngCell, 2, 1) = strCriteria Then
.Offset(i, 0) = rngCell
.Offset(i, 1) = rngCell.Offset(0, 1)
i = i + 1
End If
Next rngCell
'''사용자가 입력한 조건에 맞는 데이터를 화면 상에 뿌려주는 과정입니다.
'''별로 어려운 부분이 없으므로 해설은 생략…
End With
If Len(rngResult) > 0 Then
rngResult.CurrentRegion.Sort Key1:=rngResult, Order1:=xlAscending, Header:= _
xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
MsgBox i & "개의 자료를 추출하였습니다", , "작업 완료//By Exceller"
'''유효한 데이터가 있을 경우, Sorting을 진행하고 작업이 완료되었음을 알려줍니다.
End If
End Sub
Step 3: 마무리
원래 만들려고 하였던 것은 데이터 내의 특정한 위치에 있는 문자열을 기준으로 정렬이 되도록 하려고 하였으나 방향을 사정이 여의치 않아 방향을 바꾸었습니다. Exceller는 이번 주 내내 외부 교육 중인데 과중한 숙제(?)로 인하야… T.T
하지만 위의 코드를 약간만 수정하면 충분히 만드실 수 있을 것이므로 직접 만들어 보시기 바랍니다.
오늘은 여기까지…
정리 — 특정 위치 문자 정렬 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 범위 지정 | Range([Start], [Start].End(xlDown)) | 이름으로 데이터 범위 지정 |
| 입력 검사 | IsNumeric / Do~Loop | 숫자가 아니면 다시 입력 |
| 문자 검사 | Mid(rngCell, 2, 1) = strCriteria | 두 번째 글자 비교 |
| 결과 기록 | .Offset(i, 0) = rngCell | 조건에 맞는 데이터 추출 |
| 정렬 | rngResult.CurrentRegion.Sort | 추출 결과 정렬 |
자주 묻는 질문 (FAQ)
Q1. 첫 글자가 아닌 두 번째 글자를 기준으로 정렬할 수 있나요?
Mid 함수로 두 번째 글자를 검사해 조건에 맞는 데이터만 추출한 뒤 정렬하면 됩니다.
Q2. InputBox에 숫자가 아닌 값을 입력하면 어떻게 되나요?
Do~Loop 순환문이 숫자가 입력될 때까지 InputBox를 계속 표시합니다.
Q3. 이름 정의는 왜 사용하나요?
Start와 Result 이름을 정의해 두면 코드에서 셀 주소를 직접 쓰지 않고도 시작 위치와 결과 위치를 지정할 수 있습니다.
마치며
Mid 함수로 조건에 맞는 데이터를 추출한 뒤 Sort 메서드를 쓰면 특정 위치 문자 기준 정렬을 구현할 수 있습니다.