• 최초 작성일: 2000-11-30
  • 최종 수정일: 2026-09-30
  • 조회수: 13 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 구매예정일 추정하기

들어가기 전에

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

이번 시간에는 질문 하나를 살펴봅니다.

안녕하세요~
급하기도 하고 잘 안되어서 이렇게 여쭤보게 되었습니다.
내용은 아래와 같습니다.

이렇게 데이터가 있을 때 "홍길동"의 그동안 구매기간 사이의 평균을 내서
최종구매일에 더해 다음 구매예정일을 나타낼려고 하거든요.
VBA 자동필터로 해서 그동안 구매일은 출력을 하였는데 그 다음부터가 잘
안되는군요.
제가 짜 본건데 답이 안나오네요~

질문에 나온 데이터는 다음과 같습니다(구매일자는 날짜 일련번호입니다).

구매자구매일자
홍길동36831
홍길동36833
강감찬36832
홍길동36836
권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

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

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


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

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

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

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

구매예정일 추정하기

핵심 요약: 평균 구매일 구하기

고급필터로 조건에 맞는 자료만 별도 위치에 추출한 뒤 그 영역을 배열수식으로 평균 내어 구매예정일을 추정합니다.

  • 1단계: 조건 영역에 고객 이름을 입력하고 AdvancedFilter로 결과를 다른 위치에 복사합니다.
  • 2단계: 추출한 영역의 주소를 변수에 담습니다.
  • 3단계: FormulaArray로 AVERAGE 배열수식을 넣어 평균 구매일을 구합니다.

Step 1: 질문자의 코드 살펴보기

뭔가 좀 이상하다는 생각이 드시지요? 이렇게 할 경우, 사용자가 어떤 이름을 입력하든지 간에 항상 같은 결과가 나올 것입니다. 설령 실행오류가 발생하지 않는다 하더라도 원하지 않는 값이 나옵니다.

이러한 형태의 자료를 실제로 구매예정일을 추정하는데 사용하시는지는 알 수 없지만 일단 고급필터를 사용해서 해결을 해 보도록 하지요.

원하시는 바대로 되지요? 아래의 것은 질문하신 분이 작성한 코드입니다.

아래 코드는 문제점을 살펴보기 위한 질문하신 분의 코드이므로 그대로 실었습니다.

Sub expected()
    Dim ebuyer As String
    Dim datavg As Variant
    On Error GoTo ET
    '//이 문장은 에러가 발생할 경우를 대비해서 Exceller가 집어넣은 것입니다.

    ebuyer = InputBox("♤어떤 손님의 구입예정일을 보고 싶으세요?♤", _
        "♡밝은 미소로 맞이하겠습니다♡")
    ActiveSheet.Range("b13").AutoFilter 1, ebuyer
    datavg = lnglastrow + Format(WorksheetFunction.Average(Range("구매일자")), "dd")
    MsgBox datavg
ET:
    If Err <> 0 Then _
        MsgBox "에러가 발생하여 프로그램을 중단합니다", , "에러 발생//Exceller"
    '//이 부분도 마찬가지로 Exceller가 삽입한 코드로 Error Trapping을 위한 것입니다.

End Sub

Step 2: 고급필터로 추출한 결과만 계산하기

이것을 아래와 같이 수정해 보았습니다. 고급필터를 사용하면 화면상에는 필터링된 결과값만 나타나지만 연산을 할 경우, 숨겨져 있는 셀에 대해서도 모두 작업을 하기 때문에 정확한 결과를 얻을 수 없을 것입니다. 따라서 고급필터를 사용해서 원하는 결과값들만 다른 곳에 추출해 낸 다음 이것만을 가지고 가공작업을 해 보았습니다.

Sub ModifiedByExceller()
    Dim rngTarget As Range
    Dim strAddress As String
    Dim strName As String
    Dim Msg As String
    '//오늘 프로그램에서는 "이름 정의(Naming)"를 많이 활용하였습니다. 따라서 어떤 셀에
    '//어떠한 이름을 정의하여 두었는지 이름 정의 상자를 통해 미리 확인하시기 바랍니다.

    Range("Output").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Clear
    '//고급필터의 결과를 출력할 자리에 다른 데이터가 있으면 이것을 모두 지웁니다.

    strName = InputBox("고객의 이름을 입력하세요", "이름 입력//Exceller")
    Range("구매자") = strName
    Set rngTarget = Range("Start").CurrentRegion
    rngTarget.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("조건"), _
        , CopyToRange:=Range("Output"), Unique:=False
    '//CurrentRegion은 지정한 셀의 상하좌우에 연결된 셀(영역)을 함께 지정하기 위해 사용한
    '//속성입니다. 이렇게 해서 지정된 영역을 작업대상으로 고급필터를 사용하는 것입니다.

    Range("Output").Offset(1, 1).Select
    Range(Selection, Selection.End(xlDown)).Select
    strAddress = Selection.Address
    '//고급필터로 추출한 데이터 영역의 주소를 strAddress 변수에 담아 둡니다.

    Range("Result").FormulaArray = "=AVERAGE(" & strAddress & ")"
    '//FormulaArray, 즉 해당 셀에 배열수식을 사용합니다. 보통 배열수식을 사용할 때, 수식을 다
    '//입력한 다음에 Ctrl + Shift + Enter키를 함께 탁 치지요? 바로 이것을 코드화하면 위와 같이
    '//표현되는 것입니다.

    '//여기서 한 가지 주의하실 점!
    '//날짜들의 평균을 구하시려면 배열수식을 사용해야 한다는 것입니다. 반드시 명심하시길…

    Selection.NumberFormatLocal = "yy-mm-dd"
    Msg = strName & "님의 평균구매일은" & vbCr & vbCr
    Msg = Msg & Format(Range("Result"), "dd") & "일 입니다"
    MsgBox Msg, , "작업 완료//Exceller"
    Range("평균구매일") = Format(Range("Result"), "dd")
    '//작업의 결과를 MsgBox와 지정한 셀에 함께 뿌려줍니다.

End Sub

마무리

오늘 강좌도 여러 가지로 응용을 하시면 재미있는 것을 만드실 수 있을 것입니다.

프로그래밍을 배우는 가장 빠른 방법이 무어냐? 얼마 정도의 시간을 투자하면 프로그램을 짤 수가 있느냐?

하는 질문들을 자주 하십니다. 참으로 어려운 질문입니다. ^^;

사람에 따라, 그리고 그 사람의 의지에 따라 다 달라지겠지만 한 가지 확실하게 말씀드릴 수 있는 것은 얼마만큼의 관심을 가지고 있느냐가 중요하다는 것입니다. 관심(다르게 표현하면 호기심)이 있으면 옆에서 누가 말려도 하게 되어 있습니다.

배움에 왕도가 없다는 말이 있듯이 프로그래밍에서도 그러합니다. 남이 짜 놓은 것을 많이 접해 보시고 어떻게 하면 이것을 응용해서 써 먹을 수 있을 것인가를 항상 고민해 보시기 바랍니다.

다음 시간에…

정리 — 구매예정일 추정 핵심

구분 사용한 코드 역할
영역 지정 Range("Start").CurrentRegion 연결된 데이터 영역
고급필터 AdvancedFilter Action:=xlFilterCopy 조건에 맞는 자료 추출
주소 저장 strAddress = Selection.Address 추출 영역 주소
배열수식 .FormulaArray = "=AVERAGE(" & strAddress & ")" 평균 구매일 계산
결과 표시 Format(Range("Result"), "dd") 메시지와 셀에 표시

자주 묻는 질문 (FAQ)

Q1. 필터링한 결과만 계산하려면 왜 다른 곳에 추출하나요?

필터로 숨긴 셀도 계산에는 포함되므로 고급필터로 원하는 결과만 다른 위치에 복사한 뒤 계산해야 정확합니다.

Q2. FormulaArray는 무엇인가요?

셀에 배열수식을 입력하는 속성으로, Ctrl+Shift+Enter로 입력하는 것과 같습니다.

Q3. CurrentRegion은 무엇인가요?

지정한 셀의 상하좌우로 연결된 데이터 영역 전체를 가리키는 속성입니다.

마치며

고급필터로 필요한 자료만 추출한 다음 계산하면 정확한 평균 구매일을 얻을 수 있습니다.