• 최초 작성일: 2005-04-27
  • 최종 수정일: 2026-09-30
  • 조회수: 9 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 연속구매회수 구하기

들어가기 전에

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

질문 하나

안녕하세요? 좀 궁금한것이 있어 이렇게 메일 보내드립니다.

다름이 아니라 제가 고객이 사용한 마일리지를 정산하려고 하는데 아무래도 편법을 동원하여 부정하게 사용된 경우가 많이 있는것 같아서요. 그런 고객들을 걸러내는 작업을 하려다보니까 좀 막히는게 있어서요.

도와주시면 감사하겠습니다.

A 고객이 아래와 같이 10일동안 18,000원을 구매하였습니다. 그러나 10일동안 총 6번 매장을 방문한 것으로 추측되며 연속하여 구매한 날은 총 3일 입니다.

1일2일3일4일5일6일7일8일9일10일계
10002000200020005000600018000

위와 같이 연속 구매일 3일 이라는 값을 구하려면 어떻게 하면 되나요 ?

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

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

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


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

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

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

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

연속구매회수 구하기

핵심 요약: 최대 연속 구매 일수 구하기

일자별 구매 표에서 값이 있는 셀이 연속된 최대 길이를 구하는 SerialDay 함수입니다. 고객 수가 몇 천 건이 되어도 수식을 아래로 복사하기만 하면 됩니다.

  • 1단계: 범위의 셀을 왼쪽에서 오른쪽으로 하나씩 확인합니다.
  • 2단계: 공란이면 연속 카운터를 0으로, 값이 있으면 1씩 증가시킵니다.
  • 3단계: 카운터가 최대값을 넘으면 최대값을 갱신하고 결과로 돌려줍니다.

Step 1: 눈으로 파악하기 어려운 이유

파악해야 할 고객이 몇 명 되지 않는다면 그까이꺼~ 그냥 눈으로 대충 봐도 알 수 있을 테지만 고객 DB가 몇백, 몇천건 된다거나 파악해야 할 날짜의 범위가 넓다면 곤혹스런 일이 아닐 수 없습니다.

다음의 표만 보더라도… 눈으로 파악하기가 만만하지 않음을 알 수 있습니다.

고객별로 일자별 구매 금액이 입력된 표에서, 맨 오른쪽 '연속 구매회수' 열에 최대로 연속해서 구매한 일수를 구하려는 것입니다. 이제 아래 버튼을 눌러서 '연속 구매회수' 부분을 살펴보세요!

잘 되지요?

Step 2: 코드 살펴보기

위의 빗금으로 표시된 셀에 입력된 수식을 보면, '=serialday(B39:K39)'라고 되어 있을 것입니다. 여기서 SerialDay는 사용자 정의 함수입니다.

Function SerialDay(rngX As Range)
' 함수를 시작할 때 사용자가 입력한 범위(Range 개체)까지 넘겨받습니다.

    Dim i As Integer
    Dim intX As Integer
    Dim intNum As Integer
    Dim intNum2 As Integer
    intX = rngX.Cells.Count - 1

    For i = 0 To intX
    ' rngX, 즉 사용자가 지정한 범위 내의 셀 수만큼 반복문을 실행합니다.

        If rngX.Cells(1).Offset(0, i) = "" Then
        ' rngX 영역에서 한 컬럼씩 옆으로 이동하면서 공란인지 여부를 파악합니다.
        ' 공란을 만나면 intNum 변수의 값을 초기화 시킵니다.

            intNum = 0
        Else
        ' 공란이 아니라면, 즉 연속적으로 구매를 한 경우라면 intNum 변수의 값을 1씩 증가시켜
        ' 나갑니다.

            intNum = intNum + 1

            ' 그런데… 아래의 If 구문은 무엇 때문에 적어 주었을까요? 그것은… 숙제랍니다! ^^;
            If intNum > intNum2 Then
                intNum2 = intNum
            End If
        End If
    Next i
    SerialDay = intNum2

End Function

숙제의 답: If intNum > intNum2 Then 구문은 연속 구매일수의 최대값을 기억하기 위한 것입니다. intNum은 공란을 만나면 0으로 초기화되므로, 초기화되기 전에 지금까지의 최대 연속 일수를 intNum2에 보관해 두는 것입니다.

코드는… 앞서 보신 바와 같이 싱거우리만치 간단합니다. 컴퓨터가 아닌 사람이 직접 이런 작업을 할 때 어떤 프로세스로 수행을 하는지를 먼저 고민해 보시면 쉽게 이해하실 수 있을 것입니다.

오늘은 여기까지…

정리 — SerialDay 함수 코드 핵심

구분 사용한 코드 역할
인수 rngX As Range 고객별 일자 범위를 넘겨받음
공란 확인 rngX.Cells(1).Offset(0, i) = "" 해당 일자에 구매 기록이 없는지 확인
연속 카운터 intNum = intNum + 1 연속 구매일 수 증가
초기화 intNum = 0 공란을 만나면 다시 시작
최대값 기억 If intNum > intNum2 Then intNum2 = intNum 가장 긴 연속 횟수 보관

자주 묻는 질문 (FAQ)

Q1. 연속 구매일 수와 총 방문 횟수는 같은가요?

다릅니다. 총 방문 횟수는 값이 있는 셀의 개수이고, 연속 구매일 수는 값이 있는 셀이 끊어지지 않고 이어진 최대 길이입니다. 예제에서는 6번 방문했지만 연속으로 구매한 날은 3일입니다.

Q2. 왜 최대값을 따로 기억해야 하나요?

공란을 만나면 카운터가 0으로 초기화되므로 마지막 구간의 값만 남게 됩니다. 초기화 전에 가장 큰 값을 다른 변수에 보관해야 최대 연속 횟수를 구할 수 있습니다.

Q3. 수식으로도 구할 수 있나요?

FREQUENCY 함수를 이용한 배열 수식으로도 구할 수 있지만 수식이 복잡해집니다. 사용자 정의 함수로 만들어 두면 =SerialDay(B39:K39)처럼 간단하게 사용할 수 있습니다.

마치며

사람이 직접 이런 작업을 할 때 어떤 과정을 거치는지 먼저 고민해 보면 코드는 싱겁게 느껴질 만큼 간단해집니다.