- 최초 작성일: 2002-01-30
- 최종 수정일: 2026-09-30
- 조회수: 10 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 데이터 위치 바꾸기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 게시판에 올라온 질문 하나를 살펴봅니다.
안녕하세요?
마방진의 내용을 보다가 일정한 표에서 데이터를 좌우로 바꿔야 할 때가 있더군요.
왼쪽에 있는 것을 오른 쪽으로, 또 오른 쪽에 있는 것을 왼 쪽으로 옮긴 후 계산을 하는데 엑셀의 수식으로 한번에 바꾸기 할 수 있는지요. 즉,
이런 자료를
| 1 | 4 | 7 |
| 2 | 5 | 8 |
| 3 | 6 | 9 |
과 같이요.
| 7 | 4 | 1 |
| 8 | 5 | 2 |
| 9 | 6 | 3 |
꼭 알려 주시면 고맙겠습니다. 안녕히!!!
데이터 위치 바꾸기
핵심 요약: 두 영역의 값 맞바꾸기
Selection.Areas로 두 영역을 얻어 각 셀 값을 배열에 담아 두었다가 서로 바꾸어 넣으면 됩니다.
- 1단계: Range 오브젝트인지, 영역이 2개인지, 셀 수가 같은지 확인합니다.
- 2단계: 두 영역의 값을 동적 배열 변수에 각각 담습니다.
- 3단계: 배열 값을 반대 영역에 입력합니다.
Step 1: 두 영역의 데이터를 서로 바꿔 보기
컨트롤 키를 사용하여 아래의 '영역 1'과 '영역 2'를 선택한 다음 버튼을 눌러 보세요.
| 영역 1 | 영역 2 | |
|---|---|---|
| 1 | 11 | 21 |
| 2 | 12 | 22 |
| 3 | 13 | 23 |
| 4 | 14 | 24 |
| 5 | 15 | 25 |
| 6 | 16 | 26 |
| 7 | 17 | 27 |
| 8 | 18 | 28 |
| 9 | 19 | 29 |
| 10 | 20 | 30 |
버튼을 누를 때마다 두 영역의 값이 서로 위치를 바뀝니다. 이렇게 되도록 해 달라는 질문이시지요?
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 실력이 빠르게 늘어납니다.