- 최초 작성일: 2006-12-27
- 최종 수정일: 2026-09-30
- 조회수: 10 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 조건별로 데이터 이동하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
즐거운 성탄절 보내셨나요? 이제 올해도 며칠 남지 않았습니다. 한 해 마무리 잘 하시고 새해 계획도 잘 세우시기 바랍니다.
조건별로 데이터 이동하기
핵심 요약: CODE와 같은 이름의 시트로 데이터 이동하기
총괄표의 각 행을 CODE 값과 같은 이름의 시트로 옮기는 VBA 코드입니다. 대상 시트의 마지막 데이터 행을 찾아 그 아래에 값을 넣습니다.
- 1단계: 이름 정의(Start)에서 아래로 이어지는 CODE 영역을 지정합니다.
- 2단계: 셀 값과 이름이 같은 시트를 찾습니다.
- 3단계: 그 시트의 마지막 행 다음에 나머지 열의 데이터를 옮깁니다.
Step 1: 어떤 질문이었을까요?
질문 하나
1.총괄표에서 노란색 부분을 드래그 한 후 VBA를 실행한다.
2.CODE열을 검색 조건으로 하여
H이면H시트의A6에 복사
I이면 I시트의 A6에 복사
J이면 J시트의 A6에 복사
총괄표는 아래와 같은 모양입니다.
| CODE | ACC | FY2005 | FY2004 | 증감 | 증감율 |
|---|---|---|---|---|---|
| H | 단기금융상품 | 2000000 | 1000000 | 1000000 | 1 |
| I | 매출채권 | 3000000 | 1500000 | 1500000 | 1 |
| J | 유형자산 | 4000000 | 2000000 | 2000000 | 1 |
| I | 매출채권 | 5000000 | 2500000 | 2500000 | 1 |
| H | 이자수익 | 6000000 | 3000000 | 3000000 | 1 |
| J | 감가상각비 | 7000000 | 3500000 | 3500000 | 1 |
즉, A4가 H이므로 A4를 제외한 행 전체를 H시트 A6에 복사한다는 얘기입니다. 실행 후 H시트의 최종 결과값은 다음과 같습니다.
| ACC | FY2005 | FY2004 | 증감 | 증감율 |
|---|---|---|---|---|
| 단기금융상품 | 2000000 | 1000000 | 1000000 | 1 |
| 이자수익 | 6000000 | 3000000 | 3000000 | 1 |
여러 고수님들의 자문을 기다립니다.
아래 버튼을 눌러 보세요. H, I, J 시트에 가 보시면 Workplace 시트에 있는 내용이 해당 시트별로 이동되어 있음을 알 수 있을 것입니다. 작성된 코드는 이렇습니다.
Step 2: 코드 살펴보기
Const strID As String = "www.iExceller.com"
Sub MoveData()
Dim wksSheet As Worksheet
Dim rngCell As Range
Dim rngCode As Range
Dim rngData As Range
Dim lngRow As Long
Set rngCode = Range(Range("Start"), Range("Start").End(xlDown))
' 코드가 입력되어 있는 영역을 rngCode라는 변수에 할당합니다.
For Each rngCell In rngCode
For Each wksSheet In Worksheets
If rngCell = wksSheet.Name Then
' 셀의 값(즉 코드 값)과 시트명이 일치하면 데이터를 옮깁니다.
Set rngData = Range(rngCell.Offset(0, 1), rngCell.End(xlToRight))
' B열부터 F열까지에 들어있는 데이터를 rngData 변수에 담습니다.
lngRow = wksSheet.Cells(wksSheet.Rows.Count, 1).End(xlUp).Row + 1
Range(wksSheet.Cells(lngRow, 1), wksSheet.Cells(lngRow, 5)) = rngData.Value
' CODE와 같은 이름을 가진 시트에서 데이터가 들어있는 마지막 행 다음에
' rngData 변수에 들어있는 값을 옮깁니다.
End If
Next wksSheet
Next rngCell
MsgBox "데이터 이동 작업이 완료 되었습니다.", , strID
End Sub
원문 오류 수정: 원본 코드에는 MsgBox에서 strID를 사용하면서도 이 상수를 선언한 부분이 없었습니다. 실행하면 (Option Explicit 사용 시) 오류가 나거나 빈 제목의 메시지 상자가 나타나므로, 코드 맨 위에 Const strID 선언을 추가했습니다.
65536 대신 Rows.Count를 쓰세요. 원본에는 마지막 행을 찾기 위해 Cells(65536, 1)로 적혀 있었습니다. 이는 Excel 2003 이하의 행 수입니다. Excel 2007 이후에는 시트의 행 수가 1,048,576개이므로 wksSheet.Cells(wksSheet.Rows.Count, 1)로 바꾸어 두었습니다. 버전에 관계없이 항상 시트의 맨 아래 행에서 위로 올라가며 마지막 데이터를 찾게 됩니다.
코드는 간단해서 좋습니다만, 그다지 마음에 드는 방법은 아니란 생각이 듭니다. 실무에서는 이런 방법보다는 VB0119 강좌에서 소개해 드린 것과 같은 방법을 사용하시는 것이 좋을 듯 합니다.
다음에 또…
정리 — 조건별 데이터 이동 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| CODE 영역 | Range(Range("Start"), Range("Start").End(xlDown)) | CODE가 입력된 영역을 지정 |
| 시트 찾기 | If rngCell = wksSheet.Name | CODE와 시트 이름이 같은지 비교 |
| 이동할 데이터 | Range(rngCell.Offset(0, 1), rngCell.End(xlToRight)) | CODE 오른쪽의 데이터 영역 |
| 마지막 행 | wksSheet.Cells(wksSheet.Rows.Count, 1).End(xlUp).Row + 1 | 붙여 넣을 첫 빈 행 |
| 값 옮기기 | Range(...) = rngData.Value | 값을 그대로 대입 |
자주 묻는 질문 (FAQ)
Q1. 시트의 마지막 데이터 행은 어떻게 찾나요?
A열의 맨 아래 셀에서 위쪽으로 End(xlUp)을 실행하면 데이터가 있는 마지막 셀을 찾을 수 있습니다. 그 행 번호에 1을 더하면 다음에 데이터를 넣을 행이 됩니다.
Q2. 왜 Cells(65536, 1) 대신 Rows.Count를 쓰나요?
65536은 Excel 2003 이하 버전의 행 수입니다. Excel 2007 이후 버전에서는 1,048,576행이므로 Rows.Count를 사용하면 버전에 관계없이 안전합니다.
Q3. 데이터를 옮길 때 서식까지 함께 복사되나요?
아닙니다. 이 코드는 Value를 대입하므로 값만 옮겨지고 서식은 복사되지 않습니다. 서식도 필요하다면 Copy와 PasteSpecial을 사용해야 합니다.
마치며
CODE 값과 시트 이름을 비교해 데이터를 옮기는 방법은 코드가 간단하다는 장점이 있습니다. 다만 실무에서는 VB0119 강좌에서 소개한 방법을 함께 검토해 보시기 바랍니다.