• 최초 작성일: 2002-01-30
  • 최종 수정일: 2026-09-30
  • 조회수: 10 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 데이터 위치 바꾸기

들어가기 전에

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

이번 시간에는 게시판에 올라온 질문 하나를 살펴봅니다.

안녕하세요?
마방진의 내용을 보다가 일정한 표에서 데이터를 좌우로 바꿔야 할 때가 있더군요.
왼쪽에 있는 것을 오른 쪽으로, 또 오른 쪽에 있는 것을 왼 쪽으로 옮긴 후 계산을 하는데 엑셀의 수식으로 한번에 바꾸기 할 수 있는지요. 즉,

이런 자료를

147
258
369

과 같이요.

741
852
963

꼭 알려 주시면 고맙겠습니다. 안녕히!!!

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

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

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


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

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

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

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

데이터 위치 바꾸기

핵심 요약: 두 영역의 값 맞바꾸기

Selection.Areas로 두 영역을 얻어 각 셀 값을 배열에 담아 두었다가 서로 바꾸어 넣으면 됩니다.

  • 1단계: Range 오브젝트인지, 영역이 2개인지, 셀 수가 같은지 확인합니다.
  • 2단계: 두 영역의 값을 동적 배열 변수에 각각 담습니다.
  • 3단계: 배열 값을 반대 영역에 입력합니다.

Step 1: 두 영역의 데이터를 서로 바꿔 보기

컨트롤 키를 사용하여 아래의 '영역 1'과 '영역 2'를 선택한 다음 버튼을 눌러 보세요.

영역 1영역 2
11121
21222
31323
41424
51525
61626
71727
81828
91929
102030

버튼을 누를 때마다 두 영역의 값이 서로 위치를 바뀝니다. 이렇게 되도록 해 달라는 질문이시지요?

Step 2: 코드를 보시기 전에…

코드를 보시기 전에… 잠시 머리 속으로 생각을 먼저 정리해 보시기 바랍니다. 어떤 Flow를 거쳐 이런 작업을 할 수 있겠는지 말입니다. 자, 1분만 생각을 해 보신 다음 아래 코드를 보세요. 여러분이 생각하신 방법과 비슷합니까? 그리고 코드가 생각보다 짧습니까 깁니까?

Step 3: ExchangeDataLocation 프로시저

Sub ExchangeDataLocation()
    Dim varThis() As Variant
    Dim varThat() As Variant
    Dim i As Integer
    Dim intNum As Integer
    Dim strErrMsg As String
    '''모두 5개의 변수를 미리 선언해 주었습니다. 여기서 동적 배열 변수를 사용한 것은
    '''왜일까요? 그것은 영역의 크기가 얼마나 될 지, 즉 몇 개의 셀을 선택할 지가 유동적이기
    '''때문에 그런 것입니다.

    Application.ScreenUpdating = False
    strErrMsg = "범위 선택 오류//By Exceller"
    On Error GoTo ET

    If TypeName(Selection) <> "Range" Then
        MsgBox "바꾸려는 범위를 먼저 선택하세요!", vbExclamation, strErrMsg
        Exit Sub
    End If
    '''만약 Range 오브젝트가 아닌 다른 것이 선택되었을 때에는 에러 표시를 하고 프로시저를
    '''종료합니다.

    With Selection
        If .Areas.Count <> 2 Then
            MsgBox "반드시 2개의 영역을 선택하셔야 합니다!", vbExclamation, strErrMsg
            Exit Sub
        End If
        If .Areas(1).Cells.Count <> .Areas(2).Cells.Count Then
            MsgBox "바꾸려는 영역의 크기가 같아야 합니다", vbExclamation, strErrMsg
            Exit Sub
        End If
        '''위의 두 개의 조건문도 사용자가 영역을 잘못 지정하였을 경우에 대비한 Error Trapping
        '''구문입니다. 2개의 영역을 선택하지 않았을 경우나 두 영역의 차원의 크기, 즉 셀 수가 서로
        '''틀릴 경우, 에러 표시를 하고 프로시저를 종료합니다.

        '''나머지 아래 부분은 간단합니다. 각 영역에 속한 셀 값을 동적 배열 변수에 차곡차곡 담은
        '''다음 서로 바꾸어 주는 것입니다.

        intNum = Selection.Areas(1).Cells.Count
        ReDim varThis(intNum)
        ReDim varThat(intNum)
        For i = 1 To intNum
            varThis(i) = .Areas(1).Cells(i)
            varThat(i) = .Areas(2).Cells(i)
        Next i
    End With
        For i = 1 To intNum
            Selection.Areas(1).Cells(i) = varThat(i)
            Selection.Areas(2).Cells(i) = varThis(i)
        Next i
ET:
End Sub

모두 5개의 변수를 미리 선언해 주었습니다. 여기서 동적 배열 변수를 사용한 것은 영역의 크기가 얼마나 될 지, 즉 몇 개의 셀을 선택할 지가 유동적이기 때문입니다. 두 개의 조건문은 사용자가 영역을 잘못 지정하였을 경우에 대비한 Error Trapping 구문으로, 2개의 영역을 선택하지 않았을 경우나 두 영역의 셀 수가 서로 틀릴 경우 에러 표시를 하고 프로시저를 종료합니다. 나머지 부분은 간단합니다. 각 영역에 속한 셀 값을 동적 배열 변수에 차곡차곡 담은 다음 서로 바꾸어 주는 것입니다.

다음 시간에 또…

정리 — 데이터 위치 바꾸기 핵심

구분 사용한 코드 역할
영역 수 확인 Selection.Areas.Count <> 2 두 영역만 허용
크기 확인 Areas(1).Cells.Count <> Areas(2).Cells.Count 영역 크기 일치 확인
배열 준비 ReDim varThis(intNum) 동적 배열 크기 지정
값 담기 varThis(i) = .Areas(1).Cells(i) 영역 1 값 저장
값 교환 Areas(1).Cells(i) = varThat(i) 반대 영역에 입력

자주 묻는 질문 (FAQ)

Q1. 두 영역의 값을 수식으로 한 번에 바꿀 수 있나요?

수식만으로는 값을 서로 맞바꾸기 어려우며 VBA로 배열에 값을 담아 교환하는 방법이 간단합니다.

Q2. 왜 동적 배열 변수를 사용하나요?

선택하는 영역의 크기, 즉 셀 수가 유동적이기 때문입니다.

Q3. 두 영역의 크기가 다르면 어떻게 되나요?

셀 수가 서로 다르면 오류 메시지를 표시하고 프로시저를 종료합니다.

마치며

코드를 보기 전에 작업 순서를 먼저 그려 보고 비교해 보면 VBA 실력이 빠르게 늘어납니다.