- 최초 작성일: 2004-08-18
- 최종 수정일: 2026-09-30
- 조회수: 19 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 간이식단표 만들기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
Exceller가 간혹 "答辯神功"이라는 말을 우스개 소리로 들려드린 적이 있습니다. 무언가를 배우는 가장 확실한 방법은 남을 가르쳐 보는 것입니다.
남을 가르칠만한 실력이 현재 갖추어져 있느냐 하는 것이 물론 중요하겠습니다만, 처음에는 좀 어설퍼(?)보여도 자꾸 답변을 하다보면 어느 사이엔가 일취월장해 있는 자신의 모습을 발견하시게 될 것입니다. 또한 자신의 이름을 내걸고 하는 일이니만큼 게을러지고 싶어도 뜻대로 되지 않을 것입니다. ^^
질문 하나
엑셀로 월간 식단을 짜는데 잘 안짜져서요 이렇게 부탁 드립니다. 저희 가족이 몸이 약해지는것 같아 짜는데 잘 안되네요… 방법은 요리이름 디비를 만들고 거기서 한달 식단을 짜면 자동으로 재료가 합산되어 나오게 하려는데 잘 안되어서 요청 합니다. 고수님들 부탁드립니다
간이식단표 만들기
핵심 요약: 음식 이름으로 재료 불러오기
요리책 시트에 음식별 재료 데이터를 만들어 두고, 콤보 상자에서 음식을 선택하면 그 음식의 재료 이름과 수량이 가로로 표시되도록 하는 VBA 코드입니다.
- 1단계: 요리책 시트에 음식이름, 재료이름, 수량, 단위 데이터를 만들고 이름을 정의합니다.
- 2단계: 콤보 상자로 선택한 음식 이름과 목록의 각 셀을 비교합니다.
- 3단계: 일치하는 행의 재료와 수량을 정해진 위치에 차례로 옮깁니다.
Step 1: 엑셀은 무엇일까요?
주변의 사람들에게 "엑셀이 무어냐?"라고 물어보면, 대개의 사람들이 그럽니다.
"스프레드시트 프로그램이요!"
"숫자를 많이 다루는 사람들이 사용하는 수치계산용 프로그램 아닙니까?"
엑셀이 방대한 숫자 데이터를 계산하기 위한 용도로 처음에 만들어졌고 그 방면으로 많은 진화를 해 온 것은 부인할 수 없는 사실입니다만, 수치계산을 위한 전용 프로그램은 절대로 아닙니다.
엑셀은 (업무를 포함한) 강력한 정보분석 도구인 동시에 경영전략 도구입니다. (꼭 Microsoft사 홍보담당 같은 소리로 들리실 수도 있겠습니다만, Exceller는 개인적으로 Microsoft사와는 아무런 관련이 없음을 다시 한번 밝힙니다. ^^)
흔히들 經營이라고 하면 커다란 회사와 방대한 조직을 연상하게 됩니다. 하지만 경영이란 것이 꼭 기업체를 운영하고 관리하는 것만은 아닙니다. 주어진 자원을 어떻게 하면 적재적소에 배분하여 최적의 효율을 얻을 수 있을까를 연구하고 실행에 옮기는 것은 모두 '경영'이라 부를 수 있을 것입니다.
그런 의미에서… 우리 몸을 잘 관리하는 것도 경영입니다. 자신의 몸을 건강한 상태로 잘 관리하는 분은 훌륭한 경영자로서의 자질을 충분히 가지고 있다고 생각하셔도 좋겠습니다.
오늘 질문주신 분의 경우처럼, 가족의 건강을 위해 주어진 예산으로 식단을 어떻게 구성할까 고민하는 것도 경영이라 할 수 있겠지요(경영학도들께 혼날 소리를 하는 지도 모르겠군요. 하지만 잘 이해해 주시리라 믿고… ^^*).
Step 2: 요리책 데이터와 콤보 상자
'요리책' 시트에는 그림과 같은 데이터가 들어 있습니다.
여기서 음식이름을 선택하면 그 음식의 재료가 한번에 좌르륵 나오도록 해 달라는 주문이신 듯 합니다. 아래 콤보 박스에서 음식을 선택해 보세요. 콤보 박스로 선택한 음식의 번호는 INDEX 함수로 음식 이름으로 바꾸어 표시됩니다.
코딩에 들어가기에 앞서, 워크시트의 특정 영역에 몇 개의 이름을 미리 정의해 두었습니다. 어느 부분에 어떤 이름이 정의되어 있는지 '삽입-이름-정의' 메뉴를 이용하여 살펴보세요.
Step 3: 코드 살펴보기
그럼. 콤보 박스에 연결된 코드를 살펴볼까요?
Sub FoodSource()
Dim rngCell As Range
Dim rngFood As Range
Dim i As Integer
Set rngFood = Range("음식")
' C78 셀에 미리 '음식'이라는 이름을 정의해 두었습니다.
With rngFood
Range(.Offset(1, 0), .Offset(2, 0)).EntireRow.ClearContents
' 데이터를 출력할 곳을 깨끗이 정리합니다.
End With
For Each rngCell In Worksheets("요리책").Range("음식이름")
' 이제 '요리책' 워크시트의 A열에 있는 각 셀과 콤보 박스를 통해 선택된 음식이름(rngFood)을
' 차례차례 비교해 나갑니다.
With rngFood
If IsEmpty(rngFood) Then
' 사실 이 부분은 거의 필요가 없으나 지우기 귀찮아서 그냥 둡니다. ^^
' 원래 유효하지 않은 음식이름이 선택된 경우에 대한 에러 처리를 위해 만든 것입니다.
' 코드를 알아서 적절히 수정하시기 바랍니다.
.EntireRow.ClearContents
Exit For
ElseIf rngFood = rngCell Then
' 여기서부터가 바로 우리가 작업하고자 하는 부분입니다.
' 요리책 시트의 A열에 있는 음식이름과 콤보 상자를 통해 선택된 음식이름을 비교하여
' 같으면 해당 데이터를 차례대로 정해진 위치로 불러오는 것입니다.
' 코드 자체는 전혀 어려운 부분이 없습니다.
.Offset(1, -2) = "재료이름"
.Offset(2, -2) = "수량"
.Offset(1, i - 1) = rngCell.Offset(0, 1)
.Offset(2, i - 1) = rngCell.Offset(0, 2) & rngCell.Offset(0, 3)
i = i + 1
End If
End With
Next rngCell
End Sub
생각보다 아주 간단하지요? Range 오브젝트에 대한 기초만 있다면 A piece of cake!, 누워서 떡먹기 보다 쉽습니다. ^^ VBA 입문강좌에서 설명드리고 있는 Range 오브젝트 관련 강좌들을 다시 한번 정리해 두시고 많이 응용해 보시기 바랍니다.
다음에 또…
정리 — 간이 식단표 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 선택 음식 | Set rngFood = Range("음식") | 콤보 상자와 연결된 음식 이름 셀 |
| 출력 영역 정리 | .Offset(1, 0) ... EntireRow.ClearContents | 이전 결과를 지움 |
| 목록 순환 | For Each rngCell In Worksheets("요리책").Range("음식이름") | 요리책의 음식 이름과 비교 |
| 재료 이름 | .Offset(1, i - 1) = rngCell.Offset(0, 1) | 재료 이름을 가로로 표시 |
| 수량 | rngCell.Offset(0, 2) & rngCell.Offset(0, 3) | 수량과 단위를 함께 표시 |
자주 묻는 질문 (FAQ)
Q1. 콤보 상자에서 선택한 항목의 이름은 어떻게 알 수 있나요?
콤보 상자의 셀 연결에 지정한 셀에는 선택한 항목의 번호가 저장됩니다. 이 번호를 INDEX 함수에 넣으면 목록에서 해당 항목의 이름을 가져올 수 있습니다.
Q2. 재료 금액까지 합산하려면 어떻게 하나요?
요리책 시트의 금액 열을 이용해 재료별 금액을 함께 불러오고 SUM으로 합산하면 됩니다. 한 달 식단을 짜려면 날짜별 선택 결과를 별도의 시트에 누적한 뒤 재료별로 합산하는 방식으로 확장할 수 있습니다.
Q3. 유효하지 않은 음식 이름이 선택되면 어떻게 되나요?
선택한 셀이 비어 있으면 결과 영역을 지우고 반복문을 빠져나오도록 되어 있습니다. 실제 업무에서는 이 부분에 알맞은 오류 처리를 추가해 사용하세요.
마치며
Range 개체의 기초만 알면 누워서 떡 먹기보다 쉬운 코드입니다. VBA 입문 강좌의 Range 오브젝트 관련 내용을 정리해 두고 많이 응용해 보세요.