매달 반복하는 엑셀 작업, 매크로로 줄이는 방법
월말마다 부서별 실적을 취합하고 금액 열에 쉼표를 넣은 뒤, 제목 행을 강조하고 합계 금액을 확인하는 업무가 있다고 가정해 보겠습니다. 데이터가 20행이라면 금방 끝나지만, 500행이 넘는 자료를 매달 같은 방식으로 정리한다면 작업 시간이 늘어나고 서식을 빠뜨릴 가능성도 커집니다.
이럴 때 활용할 수 있는 기능이 엑셀 매크로입니다. 매크로 기록 기능으로 반복 동작을 저장할 수 있고, VBA 코드를 사용하면 데이터의 마지막 행을 찾아 여러 행에 같은 서식을 적용하거나 예상하지 못한 합계 행을 검사하는 작업까지 자동화할 수 있습니다.
이번 글에서는 테스트용 실적 자료를 기준으로 매크로 기록부터 VBA 실행, 결과 검증, 오류 예방까지 직접 따라 해 보겠습니다. 실제 회사 자료 대신 가상의 데이터를 사용하므로 업무 환경에 영향을 주지 않고 연습할 수 있습니다.
1. 자동화할 작업을 먼저 정하기
이번 예제에서는 부서별 월간 실적 자료를 정리합니다. 엑셀 시트의 A열부터 D열까지 다음과 같이 구성합니다.
| 부서 | 담당자 | 건수 | 금액 |
|---|---|---|---|
| 영업1팀 | 담당A | 12 | 1250000 |
| 영업2팀 | 담당B | 8 | 980000 |
| 관리팀 | 담당C | 15 | 2100000 |
| 영업3팀 | 담당D | 6 | 750000 |
1행은 열 제목이며, 2행부터 실제 데이터가 시작됩니다. 이 자료를 자동화할 때 목표는 다음과 같습니다.
- 1행의 제목을 굵게 표시하고 배경색을 적용합니다.
- D열의 금액에 천 단위 구분 기호를 적용합니다.
- A:D 범위에서 실제 데이터의 마지막 행을 찾습니다.
- 마지막 행에 합계가 포함되어 있으면 임의로 서식을 적용하지 않고 중단합니다.
여기서 주의할 점은 합계 행이 항상 C열에 있는 것은 아니라는 사실입니다. A열에 ‘합계’라고 표시되거나 D열에 ‘총계’가 들어갈 수도 있습니다. 따라서 특정 셀 하나만 검사하는 코드보다 A 범위 전체를 살펴보는 편이 안전합니다.
2. 매크로 기록 기능으로 반복 동작 저장하기
먼저 코드를 작성하지 않고도 자동화의 기초를 익힐 수 있는 매크로 기록 기능을 사용해 보겠습니다.
1단계. 매크로 기록 메뉴 표시하기
엑셀에서 테스트용 통합 문서를 열고 다음 순서로 진행합니다.
- 상단 메뉴에서 ‘파일 → 옵션 → 리본 사용자 지정’으로 이동합니다.
- 오른쪽 목록에서 ‘개발 도구’를 선택하고 확인합니다.
- ‘개발 도구 → 매크로 기록’을 클릭합니다.
- 매크로 이름에
FormatHeader를 입력합니다. 이름에 공백은 넣지 않습니다. - 매크로 저장 위치는 현재 통합 문서를 선택합니다.
엑셀 버전에 따라 메뉴 이름이나 배치가 조금 다를 수 있습니다. 매크로를 기록하는 동안에는 실제로 수행하는 동작이 그대로 저장되므로 불필요한 클릭은 피하는 편이 좋습니다.
2단계. 제목 행 서식 적용하기
기록이 시작되면 A1을 선택하고 다음 작업을 수행합니다.
- 글꼴을 굵게 설정합니다.
- 제목 행에 연한 배경색을 적용합니다.
- 텍스트를 가운데 정렬합니다.
- ‘개발 도구 → 기록 중지’를 누릅니다.
이제 FormatHeader 매크로를 실행하면 기록한 제목 행 서식이 다시 적용됩니다.
다만 이 매크로는 제목 행을 꾸미는 동작만 저장합니다. D2 한 셀의 서식을 기록했다면 다른 금액 셀까지 자동으로 처리하지는 않습니다. 전체 데이터에 같은 서식을 적용하려면 반복 범위를 지정하거나 VBA로 마지막 행을 찾아 처리해야 합니다.
3단계. 금액 전체에 서식을 기록하려면
금액 열 전체를 대상으로 기록하려는 경우에는 기록을 시작한 뒤 D2부터 마지막 데이터 행까지 범위를 선택합니다. 예를 들어 데이터가 5행까지 있다면 D2를 선택하고 셀 서식에서 숫자 형식을 사용자 지정 #,##0으로 설정합니다.
기록을 중지한 뒤 실행하면 해당 범위에 서식이 적용됩니다. 단, 기록 당시 선택한 범위가 고정되어 있다면 다음 달에 데이터가 추가되어도 새로운 행까지 자동으로 확장되지 않을 수 있습니다.
이 한계를 해결하는 방법이 다음 단계의 VBA 자동화입니다.

3. VBA로 마지막 행까지 자동 처리하기
VBA는 엑셀의 작업을 코드로 지정하는 방식입니다. 이번에는 A 범위에서 마지막 데이터 행을 찾고, 합계 행이 발견되면 작업을 중단하도록 만들겠습니다.
1단계. 테스트 파일을 매크로 사용 통합 문서로 저장하기
먼저 원본과 분리된 테스트 파일을 준비합니다.
- ‘다른 이름으로 저장’을 선택합니다.
- 파일 형식을 ‘Excel 매크로 사용 통합 문서 (*.xlsm)’로 지정합니다.
- 파일 이름을
monthly_report_test.xlsm으로 저장합니다. - Alt+F11을 눌러 VBA 편집기를 엽니다.
- ‘삽입 → 모듈’을 선택합니다.
아래 코드를 새 모듈에 붙여 넣습니다.
Option Explicit
Sub FormatMonthlyReport()
Dim ws As Worksheet
Dim lastCell As Range
Dim lastRow As Long
Dim r As Long
Dim c As Long
Dim cellText As String
Set ws = ActiveSheet
' A:D 범위에서 마지막으로 사용된 셀 찾기
Set lastCell = ws.Range("A:D").Find( _
What:="*", _
After:=ws.Range("A1"), _
LookIn:=xlFormulas, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False)
' 제목만 있거나 시트가 비어 있으면 중단
If lastCell Is Nothing Then
MsgBox "A:D 범위에 데이터가 없습니다.", vbExclamation
Exit Sub
End If
lastRow = lastCell.Row
If lastRow < 2 Then
MsgBox "제목 아래에 처리할 데이터가 없습니다.", vbExclamation
Exit Sub
End If
' A:D의 마지막 행에서 합계 여부 확인
For c = 1 To 4
cellText = Trim(CStr(ws.Cells(lastRow, c).Value2))
If InStr(1, cellText, "합계", vbTextCompare) > 0 _
Or InStr(1, cellText, "총계", vbTextCompare) > 0 _
Or InStr(1, cellText, "소계", vbTextCompare) > 0 Then
MsgBox "마지막 행에 합계·총계·소계 표시가 있습니다." & _
vbCrLf & "서식을 적용하지 않았습니다.", vbExclamation
Exit Sub
End If
Next c
' 제목 행 서식
With ws.Range("A1:D1")
.Font.Bold = True
.Interior.Color = RGB(221, 235, 247)
.HorizontalAlignment = xlCenter
End With
' 금액 열 전체에 천 단위 구분 기호 적용
ws.Range("D2:D" & lastRow).NumberFormat = "#,##0"
MsgBox "서식 적용 완료: 2행부터 " & lastRow & "행까지", vbInformation
End Sub
2단계. 코드가 실제로 처리하는 범위 확인하기
이 코드는 마지막 행을 찾을 때 A 범위만 검색합니다. E열 이후의 데이터는 마지막 행 판별에 사용하지 않습니다. 따라서 실제 업무 자료가 E열까지 이어진다면 검색 범위를 그 구조에 맞게 수정해야 합니다.
합계 검사 역시 A의 마지막 행에 있는 셀을 대상으로 합니다. 마지막 행의 어느 열에든 ‘합계’, ‘총계’, ‘소계’라는 문구가 있으면 작업을 중단합니다. 이 방식은 합계 행의 위치가 C열로 고정되지 않은 자료에도 대응합니다.
다만 합계 행이 데이터 중간에 있거나, 마지막 행에 합계 문구 없이 숫자만 들어 있다면 이 검사는 이를 확실하게 판별하지 못합니다. 이번 예제에서는 합계 행이 마지막에 있고 위의 표시 문구를 포함한다는 업무 규칙을 전제로 합니다.
또한 이 코드는 데이터 내용을 정렬하거나 삭제하지 않습니다. 제목 행 서식과 D열의 숫자 표시 형식만 변경합니다.
3단계. 매크로 실행하기
- VBA 편집기를 닫고 엑셀로 돌아옵니다.
- Alt+F8을 누릅니다.
FormatMonthlyReport를 선택합니다.- ‘실행’을 클릭합니다.
- 완료 메시지가 표시되는지 확인합니다.
매크로가 실행되면 제목 행이 강조되고 D열의 금액이 천 단위 구분 기호로 표시됩니다. 예를 들어 숫자 1250000은 1,250,000으로 보입니다. 이는 표시 형식을 변경한 결과이며 셀에 저장된 실제 숫자 자체를 바꾸는 작업은 아닙니다.

4. 실행 전후 비교: 무엇이 달라지는가?
테스트 데이터가 500행까지 있다고 가정해 보겠습니다. 아래는 코드의 동작을 이해하기 위한 예시이며, 실제 측정 결과가 아니라 처리 범위와 표시 형식의 비교입니다.
| 항목 | 실행 전 | 실행 후 |
|---|---|---|
| 제목 행 | 일반 글꼴 | 굵은 글꼴·배경색·가운데 정렬 |
| D2 금액 | 1250000 | 1,250,000 |
| D500 금액 | 980000 | 980,000 |
| 데이터 범위 | 행마다 수동 확인 | A:D의 마지막 사용 행을 탐색 |
| 마지막 행에 합계 표시 | 별도 확인 필요 | 감지 시 서식 적용 중단 |
실제 시간 절감 효과는 데이터 크기, 기존 서식 상태, PC 성능과 검수 방식에 따라 달라집니다. 작은 자료에서는 절약 시간이 크지 않을 수 있지만, 동일한 형식의 자료를 반복해서 처리한다면 매번 범위를 선택하고 서식을 적용하는 단계를 줄일 수 있습니다.
5. 실행 전 반드시 확인할 테스트 4가지
코드가 정상적으로 실행되는지 확인하려면 성공 사례만 테스트해서는 안 됩니다. 아래 네 가지 상황을 별도의 복사본에서 확인합니다.
테스트 1. 빈 셀과 빈 시트
A에 아무 값도 없는 시트에서 매크로를 실행합니다. 데이터가 없다는 안내가 표시되고 오류 없이 종료되어야 합니다.
테스트 2. 제목만 있는 시트
A1에 제목만 입력하고 2행 이후는 비워 둡니다. 데이터가 없다는 안내가 표시되어야 하며, 제목 행만 있는 자료를 정상적인 실적 데이터로 처리해서는 안 됩니다.
테스트 3. 다른 열에 합계가 있는 시트
마지막 행의 A열에 ‘합계’, B열에 ‘월간 총계’ 또는 D열에 ‘소계’를 입력한 복사본을 준비합니다. 각 경우에 매크로가 중단되는지 확인합니다.
이 검사는 합계 문구가 C열에만 있다는 가정을 피하기 위한 것입니다. 마지막 행에 해당 문구가 포함된 경우에만 감지하며, 중간 행의 합계나 표시 문구가 없는 합계는 별도로 관리해야 합니다.
테스트 4. 열 제목이 변경된 시트
D1의 ‘금액’을 ‘비고’로 바꾸고 실행해 봅니다. 현재 코드는 열 제목을 확인하지 않으므로 D열이 비고 열로 변경되어도 해당 열에 숫자 형식을 적용합니다. 즉, 이 코드는 열 제목이 바뀌어도 자동으로 올바른 금액 열을 찾아주는 범용 도구가 아닙니다.
실무에 적용할 때는 열 제목을 확인하는 검증을 추가하거나, 회사에서 정한 고정 서식의 파일에만 사용해야 합니다.
6. 매크로 자동화에서 자주 놓치는 부분
표시 형식과 실제 데이터는 다릅니다
숫자 표시 형식 #,##0은 소수점 없이 천 단위 구분 기호를 보여 줍니다. 원 단위 금액을 보기 좋게 표시할 때는 적절하지만, 소수점이 필요한 단가나 비율에는 맞지 않을 수 있습니다. 원본 숫자를 반올림하거나 삭제하는 작업과 혼동하지 않아야 합니다.
마지막 행 탐색 기준을 통일합니다
이번 코드는 A 범위의 마지막 사용 행을 찾습니다. 다른 코드나 설명에서 D열만 검색하거나 A를 검색하도록 바꾸면 처리 범위가 달라질 수 있습니다. 실제 자료 구조와 일치하도록 검색 범위를 통일해야 합니다.
합계 행을 자동으로 제외한다고 과신하지 않습니다
마지막 행에 합계·총계·소계 문구가 있다면 중단하도록 설계했지만, 모든 형태의 합계 행을 완벽하게 알아내는 코드는 아닙니다. 합계가 중간에 있거나 표시 문구 없이 숫자만 있다면 별도 검증이 필요합니다. 특히 회사의 정산 자료는 매크로 실행 후 합계와 원본 값을 대조해야 합니다.
반복 실행 전에 원본을 보존합니다
매크로를 수정하거나 처음 실행할 때는 원본을 직접 덮어쓰지 말고 복사본에서 테스트합니다. 매크로는 편리하지만 잘못 지정한 범위에 서식을 적용하거나 데이터를 변경하도록 작성되면 오류도 반복해서 실행할 수 있습니다.
7. 개인정보와 사내 보안을 고려한 사용법
엑셀 파일에 고객명, 전화번호, 계좌번호, 급여, 거래처별 계약 금액 등이 포함되어 있다면 매크로 실행과 별개로 데이터 취급 규정을 확인해야 합니다.
- 실습과 코드 검증에는 가상의 이름과 금액을 사용합니다.
- 회사에서 승인하지 않은 외부 AI 서비스에 실제 업무 파일이나 개인정보를 업로드하지 않습니다.
- 매크로 파일은 신뢰할 수 있는 출처에서 받은 것만 사용하고, 출처가 불분명한 파일의 매크로는 실행하지 않습니다.
- 회사에서 VBA 실행을 제한하거나 승인 절차를 두었다면 해당 규정을 따릅니다.
- 원본 보존, 결과 대조, 실행 기록 등 회사의 자료 관리 절차를 유지합니다.
특히 인터넷에서 받은 VBA 코드는 파일을 삭제하거나 외부 프로그램을 실행하는 명령을 포함할 수도 있습니다. 이번 예제는 셀의 서식만 변경하도록 작성했지만, 다른 코드도 같은 수준으로 안전하다고 가정해서는 안 됩니다.
FAQ: 엑셀 매크로를 사용할 때 자주 묻는 질문
Q1. 매크로가 포함된 파일은 어떤 형식으로 저장해야 하나요?
VBA 매크로를 보존하려면 일반적으로 Excel 매크로 사용 통합 문서인 .xlsm 형식으로 저장합니다. .xlsx 형식으로 저장하면 VBA 코드가 유지되지 않을 수 있으므로 저장 시 파일 형식을 확인해야 합니다.
Q2. 매크로를 실행했는데 보안 경고가 표시되면 어떻게 해야 하나요?
경고를 무조건 해제하지 말고 파일의 출처와 코드를 먼저 확인합니다. 회사 PC에서는 IT 담당자나 보안 담당자의 승인 절차를 따릅니다. 신뢰할 수 없는 매크로를 실행하기 위해 보안 설정을 낮추는 것은 권장하지 않습니다.
Q3. 매크로를 사용하면 개인정보가 자동으로 외부에 전송되나요?
이번 예제의 코드는 엑셀 셀의 서식만 변경하며 외부 전송 기능을 포함하지 않습니다. 다만 모든 매크로가 동일한 것은 아닙니다. 외부 통신이나 파일 전송 명령이 있는 코드도 있으므로 실제 코드를 검토해야 합니다. 또한 엑셀 파일을 외부 AI 서비스에 올리거나 공유하는 경우에는 별도의 개인정보 및 사내 규정이 적용됩니다.
마무리: 작은 반복 작업부터 자동화하기
엑셀 매크로를 처음 도입한다면 월간 실적 자료의 제목 행과 금액 서식을 자동으로 맞추는 것처럼 결과를 쉽게 검증할 수 있는 작업부터 시작하는 편이 좋습니다.
이번 예제의 VBA는 A 범위에서 마지막 행을 찾고, 마지막 행의 합계 관련 문구를 확인한 뒤, 제목 행과 금액 열에 서식을 적용합니다. 빈 시트와 제목만 있는 시트, 열 제목 변경, 합계 행 위치를 바꾼 사례를 테스트한 다음 실제 업무에 적용해야 합니다.
자동화의 목표는 단순히 클릭 수를 줄이는 데 있지 않습니다. 같은 입력에 대해 일관된 결과를 얻고, 오류가 발생했을 때 원인을 추적할 수 있도록 만드는 것입니다. 검증 가능한 작은 매크로 하나부터 시작하면 반복적인 엑셀 업무를 더 안정적으로 관리할 수 있습니다.



























