- 최초 작성일: 2000-11-30
- 최종 수정일: 2026-09-30
- 조회수: 13 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 구매예정일 추정하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 질문 하나를 살펴봅니다.
안녕하세요~
급하기도 하고 잘 안되어서 이렇게 여쭤보게 되었습니다.
내용은 아래와 같습니다.
이렇게 데이터가 있을 때 "홍길동"의 그동안 구매기간 사이의 평균을 내서
최종구매일에 더해 다음 구매예정일을 나타낼려고 하거든요.
VBA 자동필터로 해서 그동안 구매일은 출력을 하였는데 그 다음부터가 잘
안되는군요.
제가 짜 본건데 답이 안나오네요~
질문에 나온 데이터는 다음과 같습니다(구매일자는 날짜 일련번호입니다).
| 구매자 | 구매일자 |
|---|---|
| 홍길동 | 36831 |
| 홍길동 | 36833 |
| 강감찬 | 36832 |
| 홍길동 | 36836 |
구매예정일 추정하기
핵심 요약: 평균 구매일 구하기
고급필터로 조건에 맞는 자료만 별도 위치에 추출한 뒤 그 영역을 배열수식으로 평균 내어 구매예정일을 추정합니다.
- 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은 무엇인가요?
지정한 셀의 상하좌우로 연결된 데이터 영역 전체를 가리키는 속성입니다.
마치며
고급필터로 필요한 자료만 추출한 다음 계산하면 정확한 평균 구매일을 얻을 수 있습니다.