• 최초 작성일: 2000-10-18
  • 최종 수정일: 2026-09-30
  • 조회수: 10 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 다중영역 복사하기

들어가기 전에

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

이번 시간에는 "다중영역 복사하기"(영어로 하면 Multi-range Copy쯤 되려나? ^^)에 대해 알아보겠습니다. 보통 Excel에서 Ctrl 키를 누르고 영역(셀)을 선택하면 불연속 적인 여러 개의 셀(영역)을 선택할 수 있습니다(이것은 VB0036 강좌에서 소개해 드린 "PowerTools" 중에 있는 "다중영역 복사하기" 메뉴에 대한 설명입니다).

하지만 이렇게 해서 선택된 영역은 복사나 잘라내기를 할 수 없습니다. 그런데 이것도 VBA로 프로그래밍을 하면 가능하게 됩니다.

아래에 예제 데이터를 만들어 두었으니 Ctrl키를 사용하여 여러 셀을 선택하신 다음에 버튼을 눌러 보세요(친절도 한 지고… ^^)

Ctrl 키를 누른 채 여러 셀(영역)을 선택한 다음 버튼을 누르는 방식으로 실행합니다(예제 시트에는 임의의 숫자가 들어 있습니다).

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

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

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


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

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

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

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

다중영역 복사하기

핵심 요약: 다중영역 복사

선택된 Areas를 배열에 담고 가장 위쪽·왼쪽 셀을 기준으로 오프셋을 계산해 붙여넣을 위치에 상대 위치를 유지하며 복사합니다.

  • 1단계: Selection.Areas로 선택된 영역들을 배열에 저장합니다.
  • 2단계: 가장 위쪽 행과 왼쪽 열을 기준으로 삼고 붙여넣을 위치를 InputBox로 받습니다.
  • 3단계: 각 영역의 오프셋을 계산해 하나씩 Copy로 붙여 넣습니다.

Step 1: 코드 작성하기

잘 되지요? 코드를 보면…

Option Explicit
Const Msg = "범위 선택이 잘못되었습니다." & vbCr & "다시 확인하세요."
Const ID = "다중영역 복사하기//By Exceller"
 '//프로시저를 시작하기 전에 외부변수를 두 개 선언해 주었습니다.

Sub MultiRangeCopy()
    Dim intHowManyAreas As Integer
    Dim i As Integer
    Dim intNotEmpty As Integer
    Dim lngTopRow As Long
    Dim intLeftColumn As Integer
    Dim lngRowOffset As Long
    Dim intColumnOffset As Integer
    Dim rngAreas() As Range
    Dim rngTarget As Range
    Dim rngFirst As Range

    If TypeName(Selection) <> "Range" Then
        MsgBox Msg, vbInformation, ID
        Exit Sub
        '//만약 선택된 것이 Range 오브젝트가 아니면 에러 메시지를 표시하고 프로시저를 종료

    End If

    intHowManyAreas = Selection.Areas.Count
    ReDim rngAreas(1 To intHowManyAreas)
    '//몇 개의 Area가 선택되었는지를 카운팅한 다음, ReDimension 문을 사용해서 배열의 크기를
    '//재지정합니다.

    For i = 1 To intHowManyAreas
        Set rngAreas(i) = Selection.Areas(i)
    Next
    '//각 영역을 rngAreas 배열변수의 각 요소에 저장을 하지요.

    lngTopRow = ActiveSheet.Rows.Count
    intLeftColumn = ActiveSheet.Columns.Count

    For i = 1 To intHowManyAreas
        With rngAreas(i)
            If .Row < lngTopRow Then lngTopRow = .Row
            If .Column < intLeftColumn Then intLeftColumn = .Column
        End With
    Next i
    Set rngFirst = Cells(lngTopRow, intLeftColumn)

    On Error Resume Next
    Set rngTarget = Application.InputBox("붙여넣을 좌측 상단 셀 선택:", Type:=8)
    On Error GoTo 0
    If TypeName(rngTarget) <> "Range" Then
        MsgBox Msg, vbInformation, ID
        Exit Sub
    '//복사할 위치값을 InputBox를 통해 입력을 받되 입력된 값이 유효하지 않을 경우에 대한
    '//처리를 하기 위한 구문입니다.

    End If
    Set rngTarget = rngTarget.Cells(1)

    For i = 1 To intHowManyAreas
        lngRowOffset = rngAreas(i).Row - lngTopRow
        '//lngTopRow에는 항상 복사할 영역 내의 첫번째 셀의 행번호가 Assign됩니다. 그래야
        '//기준셀(즉 첫번째 셀을 기준으로 하여 일정한 거리만큼 Offset을 할 수 있겠지요?
        '//잘 이해가 안가는 분은 큰 종이 위에 좌표를 하나씩 대입해가며 파악을 해 보세요.

        intColumnOffset = rngAreas(i).Column - intLeftColumn
        '//intLeftColumn에는 항상 복사할 영역 내의 첫번째 셀의 열번호가 Assign 됩니다.

        intNotEmpty = intNotEmpty + Application.CountA(Range(rngTarget.Offset(lngRowOffset, _
            intColumnOffset), rngTarget.Offset(lngRowOffset + rngAreas(i).Rows.Count - 1, _
            intColumnOffset + rngAreas(i).Columns.Count - 1)))
    Next i

    If intNotEmpty <> 0 Then If MsgBox("기존 데이터에 겹쳐 쓸까요?", vbQuestion + vbYesNo, _
        "여러 범위 복사하기") <> vbYes Then Exit Sub
    '//붙여 넣을 범위가 비어 있지 않으면 경고를 합니다.

    For i = 1 To intHowManyAreas
        lngRowOffset = rngAreas(i).Row - lngTopRow
        intColumnOffset = rngAreas(i).Column - intLeftColumn
        rngAreas(i).Copy rngTarget.Offset(lngRowOffset, intColumnOffset)
        '//복사할 첫번째 셀의 위치를 기준으로 행/열 이동값을 산출하기 위한 과정입니다.
    Next i
End Sub

Ctrl 키로 여러 영역을 선택한 상태에서는 엑셀의 기본 복사/붙여넣기를 사용할 수 없으며, 선택된 영역들의 배치가 서로 다른 행과 열에 걸쳐 있으면 이 방법은 복사 기능이 동작하지 않는다는 안내가 표시됩니다. 이 코드는 각 영역의 상대 위치를 계산하여 하나씩 붙여 넣는 방식으로 이를 대신합니다.

마무리

오늘 설명드린 내용은 코드 자체는 그다지 길지 않습니다만 약간 생각을 해보아야 이해가 가실 것입니다. 빈 종이 위에다 좌표를 몇 번 그려가면서 따라해 보시면 이해하실 수 있으리라 생각됩니다.

직원 집들이에 갔다가 음주가무… 까지는 아니고 음주만 좀 했더니 머리가 맑지를 않군요. 그래서 자세한 설명은 드리지 못한 듯 합니다. 하지만,

No Pains, No Gains!
Easy Come, Easy Go!!!

이라는 사실을 명심하시고 열심히 따라오시기 바랍니다.

다음에 또…

정리 — 다중영역 복사 핵심

구분 사용한 코드 역할
영역 개수 Selection.Areas.Count 선택된 영역 수
배열 저장 Set rngAreas(i) = Selection.Areas(i) 각 영역 보관
범위 입력 Application.InputBox(Type:=8) 붙여넣을 셀 지정
오프셋 계산 rngAreas(i).Row - lngTopRow 기준 셀과의 거리
복사 rngAreas(i).Copy rngTarget.Offset(...) 상대 위치를 유지해 붙여넣기

자주 묻는 질문 (FAQ)

Q1. Ctrl 키로 선택한 여러 영역은 왜 복사가 안 되나요?

엑셀의 기본 복사 기능은 서로 다른 모양의 불연속 영역을 한꺼번에 복사할 수 없기 때문이며, VBA로 영역별로 복사하면 가능합니다.

Q2. Areas 속성은 무엇인가요?

선택 범위를 구성하는 개별 연속 영역들의 컬렉션이며 Areas.Count로 영역 수를 알 수 있습니다.

Q3. 붙여넣을 위치는 어떻게 지정하나요?

Application.InputBox에서 Type을 8로 지정해 사용자가 셀을 마우스로 선택하게 합니다.

마치며

좌표를 따져 가며 오프셋을 계산하면 기본 기능으로 안 되는 다중영역 복사도 구현할 수 있습니다.