• 최초 작성일: 2002-04-11
  • 최종 수정일: 2026-09-30
  • 조회수: 12 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 일정 합이 될 때마다 표시하기

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

이번에는 게시판에 올라온 질문 하나를 살펴보겠습니다. A1부터 A1000까지 빈 셀 없이 임의의 숫자가 들어 있는 상태에서, A1부터 차례로 더해 합계가 900,000이 되는 지점을 찾고, 그다음 셀부터 다시 더해 900,000이 되는 지점을 찾는 식으로 끝까지 반복하여 각 지점을 표시하고 싶다는 내용이었습니다. 마지막에 남는 900,000 미만의 구간은 필요하지 않고, 함수든 VBA든 상관없다고 하셨습니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

일정 합이 될 때마다 표시하기

핵심 요약: 기준 합계마다 구간 나누기

Offset으로 아래 셀을 차례로 더하다가 기준을 넘으면 초과분만큼을 다음 행으로 넘기는 방식으로 일정 합계 구간을 만들 수 있습니다.

  • 1단계: Do ~ Loop 문에서 셀 값을 lngSum에 계속 누적합니다.
  • 2단계: 기준을 넘으면 행을 삽입하고 초과분을 새 행에 기록합니다.
  • 3단계: 기준 셀을 색으로 표시하고 누적 변수를 초기화합니다.

Step 1: 결과 미리 보기

WorkPlace 시트로 가서 버튼을 눌러 보세요. 합계가 900000이 넘을 때마다 그림과 같이 표시가 됩니다.

합계가 900000을 넘는 셀이 빨간색으로 표시되고 그 아래에 나머지 값이 삽입된 WorkPlace 시트
아이엑셀러

만약 이것을 손으로 한다고 생각해 보세요. 아마도 눈과 손이 무진장 피곤할 것입니다.

Step 2: 기본 코드 살펴보기

코드는 몇 줄 되지도 않습니다. Range 오브젝트에 어떻게 여하히 접근하느냐가 관건입니다.

Sub MakeEveryNSum()
    Dim rngStart As Range
    Dim lngSum As Long
    Dim lngSum1 As Long
    Dim r As Long
    Dim shtSource As Worksheet
    Set shtSource = Worksheets("WorkPlace")
    Set rngStart = shtSource.[A1]

    Do
        With rngStart
            lngSum = lngSum + .Offset(r, 0)
            ' Do~Loop 문을 이용하여 순환을 합니다. 한 셀씩 밑으로 내려가면서 값을
            ' lngSum 이라는 변수에 차곡차곡 담아둡니다.

            If lngSum >= 900000 Then
            ' 그러다가 900000이 넘어가면 아래의 문장을 실행합니다.
                .Offset(r + 1, 0).EntireRow.Insert
                .Offset(r, 0).Interior.ColorIndex = 3

                lngSum1 = lngSum - 900000
                .Offset(r + 1, 0) = lngSum1
                .Offset(r, 0) = .Offset(r, 0) - lngSum1
                ' 이 부분이 중요합니다. 셀 값들을 더해서 900000이 넘게 되면 총 합계에서
                ' 900000을 뺀 다음 lngSum1 이라는 변수에 담습니다. 그래야 남는 값을
                ' 이용하여 다음 셀에 있는 값과 계속 더해 줄 수 있으니까요.

                lngSum = 0
                lngSum1 = 0
            End If
            r = r + 1
        End With
    Loop While rngStart.Offset(r, 0) <> ""
    r = 0
    [A1].Select
End Sub

누적 합계가 900000 이상이 되는 셀에서는 초과분(lngSum1)을 계산하여 그 아래에 새 행을 삽입하고, 삽입한 셀에 초과분을 넣은 뒤 원래 셀은 초과분만큼 줄여 정확히 900000이 되도록 만들어 빨간색으로 표시합니다. 그러면 남는 값이 다음 구간의 합계 계산으로 자연스럽게 이어집니다.

Step 3: 합계 기준을 입력받도록 개선하기

합계 기준을 900000으로만 고정해 두면 재미가 없으니 조금 더 융통성 있게 바꿔 보겠습니다. 사용자가 합계 기준을 입력하면 그 기준대로 합산이 되도록 하는 것입니다.

코드를 보면... 약간 수정되었습니다. 위의 코드를 이해 하신다면 전혀 어려운 부분이 없을 것입니다.

Sub MakeEveryNSum2()
    Dim rngStart As Range
    Dim lngSum As Long
    Dim lngSum1 As Long
    Dim lngCriteria As Long
    Dim r As Long
    Dim shtSource As Worksheet
    MakeData
    Set shtSource = Worksheets("WorkPlace2")
    Set rngStart = shtSource.[A1]

    lngCriteria = Val(InputBox("얼마마다 합계를 구할까요?" & vbCr & _
        "(100,000~1,000,000 사이의 값을 입력하세요)"))
    If lngCriteria < 100000 Or lngCriteria > 1000000 Then
        MsgBox "입력하신 기준이 적합하지 않습니다. 다시 확인하세요"
        Exit Sub
    End If

    Do
        With rngStart
            lngSum = lngSum + .Offset(r, 0)
            If lngSum >= lngCriteria Then
                .Offset(r + 1, 0).EntireRow.Insert
                With .Offset(r, 0)
                    .Interior.ColorIndex = 3
                    .Font.ColorIndex = 2
                End With

                lngSum1 = lngSum - lngCriteria
                .Offset(r + 1, 0) = lngSum1
                .Offset(r, 0) = .Offset(r, 0) - lngSum1
                lngSum = 0
                lngSum1 = 0
            End If
            r = r + 1
        End With
    Loop While rngStart.Offset(r, 0) <> ""
    r = 0
    [A1].Select
    MsgBox "작업을 완료하였습니다", , "작업 종료//www.iExceller.com"
End Sub

Sub MakeData()
    ' 실습용으로 WorkPlace2 시트의 A1:A1000에 임의의 숫자를 채웁니다.
    Dim i As Long
    With Worksheets("WorkPlace2")
        .Cells.Clear
        Randomize
        For i = 1 To 1000
            .Cells(i, 1).Value = Int(Rnd * 100000) + 1
        Next i
    End With
End Sub

참고: 위 코드는 행을 삽입하면서 값을 나눠 기록하므로 원본 데이터가 바뀝니다. 실제 자료에 적용하기 전에 반드시 복사본에서 먼저 시험해 보시기 바랍니다.

많이 응용해 보시기 바랍니다.

다음 시간에 또...

정리 — 일정 합계 표시 핵심

구분 사용한 코드 역할
누적 lngSum = lngSum + .Offset(r, 0) 한 셀씩 내려가며 합산
행 삽입 .Offset(r + 1, 0).EntireRow.Insert 초과분을 담을 행 추가
초과분 lngSum1 = lngSum - 기준 다음 구간으로 넘길 값
표시 .Interior.ColorIndex = 3 기준 도달 셀에 빨간색
기준 입력 InputBox 합계 기준을 사용자가 지정

자주 묻는 질문 (FAQ)

Q1. 초과분은 왜 새 행에 넣나요?

기준을 넘은 셀의 값을 초과분만큼 줄여 합계가 정확히 기준값이 되게 하고, 남은 초과분은 다음 구간의 합계에 이어서 쓰기 위해서입니다.

Q2. 합계 기준을 바꾸려면 어떻게 하나요?

기준값을 상수로 두지 않고 InputBox로 입력받은 값을 lngCriteria 변수에 담아 사용하면 됩니다.

Q3. 마지막에 기준에 못 미치는 나머지는 어떻게 되나요?

기준 합계에 이르지 못한 마지막 구간은 별도로 표시되지 않고 그대로 남습니다.

마치며

Range 오브젝트에 어떻게 접근하느냐가 관건이며, 기준값을 입력받도록 하면 다양한 상황에 응용할 수 있습니다.