• 최초 작성일: 2001-01-09
  • 최종 수정일: 2026-09-30
  • 조회수: 5 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 자료변환 예제Ⅱ

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

주말에 폭설이 내려 나라가 말이 아닙니다. 중부지방은 20년만의 폭설이라고 하는데 20년 전에 Exceller는 따뜻한 남쪽지방에 살고 있었으므로 실제로는 난평생 처음보는 큰 눈이었습니다. ^^

겁나게 내리는 눈을 보며 큰 일이 생기지 않을까 걱정했었는데 역시나… 어떻게 된 나라가 비가 조금만 많이와도 둑이 죄다 터지고, 눈이 조금 왔다고 국가의 핵심 동맥이 막히는지 안타깝기 짝이 없습니다.

"110조원 + α조원"이 들어간 공적자금은 다 어디다가 썼길래 여태 이모양인지 아무리 생각해도 모를 노릇입니다. 말이 110조원이지 가구마다 약 1천만원의 채무를 떠안고 있는 것입니다.

어서 모든 것이 제 자리를 찾았으면 좋겠습니다.

이번 시간에도 질문 하나를 살펴봅니다.

엑셀로 급하게 작업을 해야할 게 있어서 도움을 부탁드립니다.
기존의 자료를 DB로 변환하려고 하는데 그냥 하기에는 수작업이 많이 들어가서
고수님들의 조언을 부탁드립니다.

딱히 뭐라 설명하기가 어렵고… 구조를 그리겠습니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

자료변환 예제Ⅱ

핵심 요약: 표 구조 변환

행을 삽입하고 오른쪽 자료를 잘라 아래 행으로 옮긴 뒤 빈 셀과 직책 열을 채워 가로 표를 세로 목록으로 바꿉니다.

  • 1단계: 회사명 기준으로 정렬합니다.
  • 2단계: 각 회사 아래에 행을 삽입하고 과장 자료를 잘라내어 붙입니다.
  • 3단계: 빈 회사명과 직책 열을 채우고 서식을 다시 지정합니다.

Step 1: 질문의 내용

기존의 자료는 회사명 한 줄에 부장과 과장의 인원수, 기본급, 상여금이 가로로 나열된 형태입니다.

회사명부장(명)기본급상여금과장(명)기본급상여금
강원물산250002000315001000
현대기업360003000430002000
태평양370004000540002500
대원360003000430002000
삼호산업370004000540002500
대조물산370004000540002500
대현중기360003000430002000
한빛미디어370004000540002500
미래산업565004500650003000
태원360003000430002000

이것을 아래와 같이 회사명과 직위별로 한 줄씩 나열하고 싶다는 질문입니다.

회사명직위인원기본급상여금
강원물산부장250002000
강원물산과장315001000
현대기업부장360003000
현대기업과장430002000

이해가 가시는지요.
하나의 회사명을 기준으로 열로 길게 나열한 것을 조인을 시키려다 보니
이런 형식이 가장 나은 것 같은데, 데이터 양이 많아서요.
자동으로 바뀌게 할 수는 없는지요.
제발 갈쳐 주세요.
즐거운 하루 되시구요.

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로 자동화할 수 있습니다.