• 최초 작성일: 2001-01-17
  • 최종 수정일: 2026-09-30
  • 조회수: 7 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 조건에 맞는 모든 자료 출력하기

들어가기 전에

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

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

좋은 강의 감사드립니다.
저는 자그마한 개인사업(사실은 사업이랄 것 까지도 없습니다)을 하고 있는

제가 취급하는 품목이 300여 가지가 되다보니 관리하기가 힘듭니다. 또한
같은 품목이라 하더라도 수입일자에 따라 가격이 다 다릅니다.
그래서 가격을 입력하면 거기에 해당하는 모든 자료가 한꺼번에 나타나도록
하고 싶은데 어떻게 하면 좋을지요?
Vlookup 함수를 쓰니까 하나만 달랑 나오고, Dget 함수를 쓰자니까 조건을
일일이 지정해 주어야 하고…
부디 좋은 소식을 주시면 감사하겠습니다.
건강하십시오.

수입 잡화 도매업을 한다고 밝히신 분의 질문입니다. 일단 예제 파일의 콤보박스에서 단가를 하나 선택해 보세요.

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

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

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


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

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

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

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

조건에 맞는 모든 자료 출력하기

핵심 요약: 조건에 맞는 모든 자료 출력

이름을 정의한 영역을 순환하며 조건과 같은 값을 찾을 때마다 같은 행의 정보를 결과 표에 차례로 출력합니다.

  • 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을 활용하면 조건에 맞는 자료를 빠짐없이 추출하는 기능을 간단히 만들 수 있습니다.