- 최초 작성일: 2002-05-07
- 최종 수정일: 2026-09-30
- 조회수: 9 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 지역별 구분행 삽입하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 질문입니다. 일정한 간격으로 행을 삽입하는 방법은 여러 곳에서 찾았는데, 이번에는 간격이 일정하지 않고 자료를 보고 같은 건의 자료가 끝나는 지점마다 행을 삽입하고 싶다는 내용입니다. 예를 들어 연번, 주소1, 주소2 열이 있을 때 주소1과 주소2가 모두 같은 자료가 끝나는 지점(대구 중구, 대구 서구, 대구 북구, 서울 은평구 등이 각각 끝나는 곳)에 새 행을 넣고 싶다는 것입니다. 또한 주소1 앞에 일련번호를 주되 삽입 행 바로 위까지 순서대로 번호를 매기고 삽입 행 다음의 자료부터는 다시 1번부터 번호를 매기고 싶다고 하셨습니다.
이런 경우는 실제 업무에서 자주 발생할 것 같아 한번 다루어 보겠습니다.
지역별 구분행 삽입하기
핵심 요약: 값이 바뀔 때마다 구분 행 삽입
아래에서 위로 비교하며 행을 삽입하면 위치가 밀리지 않고, 삽입이 끝난 뒤 빈 행을 기준으로 연번을 다시 매길 수 있습니다.
- 1단계: SpecialCells(xlTextValues)로 텍스트가 있는 셀 영역을 얻습니다.
- 2단계: 아래에서 위로 비교하며 값이 다른 지점에 행을 삽입합니다.
- 3단계: 위에서 아래로 내려가며 연번을 매기고 빈 행에서 초기화합니다.
Step 1: 실습 데이터
WorkPlace 시트의 2행에 연번, 주소1, 주소2 제목을 두고 3행부터 자료를 입력해 놓았습니다. 아래 코드를 실행하면 주소2가 바뀌는 지점마다 구분 행이 삽입되고 연번이 새로 매겨집니다.
Step 2: InsertRow 프로시저
Sub InsertRow()
Dim rngArea As Range
Dim r As Long
Dim i As Integer
Dim intNum As Integer
Set rngArea = ActiveSheet.Columns(3).SpecialCells(xlTextValues)
' SpecialCells 메서드는 Range 오브젝트 중에서 지정한 유형과 일치하는 값을
' 반환합니다. 즉 100명의 모집단 중에서 30세 이상의 남자만 골라내려면 일단
' 30세 이상인 사람만 손을 들게 하고 남자인지 아닌지를 파악하는 것입니다.
r = rngArea.Rows.Count
intNum = 1
' rngArea 영역의 행 수를 카운팅하여 r 이라는 변수에 담고 intNum 변수에는
' 1이라는 값을 저장합니다.
With rngArea
For i = r To 3 Step -1
' rngArea 영역의 행 수만큼 순환문을 반복 합니다. 이 때 아래쪽부터 차례로
' 검색하는 점에 주의하시기 바랍니다. 이렇게 하는 이유는? 잘 생각해 보세요. ^^
If .Cells(i) = .Cells(i).Offset(-1, 0) Then
' 만약 Cells(i)의 값이 Cells(i).Offset(-1,0)과 같다면, 즉 현재 셀의 값과 바로
' 위의 셀 값이 같다면… 아무 작업도 하지 않고 그렇지 않다면 행을 하나
' 삽입합니다.
Else
.Cells(i).EntireRow.Insert
End If
Next i
For i = 2 To ActiveSheet.UsedRange.Rows.Count
' 주소2에 해당하는 연번을 매깁니다. 이번에는 위에서 부터 아래로 내려가면서
' 작업을 하는군요.
If Not IsEmpty(.Cells(i)) Then
' 셀이 공란이 아니면 왼쪽으로 두 간 이동하여 넘버링을 합니다.
.Cells(i).Offset(0, -2) = intNum
intNum = intNum + 1
Else
intNum = 1
End If
Next i
End With
[A1].Select
MsgBox "구분행을 모두 삽입하였습니다", , "행 삽입 완료//www.iExceller.com"
End Sub
Step 3: 코드 살펴보기
SpecialCells 메서드는 Range 오브젝트 중에서 지정한 유형과 일치하는 셀만 반환합니다. 여기서는 C열에서 텍스트 값이 들어 있는 셀만 대상으로 삼았습니다. 그런 다음 영역의 행 수를 변수에 담고 아래쪽부터 위쪽으로 거슬러 올라가며 현재 셀과 바로 위 셀의 값을 비교합니다. 값이 다르면 그 위치에 행을 삽입하는데, 아래에서부터 작업하는 것은 행을 삽입해도 아직 처리하지 않은 위쪽 행의 위치가 밀리지 않도록 하기 위해서입니다.
행 삽입이 끝나면 이번에는 위에서 아래로 내려가면서 주소2 셀이 비어 있지 않으면 왼쪽으로 두 칸 이동한 셀(A열)에 연번을 매기고, 빈 셀(구분 행)을 만나면 번호를 다시 1로 초기화합니다.
쉽지요? 어려운 것이 하나도 없을 것입니다.
Step 4: 숙제
WorkPlace 시트의 D열에 숫자 값이 함께 들어 있다고 할 경우, 각 구별 합계도 함께 내려면 어떻게 해야 할까요? 직접 연구해 보시기 바랍니다.
오늘은 여기까지…
정리 — 구분행 삽입 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 텍스트 셀 선택 | Columns(3).SpecialCells(xlTextValues) | 텍스트가 있는 셀만 대상 |
| 역순 반복 | For i = r To 3 Step -1 | 행 삽입 시 위치 밀림 방지 |
| 값 비교 | .Cells(i) = .Cells(i).Offset(-1, 0) | 바로 위 셀과 비교 |
| 행 삽입 | .Cells(i).EntireRow.Insert | 구분 행 추가 |
| 연번 매기기 | .Cells(i).Offset(0, -2) = intNum | 두 칸 왼쪽에 번호 |
자주 묻는 질문 (FAQ)
Q1. 행 삽입 시 왜 아래쪽부터 검색하나요?
위쪽부터 행을 삽입하면 아직 검사하지 않은 아래 행들의 위치가 밀려 버려 반복 범위를 다시 계산해야 하기 때문입니다.
Q2. SpecialCells 메서드는 무엇을 하나요?
Range 오브젝트에서 수식, 상수, 텍스트 값, 빈 셀 등 지정한 유형과 일치하는 셀만 골라 돌려줍니다.
Q3. 연번은 어떻게 다시 시작하나요?
삽입한 구분 행은 비어 있으므로 빈 셀을 만나면 intNum을 1로 초기화하고 그다음 셀부터 다시 번호를 매깁니다.
마치며
자료가 바뀌는 지점마다 행을 삽입할 때는 아래에서 위로 작업하는 것이 핵심입니다.