- 최초 작성일: 2001-01-09
- 최종 수정일: 2026-09-30
- 조회수: 5 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 자료변환 예제Ⅱ
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
주말에 폭설이 내려 나라가 말이 아닙니다. 중부지방은 20년만의 폭설이라고 하는데 20년 전에 Exceller는 따뜻한 남쪽지방에 살고 있었으므로 실제로는 난평생 처음보는 큰 눈이었습니다. ^^
겁나게 내리는 눈을 보며 큰 일이 생기지 않을까 걱정했었는데 역시나… 어떻게 된 나라가 비가 조금만 많이와도 둑이 죄다 터지고, 눈이 조금 왔다고 국가의 핵심 동맥이 막히는지 안타깝기 짝이 없습니다.
"110조원 + α조원"이 들어간 공적자금은 다 어디다가 썼길래 여태 이모양인지 아무리 생각해도 모를 노릇입니다. 말이 110조원이지 가구마다 약 1천만원의 채무를 떠안고 있는 것입니다.
어서 모든 것이 제 자리를 찾았으면 좋겠습니다.
이번 시간에도 질문 하나를 살펴봅니다.
엑셀로 급하게 작업을 해야할 게 있어서 도움을 부탁드립니다.
기존의 자료를 DB로 변환하려고 하는데 그냥 하기에는 수작업이 많이 들어가서
고수님들의 조언을 부탁드립니다.
딱히 뭐라 설명하기가 어렵고… 구조를 그리겠습니다.
자료변환 예제Ⅱ
핵심 요약: 표 구조 변환
행을 삽입하고 오른쪽 자료를 잘라 아래 행으로 옮긴 뒤 빈 셀과 직책 열을 채워 가로 표를 세로 목록으로 바꿉니다.
- 1단계: 회사명 기준으로 정렬합니다.
- 2단계: 각 회사 아래에 행을 삽입하고 과장 자료를 잘라내어 붙입니다.
- 3단계: 빈 회사명과 직책 열을 채우고 서식을 다시 지정합니다.
Step 1: 질문의 내용
기존의 자료는 회사명 한 줄에 부장과 과장의 인원수, 기본급, 상여금이 가로로 나열된 형태입니다.
| 회사명 | 부장(명) | 기본급 | 상여금 | 과장(명) | 기본급 | 상여금 |
|---|---|---|---|---|---|---|
| 강원물산 | 2 | 5000 | 2000 | 3 | 1500 | 1000 |
| 현대기업 | 3 | 6000 | 3000 | 4 | 3000 | 2000 |
| 태평양 | 3 | 7000 | 4000 | 5 | 4000 | 2500 |
| 대원 | 3 | 6000 | 3000 | 4 | 3000 | 2000 |
| 삼호산업 | 3 | 7000 | 4000 | 5 | 4000 | 2500 |
| 대조물산 | 3 | 7000 | 4000 | 5 | 4000 | 2500 |
| 대현중기 | 3 | 6000 | 3000 | 4 | 3000 | 2000 |
| 한빛미디어 | 3 | 7000 | 4000 | 5 | 4000 | 2500 |
| 미래산업 | 5 | 6500 | 4500 | 6 | 5000 | 3000 |
| 태원 | 3 | 6000 | 3000 | 4 | 3000 | 2000 |
이것을 아래와 같이 회사명과 직위별로 한 줄씩 나열하고 싶다는 질문입니다.
| 회사명 | 직위 | 인원 | 기본급 | 상여금 |
|---|---|---|---|---|
| 강원물산 | 부장 | 2 | 5000 | 2000 |
| 강원물산 | 과장 | 3 | 1500 | 1000 |
| 현대기업 | 부장 | 3 | 6000 | 3000 |
| 현대기업 | 과장 | 4 | 3000 | 2000 |
이해가 가시는지요.
하나의 회사명을 기준으로 열로 길게 나열한 것을 조인을 시키려다 보니
이런 형식이 가장 나은 것 같은데, 데이터 양이 많아서요.
자동으로 바뀌게 할 수는 없는지요.
제발 갈쳐 주세요.
즐거운 하루 되시구요.
Step 2: 실행해 보기
아래의 버튼을 누르시면 워크시트가 한장 삽입되고 소스 테이블이 복사됩니다. 그런 다음에 다시 버튼을 누르세요.
잘 보셨지요? 지난 강좌 시간에도 언급을 했었지만 자료를 정리할 때에는 나중을 위해서 DB 구조를 잘 생각하셔야 합니다. 그래야 자료를 관리하고 응용을 하기가 수월해 집니다.
Step 3: ArrangeData 프로시저
Sub ArrangeData()
Dim rngStart As Range
Dim r As Long
Set rngStart = ActiveSheet.Range("a2")
rngStart.Sort key1:=Range("a2"), order1:=xlAscending, header:=xlGuess
'//변수를 선언합니다. 그리고 나서 현재 시트(여기서는 새로 삽입한 시트)의 A2 셀을
'//시작셀로 지정합니다.
'//혹시 회사명이 혼재되어 있을 경우를 대비하여 Sorting을 해 줍니다.
Do While rngStart.Offset(r, 0) <> ""
If rngStart.Offset(r, 0) = "" Then
'//A열의 값이 공란이면 Do Loop 문을 빠져나가고,
Exit Do
Else
'//A열의 값이 공란이 아니면 행을 하나 삽입한 다음 오른쪽으로 4간 이동한 위치에
'//있는 자료(과장 인원수)부터 오른쪽 편에 있는 모든 자료들을 잘라내기/붙여넣기
'//합니다. 즉 가로 방향으로 배열되어 있는 자료를 세로로 재배치하는 것입니다.
rngStart.Offset(r + 1).EntireRow.Insert
rngStart.Offset(r, 4).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Cut Destination:=rngStart.Offset(r + 1, 1)
End If
r = r + 2
Loop
'//회사명 부분이 공란으로 남겨져 있으면 안되니까 빈 셀인 경우, 바로 위 셀의 값을
'//끌어 옵니다.
Range("b2").EntireColumn.Insert
Columns(1).Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.FormulaR1C1 = "=r[-1]c"
'//직책 부분의 타이틀을 적어줍니다.
rngStart.Offset(0, 1) = "부장"
rngStart.Offset(1, 1) = "과장"
Range("b2:b3").Select
Selection.Copy
Range("b" & 4 & ":" & "b" & r + 1).Select
ActiveSheet.Paste
Rows(1).ClearContents
'//자료의 헤더 부분을 다시 적어주고 서식을 재정의합니다.
Range("a1:e1") = Array("회사명", "직책", "인원수", "기본급", "상여금")
ActiveSheet.UsedRange.ClearFormats
Range("a2").Select
Selection.AutoFormat Format:=xlRangeAutoFormatList1, Number:=True, Font:= _
True, Alignment:=True, Border:=True, Pattern:=True, Width:=True
End Sub
Step 4: 시트를 삽입하고 버튼 만들기
아래의 코드는 워크시트를 한장 삽입하고 버튼을 만든 다음 버튼에 프로시저를 연결하는 코드입니다. 이것은 어려운 부분이 하나도 없으므로 해설은 생략합니다.
Sub GoToWorkplace()
Range("Source").Copy
Worksheets.Add after:=Sheets("Preface")
ActiveSheet.Paste
ActiveWindow.DisplayGridlines = False
Range("i1").Select
With ActiveCell
ActiveSheet.Buttons.Add(.Left, .Top, .Width * 2, .Height).Select
End With
With Selection
.Caption = "Click Me!!!"
.Font.Name = "arial"
.Font.Size = 10
.Font.Bold = True
.OnAction = "ArrangeData"
End With
Range(Selection.TopLeftCell.Address).Select
End Sub
마무리
다음 시간에 또…
정리 — 표 구조 변환 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 정렬 | rngStart.Sort key1:=Range("a2") | 회사명 기준 정렬 |
| 행 삽입 | rngStart.Offset(r + 1).EntireRow.Insert | 과장 자료 자리 만들기 |
| 잘라내기 | Selection.Cut Destination:=... | 오른쪽 자료 아래로 이동 |
| 빈 셀 채우기 | SpecialCells(xlCellTypeBlanks) | 위 셀 값 참조 |
| 버튼 만들기 | ActiveSheet.Buttons.Add | 프로시저 연결 버튼 |
자주 묻는 질문 (FAQ)
Q1. 가로로 나열된 자료를 세로로 재배치하려면?
행을 삽입하고 오른쪽 자료를 잘라내어 아래 행에 붙여 넣는 방식으로 재배치할 수 있습니다.
Q2. 빈 셀을 위 셀의 값으로 채우려면?
SpecialCells로 빈 셀만 선택한 뒤 R1C1 수식 =R[-1]C를 지정합니다.
Q3. DB 구조를 미리 생각해야 하는 이유는?
자료를 관리하고 응용하기 쉬운 구조로 만들어 두면 나중에 변환 작업이 필요 없기 때문입니다.
마치며
자료를 관리하기 쉬운 DB 구조로 바꾸는 작업은 VBA로 자동화할 수 있습니다.