- 최초 작성일: 2007-10-31
- 최종 수정일: 2026-09-30
- 조회수: 19 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 행 삽입 후 값 채우기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
질문 하나
행간 동일 인물 비교 후 빈 셀 삽입하고 동일인 기본 데이타 빈 셀에 넣는 방법 좀 부탁드립니다. 전임자가 만들어 놨는데 이해도 안가고… 내용은 첨부파일 안에 설명 하였습니다.. 고수님들의 한수 가르침 부탁드립니다.
이름, 사원번호, 주소를 비교하여 동일인이 나타났을 때, 마지막 동일인 다음줄에 빈 줄을 삽입하고, 삽입된 빈 줄 위의 성명, 사원번호 ,주소 데이터를 삽입된 빈 줄에 넣습니다. 한 명일 경우에도 다음 줄에 위와 동일하게 빈 줄을 삽입하고 윗 줄의 성명, 사원번호, 주소 데이터를 넣어야 합니다.
회사에서 CRM이나 KM(Knowledge Management) 시스템을 구축해 놓아도 제대로 정착하는 사례를 찾기 어려운 이유가 바로 여기에 있지 않나 생각됩니다.
인프라는 많은 돈과 시간을 들이면 누구나 삐까뻔쩍하게 구축할 수 있지만 그것을 활용하는 사람들의 마인드가 뒷받침되지 않으면 절대로 성공할 수 없습니다.
우리는 흔히 자신이 회사 생활을 하면서 축적한 고객 정보나 업무 노하우, 각종 스킬, 이런 것들을 자신만의 경쟁력이라고 생각하는 경향이 있습니다. 하지만… 과연 직장 생활을 하면서 얻은 이러한 지식들이 온전히 자신만의 것이라 자신있게 말할 수 있을까요?
내가 가진 지식을 공개하지 않으면 다른 사람도 공개하지 않을 것입니다! 내가 아는 것이 전부인양 숨겨놓고 안주하고 있으면 그 이상 발전하기 어렵습니다.
내가 지금 보유하게 된 지식도 조직이라는 울타리 안에서, 다른 동료들이 벌어준 돈을 투자하여 얻게 된 것입니다.
내가 아는 지식을 나누면 언젠가는, 어떤 형태로든 복리로 되돌려 받게 됩니다. 지식은 나누는 것은 남을 위한 것이 아니라 바로 나 자신을 위한 것입니다.
Exceller는 데이터베이스와 관련된 문제나 정보 공유가 잘 안된다는 얘기만 나오면 흥분하는 경향이 없지 않습니다(평소에는 전혀 그렇지 않은데… ^^;).
흥분을 가라 앉히고… 문제를 해결해 보도록 하지요.
행 삽입 후 값 채우기
핵심 요약: 동일인 아래에 빈 행을 넣고 위 데이터로 채우기
사원번호가 같은 데이터 그룹의 마지막 행 다음에 빈 행을 삽입하고, 삽입된 행을 바로 위 행의 성명·사원번호·주소로 채우는 매크로입니다.
- 1단계: 사원번호 열의 값이 있는 영역을 작업 대상으로 지정합니다.
- 2단계: 아래에서 위로 순환하면서 사원번호가 바뀌는 지점에 행을 삽입합니다.
- 3단계: 빈 행을 찾아 바로 위 행의 값을 채우고 표 서식을 적용합니다.
Step 1: 동일 사원번호 아래에 행 삽입하고 값 채우기
예제 파일에서 버튼을 클릭하면 아래 코드가 실행됩니다. 사원번호가 바뀌는 지점마다 빈 행을 삽입하고, 삽입된 빈 행에 바로 위 행의 데이터를 채워 넣는 코드입니다.
Sub FillUpperContent()
Dim rngArea As Range
Dim r As Long
Dim i As Integer
Dim intNum As Integer
Dim strSerial As String, strName As String, strNumber As String
Dim strAddress As String, strCategory As String
On Error GoTo ET
'작업 할 워크시트로 이동합니다.
Application.Goto Sheets("Workplace").Range("A1"), True
MsgBox "중복된 사원번호가 발견되면 행을 삽입합니다.", , "www.iExceller.com"
Set rngArea = ActiveSheet.Columns(3).SpecialCells(xlTextValues)
'활성화 된 시트의 3번째 컬럼(사원번호) 중에서 값이 들어있는 셀을 작업 영역으로 설정합니다.
r = rngArea.Rows.Count
intNum = 1
With rngArea
For i = r To 3 Step -1
If .Cells(i) = .Cells(i).Offset(-1, 0) Then
'사원번호를 기준으로 동일 자료 여부 점검합니다.
Else
.Cells(i).EntireRow.Insert
'바로 위 데이터와 같은 값이 발견되면 행을 하나 삽입합니다.
End If
Next i
For i = 2 To ActiveSheet.UsedRange.Rows.Count + 1
If IsEmpty(.Cells(i)) Then
'rngArea 영역에서 공란 셀이 발견되면 바로 위 데이터 값을 가져옵니다.
.Cells(i, 0) = .Cells(i, 0).Offset(-1, 0)
.Cells(i, 1) = .Cells(i, 0).Offset(-1, 1)
.Cells(i, 2) = .Cells(i, 0).Offset(-1, 2)
.Cells(i, 3) = .Cells(i, 0).Offset(-1, 3)
.Cells(i, 4) = .Cells(i, 0).Offset(-1, 4)
.Cells(i, 5) = .Cells(i, 0).Offset(-1, 5)
intNum = intNum + 1
Else
intNum = 1
End If
Next i
End With
'엑셀 2007의 표 기능을 적용합니다. 이전 버전의 경우에는 '자동 서식' 기능을 사용하면 됩니다.
ActiveSheet.ListObjects.Add(xlSrcRange, Range("A1").CurrentRegion, , xlYes).Name = "표1"
ActiveSheet.ListObjects("표1").TableStyle = "TableStyleMedium7"
ET:
'오류 발생 시에 대비한 에러 트래핑 구문입니다. 거의 하나의 공식처럼 사용되니까 눈여겨 보세요.
If Err.Number <> 0 Then
MsgBox Err.Description, , "오류 번호: " & Err.Number
Err.Clear
End If
End Sub
원문 오류 수정: 코드 끝의 오류 처리 구문이 MsgBox Err.Description, "오류 번호: " & Err.Number로 되어 있었습니다. MsgBox의 두 번째 인수는 버튼 종류(숫자)이므로 제목을 넣으려면 쉼표를 하나 더 넣어 MsgBox Err.Description, , "오류 번호: " & Err.Number로 써야 합니다. 그대로 바로잡았습니다.
참고 - 코드의 흐름: 첫 번째 For 순환문은 아래에서 위로 거슬러 올라가며 사원번호가 바로 위 행과 다른 지점에 행을 삽입합니다. 위에서 아래로 진행하면 행이 삽입될 때마다 행 번호가 밀려 꼬이기 때문에 반드시 아래에서 위로 진행해야 합니다. 두 번째 순환문은 비어 있는 행을 찾아 바로 위 행의 값을 복사해 채웁니다.
시이~월의 마지막 밤, 아니 낮이로군요. 한달 마무리 잘 하시고 11월에 다시 뵙겠습니다.
다음 시간에 또…
정리 — 행 삽입 후 값 채우기 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 작업 영역 | Columns(3).SpecialCells(xlTextValues) | 사원번호 열에서 값이 있는 셀만 지정 |
| 동일인 판단 | .Cells(i) = .Cells(i).Offset(-1, 0) | 사원번호가 바로 위 행과 같은지 비교 |
| 행 삽입 | .Cells(i).EntireRow.Insert | 사원번호가 달라지는 위치에 빈 행 삽입 |
| 값 채우기 | .Cells(i, 0) = .Cells(i, 0).Offset(-1, 0) | 빈 행에 바로 위 행의 값을 복사 |
| 표 서식 | ListObjects.Add(xlSrcRange, ...) | 엑셀 2007의 표 기능으로 서식 적용 |
자주 묻는 질문 (FAQ)
Q1. 행을 삽입하는 순환문을 아래에서 위로 돌리는 이유는 무엇인가요?
위에서 아래로 순환하면서 행을 삽입하면 삽입할 때마다 아래쪽 행 번호가 밀려서 검사할 행이 어긋납니다. 아래에서 위로 진행하면 아직 검사하지 않은 위쪽 행 번호는 바뀌지 않으므로 안전합니다.
Q2. 사원번호 대신 다른 열을 기준으로 하려면 어떻게 하나요?
작업 영역을 지정하는 Columns(3) 부분을 기준으로 삼을 열 번호로 바꾸면 됩니다. 값을 채우는 Cells(i, 0) ~ Cells(i, 5) 구문도 열 위치에 맞게 함께 조정해 주세요.
Q3. 엑셀 2007 이전 버전에서는 표 서식을 어떻게 적용하나요?
표(ListObjects) 기능은 엑셀 2007에서 추가되었습니다. 이전 버전에서는 자동 서식 기능을 사용하면 비슷한 결과를 얻을 수 있습니다.
마치며
행을 삽입하는 작업은 아래에서 위로 진행해야 꼬이지 않는다는 점만 기억해 두면 어렵지 않습니다. 여러분의 데이터 구조에 맞게 기준 열과 채울 열을 바꿔서 활용해 보세요!