- 최초 작성일: 2001-01-17
- 최종 수정일: 2026-09-30
- 조회수: 7 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 조건에 맞는 모든 자료 출력하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 질문 하나를 살펴봅니다.
좋은 강의 감사드립니다.
저는 자그마한 개인사업(사실은 사업이랄 것 까지도 없습니다)을 하고 있는
제가 취급하는 품목이 300여 가지가 되다보니 관리하기가 힘듭니다. 또한
같은 품목이라 하더라도 수입일자에 따라 가격이 다 다릅니다.
그래서 가격을 입력하면 거기에 해당하는 모든 자료가 한꺼번에 나타나도록
하고 싶은데 어떻게 하면 좋을지요?
Vlookup 함수를 쓰니까 하나만 달랑 나오고, Dget 함수를 쓰자니까 조건을
일일이 지정해 주어야 하고…
부디 좋은 소식을 주시면 감사하겠습니다.
건강하십시오.
수입 잡화 도매업을 한다고 밝히신 분의 질문입니다. 일단 예제 파일의 콤보박스에서 단가를 하나 선택해 보세요.
조건에 맞는 모든 자료 출력하기
핵심 요약: 조건에 맞는 모든 자료 출력
이름을 정의한 영역을 순환하며 조건과 같은 값을 찾을 때마다 같은 행의 정보를 결과 표에 차례로 출력합니다.
- 1단계: 결과를 출력할 셀에 Start, 대상 영역에 Target, 선택 값에 Price라는 이름을 정의합니다.
- 2단계: 이전 결과를 지우고 Target 영역을 순환합니다.
- 3단계: 선택한 단가와 같으면 Offset으로 번호와 품목을 Start 아래에 출력합니다.
Step 1: 결과 Table과 Source Table
단가를 선택하면 아래 왼쪽의 <결과 Table>에 해당 단가의 자료가 모두 나타납니다(예: 단가 10000을 선택한 경우). 오른쪽은 원본인 <Source Table>입니다.
결과 Table
| NO | 품목 |
|---|---|
| 01-0001 | 화장품 |
| 01-0005 | 컴퓨터 |
| 01-0009 | 냉장고 |
| 01-0010 | 컴퓨터 |
| 01-0014 | 냉장고 |
| 01-0015 | 컴퓨터 |
| 01-0019 | 냉장고 |
| 01-0020 | 컴퓨터 |
| 01-0023 | 컴퓨터 |
| 01-0025 | 세탁기 |
Source Table
| NO | 품목 | 단가 |
|---|---|---|
| 01-0001 | 화장품 | 10000 |
| 01-0002 | 냉장고 | 20000 |
| 01-0003 | 세탁기 | 40000 |
| 01-0004 | 밥통 | 20000 |
| 01-0005 | 컴퓨터 | 10000 |
| 01-0006 | 화장품 | 30000 |
| 01-0007 | 세탁기 | 30000 |
| 01-0008 | 냉장고 | 40000 |
| 01-0009 | 냉장고 | 10000 |
| 01-0010 | 컴퓨터 | 10000 |
| 01-0011 | 화장품 | 30000 |
| 01-0012 | 세탁기 | 30000 |
| 01-0013 | 냉장고 | 40000 |
| 01-0014 | 냉장고 | 10000 |
| 01-0015 | 컴퓨터 | 10000 |
| 01-0016 | 화장품 | 30000 |
| 01-0017 | 세탁기 | 30000 |
| 01-0018 | 냉장고 | 40000 |
| 01-0019 | 냉장고 | 10000 |
| 01-0020 | 컴퓨터 | 10000 |
| 01-0021 | 화장품 | 30000 |
| 01-0022 | 화장품 | 20000 |
| 01-0023 | 컴퓨터 | 10000 |
| 01-0024 | 밥통 | 30000 |
| 01-0025 | 세탁기 | 10000 |
| 01-0026 | 화장품 | 20000 |
지금까지 강좌를 충실히… 까지도 아니고 대충대충 따라하신 분들이라면 이런 문제는 눈감고도 만드실 수 있으리라 생각이 됩니다. ^^;
Step 2: SearchData 프로시저
Sub SearchData()
Dim rngStart As Range
Dim rngTarget As Range
Dim rngCell As Range
Dim rngPrice As Range
Dim r As Integer
Set rngStart = Range("Start")
'//검색결과를 뿌려 줄 셀에 Start라는 이름을 미리 정의해 두었습니다. 이름 상자(Name Box)에
'//가서 확인해 보세요. 이것 말고도 몇 개의 이름이 더 정의되어 있을 것입니다.
'//코딩을 할 때 이름을 정의해 두고 사용하는 것은 아주 좋은 방법이라고 말씀드렸지요?
Range(rngStart, rngStart.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).ClearContents
Range("Start").Select
'//검색결과를 출력할 부분(여기서는 <결과 Table>부분이 되겠지요?)에 찌꺼기가 들어 있으면
'//지워 줍니다.
Set rngTarget = Range("Target")
Set rngPrice = Range("Price")
'//여기서 Target은 콤보박스의 선택 결과값을 돌려주는 셀, Price는 <Source Table> 중에서
'//가격에 해당되는 부분에 각각 이름을 정의해 두고 사용합니다. 역시 이름 상자에 가서
'//어떤 영역인지 확인해 보세요.
For Each rngCell In rngTarget
If rngCell = rngPrice Then
rngStart.Offset(r, 0) = rngCell.Offset(0, -2)
rngStart.Offset(r, 1) = rngCell.Offset(0, -1)
r = r + 1
End If
'//이제 순환문을 돌면서 콤보박스에서 선택한 가격과 rngTarget 영역의 모든 셀 값을 비교해서
'//같은 값이면 Start 셀에서 Offset 함수로 지정해 준 위치로 이동한 다음 결과값을 뿌려주는
'//것입니다.
Next rngCell
MsgBox r & " 개의 레코드를 추출하였습니다", , "작업 완료//Exceller"
End Sub
마무리
생각보다 엄청나게 간단하지요? 간단하다고 생각하시는 분은 강좌를 잘 이해하고 넘어오신 분이라고 할 수 있고 '남이 짠 걸 볼 때는 쉬운데 막상 간단한 거라도 직접 짜보려고 하면 안된다'고 생각하시는 분은 아직 강좌를 내 것으로 완전히 소화하지 못했다고 생각하시면 됩니다. 아무리 간단한 코드라도 눈으로 대충대충 보고 넘어가시지 말고 반드시 직접 타이핑 해가며 수정해 보시기 바랍니다.
이번 시간에 설명드린 것도 간단하기는 하지만 여러분들의 활용여하에 따라서 아주 유용하게 사용할 수 있는 것이니까 꼭 내 것으로 만드시면 좋을 것입니다.
다음 시간에 또…
정리 — 조건 자료 출력 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 출력 위치 | Set rngStart = Range("Start") | 결과 표 시작 셀 |
| 이전 결과 삭제 | Range(...).ClearContents | 찌꺼기 제거 |
| 조건 비교 | If rngCell = rngPrice Then | 선택 단가와 비교 |
| 같은 행 값 | rngCell.Offset(0, -2) | 번호와 품목 가져오기 |
| 개수 알림 | MsgBox r & " 개의 레코드" | 추출 건수 표시 |
자주 묻는 질문 (FAQ)
Q1. VLOOKUP은 왜 하나만 찾아 주나요?
VLOOKUP은 조건에 처음 일치하는 값 하나만 반환하므로 조건에 맞는 모든 자료를 얻으려면 순환문 등 다른 방법이 필요합니다.
Q2. DGET 함수의 한계는?
조건을 일일이 지정해야 하고 결과가 하나일 때만 사용할 수 있습니다.
Q3. 영역에 이름을 정의해 두면 좋은 점은?
코드에서 짧게 참조할 수 있고 영역이 바뀌어도 코드를 수정하지 않아도 됩니다.
마치며
순환문과 Offset을 활용하면 조건에 맞는 자료를 빠짐없이 추출하는 기능을 간단히 만들 수 있습니다.