- 최초 작성일: 2005-08-25
- 최종 수정일: 2026-09-30
- 조회수: 12 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 자료 형태 변경하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
질문 하나
답변 부탁드릴께요..
안녕하세요... 궁금한 것이 있어서 글을 남깁니다. VBA 활용법에 대한 질문인데요... (어쩌면 VBA를 사용하지 않고도 방법이 있는지는 모르겠습니다)
신상기록 시트가 있는데... 근무이력 부분에 Alt+Enter로 처리되어 있습니다. 이것을 Alt+Enter를 없애고 별도의 셀에 표시를 해 주어야 합니다.
자료가 얼마 안되면 어떻게 해 보겠는데 2000행이 넘습니다.
답변 부탁드릴께요! (첨부해 드린 자료는 보안 부탁드립니다)
자료 형태 변경하기
핵심 요약: 줄바꿈으로 구분된 셀을 행으로 펼치기
근무경력처럼 한 셀 안에 Alt+Enter로 여러 항목이 들어 있을 때, 항목마다 한 행씩 나누고 나머지 열의 값은 그대로 복사해 주는 VBA 코드입니다.
- 1단계: Split 함수로 셀 값을 줄바꿈(Chr(10)) 단위 배열로 만듭니다.
- 2단계: 해당 행을 복사해 새 시트의 행마다 붙여넣습니다.
- 3단계: 배열의 각 값을 근무경력 열에 채우고 서식을 적용합니다.
Step 1: 어떤 질문이었을까요?
질문주신 분의 경우, 신상명세서 자료인데 보안을 요하는 사항이므로 외부에 공개하지는 말아달라고 부탁을 하셨더랬습니다. 여러분도 질문을 주실 때, 외부에 공개되어서는 곤란한 자료인 경우에는 꼭(!) 알려주시기 바랍니다.
그건 그렇고… 질문 내용은 이렇습니다. 다음과 같은 신상명세서가 있는데 '근무경력' 란을 보면, 각각의 부서가 하나의 셀에 모두 입력되어 있으며, Alt+Enter 키를 사용하여 구분되어 있습니다.
이것을 다음과 같이 바꿀 수 없겠느냐 하는 것입니다.
어떻게 하면 될까요? 버튼을 눌러 예제를 실행시켜 보고 오시기 바랍니다.
한방에 해결이 되지요? 데이터가 1000행이든 2000행이든 상관이 없습니다. 여기서는 좀더 시각적인 효과를 나타내기 위해 일부 필요한 조치를 취하지 않은 부분도 있습니다만 데이터량이 많아지면 코드를 조금더 최적화시키면 됩니다.
Step 2: 코드 살펴보기
코드를 보도록 하지요.
Sub ChangeDataForm()
' 필요한 변수들을 선언합니다.
Dim wrkSource As Worksheet
Dim wrkOutput As Worksheet
Dim rngTarget As Range
Dim rngTitle As Range
Dim rngCell As Range
Dim varTemp As Variant
Dim i As Integer
Dim intCount As Long
Set wrkSource = Sheets("Source")
Set wrkOutput = Worksheets.Add
Set rngTitle = Range("Title")
Set rngTarget = wrkSource.Range("A1").CurrentRegion
' Source 시트의 A1 셀 인접 영역을 작업 대상으로 합니다.
rngTitle.Copy Destination:=wrkOutput.Range("A1")
' 표의 타이틀 부분을 복사해서 새로 삽입한 워크시트의 첫번째 행에 붙여넣습니다.
' '삽입-이름' 메뉴를 사용하여 이름 정의된 영역을 살펴보세요.
intCount = 2
' 삽입한 시트의 2행부터 데이터를 입력하므로 변수값을 2로 지정합니다.
For Each rngCell In rngTarget.Offset(1, 0).Resize(rngTarget.Rows.Count - 1, 1)
' 여기서부터 본격적인 작업에 들어갑니다. rngTarget 영역 중에서 타이틀 부분을
' 제외한 전체 테이블을 대상으로 순환문을 돌립니다.
' Resize 메서드가 오랜만에 등장을 하였군요. 범위의 크기를 재지정하기 이해 Resize
' 메서드를 사용한 것입니다.
varTemp = Split(rngCell.End(xlToRight), Chr(10))
' Split 함수를 사용하여 Alt+Enter 구분된 내용을 대상으로 배열을 만듭니다.
Range(rngCell, rngCell.End(xlToRight)).Copy
' 행 중에서 데이터가 들어있는 영역을 복사합니다.
For i = 0 To UBound(varTemp)
' varTemp 변수에 저장된 값들을 대상으로 순환문을 돌립니다. varTemp 변수에는
' Split 함수에 의해 Alt+Enter로 구분된 문자열들이 보관되어 있는데, 이것을 차례대로
' 셀에 옮겨담는 과정입니다.
wrkOutput.Cells(intCount, 1).PasteSpecial
wrkOutput.Cells(intCount, 6) = varTemp(i)
intCount = intCount + 1
Next i
Next rngCell
' 작성된 영역에 대해 자동 서식을 설정합니다. 아래 부분은 자동 서식을 입히는 과정을
' 매크로 기록기로 기록한 다음, 편집해서 사용하면 됩니다.
Range("A1").Select
Selection.CurrentRegion.AutoFormat Format:=xlRangeAutoFormatList2, Number:=True, Font:= _
True, Alignment:=True, Border:=True, Pattern:=True, Width:=True
Columns.AutoFit
Application.CutCopyMode = False
MsgBox "분리작업을 완료하였습니다!", , "www.iExceller.com"
End Sub
손으로 직접 작업을 할 때의 순서를 잘 생각해 보시면 이것을 어떻게 프로그래밍 할 것인가 구체화 할 수 있을 것입니다.
링컨의 말 가운데 이런 구절이 있습니다.
"대체로, 사람은 행복해지겠다고 결심하는 강도에 따라서 행복해진다"
다음에 또…
정리 — 자료 형태 변경 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 새 시트 추가 | Worksheets.Add | 결과를 표시할 시트 삽입 |
| 줄바꿈 분리 | Split(rngCell.End(xlToRight), Chr(10)) | Alt+Enter 단위로 나눈 배열 생성 |
| 행 복사 | Range(rngCell, rngCell.End(xlToRight)).Copy | 데이터가 있는 행 영역 복사 |
| 배열 순환 | For i = 0 To UBound(varTemp) | 나뉜 항목 수만큼 반복 |
| 서식 지정 | CurrentRegion.AutoFormat | 결과 표에 자동 서식 적용 |
자주 묻는 질문 (FAQ)
Q1. Alt+Enter로 입력한 줄바꿈은 VBA에서 어떤 문자인가요?
셀 안의 줄바꿈은 아스키 코드 10번인 Chr(10), 즉 vbLf 문자입니다. Split 함수의 구분자로 Chr(10)을 지정하면 줄바꿈 단위로 나눌 수 있습니다.
Q2. VBA 없이 줄바꿈으로 구분된 셀을 나눌 수는 없나요?
텍스트 나누기 기능에서 Ctrl+J를 구분 기호로 지정하면 열 방향으로 나눌 수 있습니다. 행 방향으로 펼치려면 Power Query의 구분 기호별 열 분할(행으로) 기능을 사용하면 코드 없이도 가능합니다.
Q3. 데이터가 아주 많을 때 속도를 높이려면 어떻게 하나요?
실행 전에 Application.ScreenUpdating을 False로 지정하고, 행마다 복사·붙여넣기 하는 대신 배열에 담아 한 번에 대입하도록 코드를 최적화하면 훨씬 빨라집니다.
마치며
손으로 직접 작업을 할 때의 순서를 잘 생각해 보면 어떻게 프로그래밍할지가 구체화됩니다. 데이터가 2000행이든 그 이상이든 같은 방식으로 한 번에 해결할 수 있습니다.