• 최초 작성일: 2016-09-28
  • 최종 수정일: 2026-09-30
  • 조회수: 24 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: VBA 파워 코딩 233회 - 원하는 만큼 행 삽입

들어가기 전에

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

참으로 오래간만에 VBA 강좌를 업데이트합니다. 오늘은 특정 열의 수량 값만큼 해당 행을 자동으로 복제·삽입해 주는 코드를 다뤄보겠습니다.

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

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

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


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

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

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

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

수량만큼 행을 자동으로 삽입하기

핵심 요약: 수량만큼 행을 삽입하는 InsertRows 프로시저

InsertRows 프로시저는 맨 아래 행부터 거꾸로 접근하면서, 각 행 C열의 수량 값만큼 해당 행을 복사·삽입합니다.

  • 준비: Source로 이름 정의된 원본 표를 새 시트에 복사
  • 핵심 원칙: For i = intNumber To 2 Step -1 — 맨 아래 행부터 거꾸로 접근
  • 반복 삽입: C열 값(intRepeat)만큼 Rows.Copy → Insert Shift:=xlDown
  • 마무리: Application.CutCopyMode = False로 복사 모드 해제

<책은 도끼다>라는 책에 이런 구절이 나옵니다.

"뼈 빠지는 수고를 감당하는 나의 삶도 남이 보면 풍경이다. 멀리서 볼 때 지게 지고 가는 아저씨는 낭만적이지만, 정작 지게를 진 아저씨는 뼈가 빠진다."

삶은 가까이서 보면 전쟁이지만 멀리서 보면 풍경이라지요. 뭔가를 멀리서 보면 모든 것이 평화롭고 좋게만 보입니다. 그래서 찰리 채플린도 이런 말을 했나 봅니다. "인생은 가까이서 보면 비극이지만 멀리서 보면 희극이다."

참으로 오래간만에 VBA 강좌를 업데이트합니다. 백 년 만의 VBA 강좌인 만큼 반가움 또한 크지 않을까 하는 기대를 살짝 해봅니다(흠…).

수량만큼 행을 자동으로 삽입하려면?

오래전에 어느 분이 질문하신 내용입니다. 정확한 질문 내용은 기억나지 않는데… 아래와 같은 데이터에서 수량에 해당되는 숫자만큼 행을 자동으로 삽입하고 싶은데 방법이 없겠느냐 하는 질문이었습니다.

실제 데이터는 이것보다 훨씬 복잡해서 전국의 데이터가 다 있었는데, 보안을 요청하셔서 일부 데이터만 추렸습니다.

구역 동수 수량
강남구132
강동구213
강북구182
강서구213
관악구253
광진구162
구로구202
………

예를 들어 강남구는 수량이 2이므로 1개 행만 더 삽입해서 총 2개 행이 되어야 하고, 강동구는 수량이 3이므로 2개 행을 더 삽입해서 총 3개 행이 되어야 합니다. 버튼을 눌러보면 순식간에 해결됩니다. 이 작업을 위해 사용된 코드는 매우 간단합니다. 허탈할 정도로…

Sub InsertRows()

    Dim shtSheet As Worksheet
    Dim intNumber As Integer
    Dim intRepeat As Integer
    Dim i As Integer
    Dim j As Integer
    Const strMsg = "아이엑셀러 닷컴//Exceller"

    Set shtSheet = Worksheets.Add
    Range("Source").Copy Destination:=ActiveSheet.Range("A1")
    ' Source라고 미리 이름 정의해 둔 영역(표 전체 영역)을 새로 삽입한 시트에 복사합니다.

    MsgBox "지금부터 C열에 입력된 숫자만큼 행을 삽입합니다", , strMsg

    intNumber = shtSheet.UsedRange.Rows.Count
    ' 사용된 영역(UsedRange)의 행 수를 카운팅하여 intNumber 변수에 담아둡니다.

    For i = intNumber To 2 Step -1
        ' 워크시트에 행을 삽입할 때에는 맨 아래쪽부터 순차적으로 접근하는 것이 바람직합니다.
        ' 따라서 사용된 영역의 맨 아래쪽 행으로부터 한 행씩 위로 접근합니다.

        intRepeat = Cells(i, 3)
        ' 몇 개의 행을 삽입할 것인지에 대한 정보가 C열에 있으므로, 각 행의 C열에
        ' 있는 값을 가져와서 intRepeat 변수에 저장합니다.

        For j = intRepeat - 1 To 1 Step -1
            ' intRepeat 변수에 저장된 숫자만큼 행을 삽입하고, 바로 위 행의 정보를
            ' 행을 하나씩 삽입하면서 복사해 넣습니다.
            Rows(i).Copy
            Rows(i + 1).Select
            Selection.Insert Shift:=xlDown
        Next j
    Next i

    Range("A2").Select
    Application.CutCopyMode = False
    ' 잘라내기 또는 복사하기 모드를 해제합니다.

    MsgBox "작업이 끝났습니다", , strMsg

End Sub

코드 설명

맨 아래쪽 행부터 거꾸로(For i = intNumber To 2 Step -1) 접근하는 것이 핵심입니다. 행을 삽입하면 아래쪽 행 번호가 밀려나기 때문에, 위에서부터 접근하면 이미 처리한 행이 다시 밀려서 꼬이게 됩니다. 각 행의 C열 값(intRepeat)만큼 Rows(i).Copy → Rows(i + 1).Select → Selection.Insert Shift:=xlDown을 반복해서 같은 행을 복사·삽입합니다.

보시다시피, 사용된 코드는 심하게 간단합니다. 이런 간단한 코드만으로도 우리나라뿐 아니라 전 세계 데이터도 처리가 가능하겠지요? ^^

정리 — InsertRows 프로시저 핵심 포인트

포인트 설명
처리 방향 아래쪽 행부터 위로(Step -1) — 행 삽입 시 번호가 밀리는 문제 방지
반복 기준 각 행 C열(intRepeat)에 입력된 수량 값
핵심 코드 Rows(i).Copy → Rows(i + 1).Select → Selection.Insert Shift:=xlDown
대상 범위 Source로 이름 정의된 영역을 새 시트에 복사한 표 전체

자주 묻는 질문 (FAQ)

Q1. 왜 맨 위 행부터가 아니라 맨 아래 행부터 처리하나요?

위에서부터 행을 삽입하면 삽입할 때마다 아래쪽 행들의 번호가 하나씩 밀려서, 아직 처리하지 않은 행의 위치가 계속 바뀌어 버립니다. 아래에서부터 거꾸로 처리하면 이미 처리한 행보다 아래쪽에서만 변화가 생기므로 꼬이지 않습니다.

Q2. 수량이 1인 행은 어떻게 되나요?

For j = intRepeat - 1 To 1 Step -1에서 intRepeat가 1이면 반복 범위가 1 To 1이 아니라 0 To 1이 되어 반복문이 실행되지 않으므로, 행이 추가로 삽입되지 않고 원래 1행 그대로 유지됩니다.

Q3. 원본 데이터가 훼손되지는 않나요?

InsertRows 프로시저는 Source 영역을 새로 추가한 시트에 복사한 뒤 그 복사본에서 작업하므로, 원본 데이터가 있는 시트는 그대로 보존됩니다.

마치며

행을 삽입할 때는 언제나 '어느 방향으로 접근할 것인가'부터 생각해 보세요. 방향만 제대로 잡으면 코드는 이렇게 간단해질 수 있습니다!