엑셀 매크로 버튼 만들기: 집계 결과와 오류까지 확인하기

버튼이 눌리는 것과 올바른 집계가 끝나는 것은 서로 다른 확인입니다. 여기서는 8건의 가상 매출을 집계하는 매크로를 먼저 직접 실행하고, 같은 매크로를 버튼에 연결합니다. 마지막에는 잘못된 금액을 넣어 이전 합계가 새 결과처럼 남지 않는지 살펴봅니다.

합계 840000을 만들 8건의 입력

practice-59.xlsx의 Input!A1:D9는 ID·담당·채널·금액 표입니다. B001부터 B008까지의 금액은 120000,95000,80000,110000,90000,125000,100000,120000으로 합계 840000입니다. 실매출·실고객 자료가 아닙니다. Result!C2=8, C3=840000은 독립 기대값입니다. B2:B4는 실제 결과·실행 시각용으로 비웠고 B5는 NOT RUN입니다.

실험 입력 변경 기대 결과
기본 8건 그대로 8건 / 840000
금액 변경 Input!D2를 130000 8건 / 850000
빈 입력 A2:D9 값 모두 지움 0건 / 0
문자 금액 D2에 문자 '120000 ERROR, 실제값 비움
ID 누락 A9만 지우고 D9 유지 ERROR, 실제값 비움

기본 8건에 한 행이 완전히 비어 있으면 그 행은 건너뜁니다. 반면 금액이 있는데 ID만 비어 있으면 오류입니다. 숨김이나 필터 여부와 관계없이 입력 행을 집계하며 ID 중복은 검사하지 않습니다.

버튼을 만들기 전에 매크로를 직접 실행하기

매크로를 보관할 사본은 Excel 매크로 사용 통합 문서(.xlsm)로 저장합니다. ZIP의 ButtonSummary.bas를 그 프로젝트의 표준 모듈로 가져옵니다. 배포 XLSX에는 매크로나 버튼이 들어 있지 않습니다.

  1. Input의 8건과 Result의 독립 기대값을 선택해 확인한 뒤 매크로 목록에서 RunSummary를 실행합니다. B2=8, B3=840000, B4의 새 시각, B5=OK를 확인합니다. D2:D3도 '일치'여야 합니다. 계산 모드가 수동이면 Result 수식을 다시 계산한 뒤 비교합니다.

  2. Result의 빈 공간을 선택하고 개발 도구의 양식 컨트롤 단추를 삽입합니다. 매크로 지정에서 같은 사본의 RunSummary를 고릅니다. 양식 컨트롤 버튼에 매크로를 지정하면 클릭으로 해당 작업을 실행할 수 있습니다. 버튼 이름만 바꾸고 다른 파일의 매크로를 연결하지 않았는지 확인합니다.

  3. Input!D2=130000으로 바꾸고 기대값 Result!C3=850000을 먼저 입력합니다. 버튼을 누른 뒤 합계·시각·대조 표시가 바뀌는지 확인합니다. 저장하고 다시 연 뒤에도 같은 사본의 버튼과 매크로가 연결돼 있는지 직접 검증합니다.

조직이 매크로 실행을 차단했다면 우회 설정을 안내하는 대신 허용된 환경을 확보하세요. 직접 실행도 실패하는 상태에서 버튼만 다시 만드는 것은 해결책이 아닙니다.

집계와 실패 처리가 들어 있는 전체 코드

Range.Value2는 셀 값을 읽고 쓰는 Variant 속성입니다. 아래 모듈은 ThisWorkbook의 Input만 읽고 Result!B2:B5에 결과를 씁니다. 활성 시트 이름에 기대지 않으며 자동 저장이나 외부 전송은 하지 않습니다. 숫자로 저장된 0~1000000000의 정수 금액을 받는 연습 계약이고, 숫자처럼 보이는 문자는 거부합니다.

Attribute VB_Name = "ButtonSummary"
Option Explicit

Public Sub RunSummary()
    Const MAX_LAST_ROW As Long = 10001
    Dim wsInput As Worksheet, wsResult As Worksheet
    Dim lastRow As Long, rowNo As Long, colNo As Long, candidate As Long
    Dim itemCount As Long, amountTotal As Double, amount As Variant
    Dim output(1 To 3, 1 To 1) As Variant
    Dim savedScreen As Boolean, savedEvents As Boolean, resultReady As Boolean
    Dim problem As String

    savedScreen = Application.ScreenUpdating
    savedEvents = Application.EnableEvents
    On Error GoTo HandleError

    Set wsResult = ThisWorkbook.Worksheets("Result")
    If wsResult.ProtectContents Then
        Err.Raise vbObjectError + 591, , "Use an unprotected practice Result sheet."
    End If
    resultReady = True
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    wsResult.Range("B2:B4").ClearContents
    wsResult.Range("B5").Value2 = "RUNNING"
    Set wsInput = ThisWorkbook.Worksheets("Input")

    lastRow = 1
    For colNo = 1 To 4
        candidate = wsInput.Cells(wsInput.Rows.Count, colNo).End(xlUp).Row
        If candidate > lastRow Then lastRow = candidate
    Next colNo
    If lastRow > MAX_LAST_ROW Then
        Err.Raise vbObjectError + 592, , "Practice limit: use rows 2 through 10001 only."
    End If

    For rowNo = 2 To lastRow
        If Application.WorksheetFunction.CountA(wsInput.Range( _
                wsInput.Cells(rowNo, 1), wsInput.Cells(rowNo, 4))) > 0 Then
            For colNo = 1 To 4
                If IsError(wsInput.Cells(rowNo, colNo).Value2) Then
                    Err.Raise vbObjectError + 593, , "Cell error at row " & rowNo
                End If
            Next colNo
            If Len(Trim$(CStr(wsInput.Cells(rowNo, 1).Value2))) = 0 Then
                Err.Raise vbObjectError + 594, , "Missing ID at row " & rowNo
            End If
            amount = wsInput.Cells(rowNo, 4).Value2
            Select Case VarType(amount)
                Case vbByte, vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbDecimal
                Case Else
                    Err.Raise vbObjectError + 595, , "Numeric amount required at row " & rowNo
            End Select
            If amount < 0 Or amount > 1000000000# Or amount <> Fix(amount) Then
                Err.Raise vbObjectError + 596, , "Whole amount from 0 to 1000000000 required at row " & rowNo
            End If
            itemCount = itemCount + 1
            amountTotal = amountTotal + CDbl(amount)
        End If
    Next rowNo

    output(1, 1) = itemCount
    output(2, 1) = amountTotal
    output(3, 1) = Now
    wsResult.Range("B2:B4").Value = output
    wsResult.Range("B5").Value2 = "OK"

CleanExit:
    Application.EnableEvents = savedEvents
    Application.ScreenUpdating = savedScreen
    Exit Sub

HandleError:
    problem = Err.Description
    On Error Resume Next
    If resultReady Then
        wsResult.Range("B2:B4").ClearContents
        wsResult.Range("B5").Value2 = "ERROR"
    End If
    Application.EnableEvents = savedEvents
    Application.ScreenUpdating = savedScreen
    On Error GoTo 0
    MsgBox "Summary failed: " & problem, vbExclamation
End Sub

입력 오류 뒤 오래된 합계를 지우고 복구하기

실행을 시작하면 B2:B4를 지우고 RUNNING을 표시합니다. 검증이 끝나면 건수·합계·시각을 쓰고 OK로 바꿉니다. 이 OK는 입력 검증과 쓰기 경로를 지났다는 표시이므로 합계가 업무상 맞다는 독립 증명은 아닙니다. C열 기대값과 직접 비교하는 이유입니다.

새 사본에서 D2에 문자 '120000을 넣고 실행해 보세요. 정상적인 실패 처리라면 ERROR와 빈 B2:B4가 남아야 합니다. 금액을 실제 숫자로 고친 뒤 다시 실행하고 원래 합계 840000을 대조합니다. 시트 누락이나 보호 때문에 결과 칸에 쓸 수 없을 때는 오래된 표시를 지울 수도 없습니다. 메시지를 우선 읽고 결과를 사용하지 마세요. 보호를 해제할 권한이 없다면 복사본 실습을 중단합니다.

입력 상한은 헤더를 제외한 10000행입니다. Input의 A:D 아래에 메모를 붙이면 데이터로 판단할 수 있으므로 메모는 다른 시트에 둡니다. 이 코드는 중복 주문 제거·취소 반영·날짜별 매출 정책을 구현하지 않습니다.

검산 자료의 한계와 실제 Excel 확인

첨부 테스트는 Python에서 840000, 금액 변경 후 850000, 빈 입력의 0건·0합계와 잘못된 형식의 거부를 확인합니다. XLSX의 실제 결과 칸이 비어 있는지도 확인했습니다. Excel에서 VBA·버튼을 실행하거나 재개봉 동작을 시험하지 않았습니다. Windows Excel에서 모듈 컴파일, 직접 실행, 버튼 실행을 차례로 확인한 뒤 사용하세요. 매크로의 오류 시 화면 갱신·이벤트 설정 복구는 코드 검토 항목이며, 모든 Excel 예외에서 성공한다는 보장은 아닙니다.

입력과 결과 칸을 찾는 기존 그림

그림은 실습 위치를 찾는 보조 자료입니다. 실제 실행 결과는 위 절차로 만든 사본의 값과 상태를 대조합니다.

매출 8건의 입력을 RunSummary로 처리하고 독립 기대값 840000과 비교하는 설명 도해
설명용 도해이며 실제 앱 실행 화면이나 실행 성공 증빙이 아닙니다.
매크로 사본을 .xlsm으로 저장하고 표준 모듈 준비, RunSummary 직접 실행 점검, 같은 매크로 단추 연결, 값 변경 및 재개봉 확인으로 이어지는 설명용 절차 도해
설명용 도해 · 실제 앱 실행 화면이 아닙니다. 8건·840000 및 금액 변경 후 850000은 본문의 독립 기대값이며, Excel VBA·단추·재개봉은 실행 검증하지 않았습니다.
금액 변경, 빈 입력, 문자 금액과 ID 누락의 기대 결과 및 오류 복구 도해
설명용 도해이며 실제 앱 실행 화면이나 실행 성공 증빙이 아닙니다.

공식 자료

Assign a macro to a Form or a Control button | Microsoft Support

Save a macro | Microsoft Support

Range.Value2 property (Excel)

출처 원문 수집일: S1 2026-09-24; S2 2026-09-24; S3 2026-09-24.

이어서 연습할 글

버튼에 연결할 코드를 직접 수정하는 다음 연습으로 VBA 기초 다섯 가지로 완료 행만 추출하기를 이어서 볼 수 있습니다.

작성자 소개