- 최초 작성일: 2007-06-27
- 최종 수정일: 2026-09-30
- 조회수: 11 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 테이블 형태 변경하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
인생은 쉽게 살 수도 있고 어렵게 살 수도 있습니다. 하지만 쉽다고 쉬운 것이 아니고 어렵다고 어려운 것이 아닌 것 같습니다!
강좌도 시작하기 전에 뭔 뚱단지 같은 소리냐구요?? 강좌를 끝까지 잘 읽어보시면 무슨 얘기를 할려는지 이해하실 수 있습니다. ^^
테이블 형태 변경하기
핵심 요약: 교차표를 목록 형태로 변환하기
담당명이 행, 브랜드가 열인 교차 표를 담당명·브랜드명·매출수량 세 열의 목록으로 바꾸는 VBA 코드입니다. 원리를 이해하는 것이 핵심입니다.
- 1단계: 결과 표의 제목 행을 입력합니다.
- 2단계: 중첩 For Next로 원본의 행과 열을 순서대로 읽어 한 줄씩 기록합니다.
- 3단계: ListObjects.Add로 결과를 테이블로 만들고 스타일을 지정합니다.
Step 1: 두 가지 형태의 테이블
다음과 같은 두 가지 형태의 테이블이 있습니다. 만약 <표 2>와 같은 테이블이 있다면 이것을 이용해서 <표 1>의 형태로 만드는 것은 일도 아닐 것입니다. 피벗 테이블을 이용하면 간단하게 해결할 수 있으니까요.
<표 1>
<표 2>
그런데 그 반대의 경우라면 어떻게 하면 좋을까요? 즉, <표 1>과 같은 데이터를 이용하여 <표 2>를 만들어야 한다면 말입니다. 아래 버튼을 클릭해 보세요.
Step 2: 코드 살펴보기
보신 것처럼 간단히 해결됩니다. 코드를 살펴볼까요?
Sub ChangeTableFormat()
Dim rngSource As Range
Dim rngOutput As Range
Dim lngRow As Long
Dim lngCol As Long
Dim lngSourceRow As Long
On Error GoTo ET
Application.Goto Worksheets("Workplace").Range("A1"), True
MsgBox "지금부터 테이블 형태 변경 작업을 시작합니다", , "www.iExceller.com"
Set rngSource = Range("Source")
' Workplace 시트에 'Source'라는 이름을 미리 정의해 두었으니 확인해 보세요.
Set rngOutput = Worksheets("Workplace").Range("B15")
' 새로운 테이블을 작성하려는 위치에 다른 내용이 있으면 지웁니다.
If rngOutput <> "" Then
MsgBox "이미 작성된 것이 있으므로 지우고 시작합니다"
rngOutput.CurrentRegion.Clear
End If
rngOutput.CurrentRegion.Clear
lngSourceRow = 2
rngOutput.Range("A1:C1") = Array("담당명", "브랜드명", "매출수량")
' 새로 작성하는 테이블의 제목 부분을 기입합니다.
For lngRow = 2 To rngSource.Rows.Count
For lngCol = 2 To rngSource.Columns.Count
' <표 1>을 보면 데이터가 행/열 방향으로 배치되어 있으므로 For ~ Next 문을 두 번
' 중첩해서 사용 하였습니다.
With rngOutput
' <표 1>의 행과 열 방향을 순차적으로 이동해 가면서 데이터를 B15 셀을 중심으로
' 가로/세로 방향으로 하나씩 적어 나갑니다. 빈 종이를 가져다 놓고 세 번 정도만
' 숫자를 대입해 보시면 로직을 쉽게 이해하실 수 있을 것입니다.
.Cells(lngSourceRow, 1) = rngSource.Cells(lngRow, 1)
.Cells(lngSourceRow, 2) = rngSource.Cells(1, lngCol)
.Cells(lngSourceRow, 3) = rngSource.Cells(lngRow, lngCol)
End With
lngSourceRow = lngSourceRow + 1
' <표 1>의 한 행에 대해 끝마쳤으면 다음 행으로 이동하기 위한 카운터 값을 1 증가시킵니다.
Next lngCol
Next lngRow
ActiveSheet.ListObjects.Add(xlSrcRange, Range(rngOutput.CurrentRegion.Address), , xlYes).Name = "MyTable"
ActiveSheet.ListObjects("MyTable").TableStyle = "TableStyleLight16"
' 이것은 Excel 2007에서 지원하는 것으로써 그 이전 버전까지 제공되던 '자동 서식'과
' 비슷합니다. 즉 테이블의 형태를 자동으로 꾸며주기 위한 것입니다.
MsgBox "테이블 형태 변경 작업이 완료되었습니다!", , "www.iExceller.com"
ET:
If Err.Number <> 0 Then
MsgBox Err.Description, , "오류 번호 : " & Err.Number
Err.Clear
End If
End Sub
Power Query로도 가능합니다. 최신 Excel에서는 <표 1>의 데이터를 선택하고 Power Query의 '열 피벗 해제(Unpivot)' 기능을 사용하면 코드 없이 <표 2> 형태로 바꿀 수 있습니다. 원본 데이터가 바뀌면 새로 고침만으로 다시 변환된다는 장점도 있습니다.
그런데… 사실 <표 1>과 같은 데이터를 <표 2>와 같은 형태로 만드는 것이라면 머리 아프게 VBA로 코딩을 하고 말고 할 것도 없습니다. 피벗 테이블 기능을 이용하면 더 간편하게 해결할 수 있습니다(X0348 강좌를 살펴 보세요!!).
세상에 믿을 OX 없다더니… 이제 Exceller도 믿을 게 못되는군! 이렇게 쉽게 해결할 수 있는데 어려운 것을 알려 주다니… 이런 생각이 드셨나요?
어떤 일을 간단하게 해 치우듯(!) 하는 것도 중요하겠습니다만, 그보다 더 중요한 것은, 어떤 원리에 의해 그렇게 되는지를 이해하는 것과 그 과정에서 얻게 되는 사고력, 응용력 등이 더욱 중요한 것이라 생각합니다.
다음에 또…
정리 — 테이블 형태 변경 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 원본 범위 | Range("Source") | 이름 정의된 교차 표 영역 |
| 제목 입력 | rngOutput.Range("A1:C1") = Array(...) | 결과 표의 제목 행 기입 |
| 행/열 순환 | For lngRow ... For lngCol ... | 원본의 모든 값을 차례로 읽음 |
| 값 기록 | .Cells(lngSourceRow, n) | 담당명, 브랜드명, 수량을 나열 |
| 테이블 생성 | ListObjects.Add(xlSrcRange, ...) | 결과를 엑셀 테이블로 변환 |
자주 묻는 질문 (FAQ)
Q1. 교차표를 목록으로 바꾸는 더 간단한 방법이 있나요?
Power Query의 열 피벗 해제(Unpivot) 기능을 쓰면 코드 없이 바꿀 수 있습니다. 반대로 목록 형태를 교차 표로 바꾸는 것은 피벗 테이블로 간단히 해결할 수 있습니다.
Q2. 중첩 For 문의 로직을 이해하려면 어떻게 하나요?
빈 종이에 원본의 값 몇 개를 적고 카운터 값이 어떻게 변하는지 세 번 정도만 직접 대입해 보면 쉽게 이해할 수 있습니다.
Q3. 왜 목록 형태가 데이터베이스로 좋은가요?
한 행에 한 건의 데이터가 들어 있는 목록 형태라야 피벗 테이블, 필터, 정렬 같은 분석 도구를 제대로 사용할 수 있습니다.
마치며
간단히 해치우는 것도 중요하지만, 어떤 원리로 그렇게 되는지 이해하고 그 과정에서 사고력과 응용력을 기르는 것이 더 중요합니다.