• 최초 작성일: 2003-09-04
  • 최종 수정일: 2026-09-30
  • 조회수: 11 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 세로 데이터를 가로로 정리하기

들어가기 전에

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

Knowledge is a treasure, but practice is the key to it. 지식은 소중한 것이다. 그러나 연습은 그것의 열쇠이다.

독일 속담에도 있듯이 연습이 대가를 만드는 법이겠지요.

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

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

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


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

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

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

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

세로 데이터를 가로로 정리하기

핵심 요약: 세로 목록을 가로로 정리하기

기준 문자로 시작하는 셀의 행을 기억해 두었다가 그 아래 값들을 같은 행의 오른쪽으로 옮기고, 남은 빈 행을 삭제하는 두 단계로 해결합니다.

  • 1단계: 첫 열의 첫 글자가 #이면 기준 행을 기억합니다.
  • 2단계: 그 외의 값은 잘라내어 기준 행의 오른쪽 셀로 옮깁니다.
  • 3단계: 아래쪽 행부터 위로 올라가며 빈 행을 삭제합니다.

Step 1: 어떤 질문이었을까요?

엑셀은 웬만큼 다루는데 VBA는 강좌를 볼 때는 이해가 되는 듯하다가도 실제 업무에 적용하려면 되지 않는다는 하소연과 함께 올라온 질문입니다. 아래와 같이 세로로 나열된 목록을 '#'으로 시작하는 셀을 기준으로 가로로 정리하고 싶다는 내용이었습니다.

원래 목록

#가
1
2
3

#나
4
5
6

#다
7
8
9

#라
10
11
12

#마
13
14
15

#바
16
17
18

정리하고 싶은 형태

#가 1 2 3
#나 4 5 6
#다 7 8 9
#라 10 11 12
#마 13 14 15
#바 16 17 18

Step 2: 질문에서 찾을 수 있는 시사점

이 분의 질문에서 몇 가지 시사점을 찾을 수 있겠습니다. 먼저, 강좌를 보면 '아, 그렇구나!' 하는데 실제 업무에 적용하면 못하겠다는 것입니다. 이것은 전적으로 응용력 부족에서 기인하는 것입니다. 그러면, 왜 응용력이 부족한가? 그것은 문제에 대한 고민을 해보지 않았기 때문입니다.

대개의 초보님들은, 버튼 누르라고 해서 눌러보니까… 뭐가 휙휙거리며 처리가 되니 마냥 신기하긴 하지만 '거, 희안하군!' 이러고 그냥 넘어가고… 또 남이 만든 코드를 눈으로 대충 살펴보고는 '이거, 뭐 별거 아니군!' 하고 또 그냥 넘어가고…

이러면 백날해도 별 진전이 없습니다.

그리고는 애꿎은 머리카락만 한 웅큼씩 뽑아대며 이렇게 한탄하곤 합니다. '난 아무래도 프로그래밍 체질이 아닌가봐!'

다음으로, 이 세상에 '프로그래밍 체질' 또는 '프로그래밍용 머리'란 것이 있을까요? 전혀 없다고 할 수는 없겠지만, 중요한 것은 평소 누가 얼마나, 깊이있고 끈질기게 고민을 해 보았느냐에 따라 우리의 몸과 머리가 적응을 해나가는 것이라 생각합니다.

끝으로, VB하다 안되면 포기하고 다른 프로그램을 하겠다고 하시는 분이 가끔 계십니다. 장담컨대, VBA(VB나 엑셀도 마찬가지)하다 안되면 다른 무엇을 해도 안됩니다. ^^;; VBA를 완전히 내것으로 만들어 놓으면 다른 어떤 프로그램을 접하든 보다 쉽고 빠르게 익히실 수 있습니다. 그만큼 엑셀이나 VBA는 논리적으로 개념 잡기가 쉬우며 활용의 폭이 넓습니다.

괜히 애꿎은 머리나 집안 내력 같은 것 탓하지 마시고 현재 배우시는 엑셀과 VBA를 어떻게 하면 '입 안의 혀'처럼 잘 부려먹을까 부단히 고민하시기 바랍니다.

다시금 살펴보니… VBA 포기까지 고려하시는 분에게 너무 심한 말씀을 드린 것 같아 죄송스럽습니다. 하지만 악의는 전혀 없으며 다 잘되자고 드리는 조언이니 모쪼록 너른 마음으로 받아주시면 감사하겠습니다.

Step 3: 데이터 정리 코드

사설이 길었습니다. 아래의 버튼을 눌러 보세요.

눈깜짝(좀 오래 ^^) 할 사이에 데이터가 원하던 형태대로 정리되지요? 코드를 조금더 손 볼 데가 있습니다만, 그것은 여러분의 몫으로 남겨드리겠습니다.

Const ID As String = "www.iExceller.com"

Sub MoveData()

    Application.Goto Worksheets("Stage").Range("A1"), True
    MsgBox "지금부터 세로 방향의 데이터를 가로 방향으로 옮기겠습니다", , ID
    ' 작업 대상 워크시트(Stage 시트)로 이동합니다.

    Dim rngTarget           As Range
    Dim intNum              As Long
    Dim i                   As Long
    Dim lngRow              As Long
    Dim intCol              As Integer
    Dim strChar             As String
    Set rngTarget = ActiveSheet.UsedRange
    intNum = rngTarget.Rows.Count

    For i = 1 To intNum
    ' 현재 시트에서 데이터가 들어있는 영역의 행 수 만큼 For ~ Next 순환문을 반복합니다.

        With rngTarget.Columns(1)
            strChar = Left(.Cells(i), 1)
            ' 첫번째 컬럼 중에서 첫 글자를 뽑아낸 다음,

            If strChar = "#" Then
            ' 첫 글자가 어떤 것이냐에 따라 서로 다른 조건분기 처리를 합니다.
            ' 왜 아래와 같이 처리를 하는지에 대해서는 질문 내용을 참고로 잘 따져보시기 바랍니다.

                intCol = 0
                lngRow = .Cells(i).Row
            ElseIf strChar = "" Then
                ' 빈 셀은 건너뜁니다.
            Else
                .Cells(i).Select
                intCol = intCol + 1
                Selection.Cut Destination:=.Cells(1).Offset(lngRow - 1, intCol)
            End If
        End With

    Next i

    ' 여기까지 진행하면 세로 방향의 데이터가 가로 방향으로 옮겨지긴 합니다만, 옮겨가고 난 후의
    ' 데이터 중간에 구멍이 뻥뻥 뚫려 있어서 보기가 좋지 않습니다. 그래서 이 공백 라인을 처리하기
    ' 위한 외부 프로시저를 실행시킵니다.
    DelEmptyRows

    Range("A1").Select
    MsgBox "데이터 정리작업을 완료하였습니다", vbInformation, ID

End Sub

데이터 사이사이에 있는 공백 라인을 제거하기 위한 프로시저입니다.

Sub DelEmptyRows()

    Dim r                   As Long
    Dim i                   As Long
    r = ActiveSheet.UsedRange.Rows.Count

    ' 다른 것은 이해하실테고… 반드시 데이터의 맨 밑단에서부터 한 행씩 지워나간다는 점에 유의하시기
    ' 바랍니다.
    For i = r To 1 Step -1
        If Application.CountA(Rows(i)) = 0 Then Rows(i).Delete
    Next i

End Sub

아무리 짧은 코드라도 그냥 눈으로 읽고 지나치지 마시고 직접 타이핑해 보실 것을 적극 권해 드립니다.

다음 시간에…

정리 — 데이터 정리 핵심 코드

구분 사용한 코드 역할
첫 글자 확인 Left(.Cells(i), 1) # 여부 판단
기준 행 저장 lngRow = .Cells(i).Row # 셀의 행 번호 기억
값 이동 Selection.Cut Destination:=... 오른쪽 셀로 잘라 붙이기
빈 행 확인 Application.CountA(Rows(i)) = 0 비어 있는 행 판별
삭제 순서 For i = r To 1 Step -1 아래에서 위로 삭제

자주 묻는 질문 (FAQ)

Q1. 왜 빈 행은 아래에서부터 삭제하나요?

위에서부터 삭제하면 행이 지워질 때마다 아래 행의 번호가 바뀌어 일부 행을 건너뛰게 됩니다. 맨 아래에서 위로 올라가며 지우면 이를 피할 수 있습니다.

Q2. CountA 함수는 무엇을 세나요?

비어 있지 않은 셀의 개수를 셉니다. 행 전체에 대한 결과가 0이면 그 행은 완전히 빈 행입니다.

Q3. 프로그래밍이 잘 안 될 때는 어떻게 하나요?

남의 코드를 눈으로만 읽고 넘어가지 말고 직접 타이핑하면서 문제를 스스로 고민해 보는 것이 응용력을 키우는 가장 좋은 방법입니다.

마치며

아무리 짧은 코드라도 눈으로만 읽지 마시고 직접 타이핑해 보시기 바랍니다. 그 과정에서 응용력이 자랍니다.