- 최초 작성일: 2001-01-31
- 최종 수정일: 2026-09-29
- 조회수: 27 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 급식현황표 만들기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
질문 하나
안녕하세요 OOO입니다. 하도 답답해서 예의가 아닌 줄 알지만 질문을 드립니다. 님의 홈쥐에 다녀갔습니다. 매우 유용하군요. 주위에 계신 분들에게 추천하겠습니다. 다망하시겠지만 살펴봐 주십시오. 이것이 해결되고도 몇 가지 질문이 더 있습니다. 괜찮을지요… (문 1) 시트1 셀 O4:O53의 숫자(인원수)를 월별 중 해당되는 월(지금이 1월이면 1(금월)월만 되돌리기 위해 셀 AD2에 INDEX(O4:O53,IF(MONTH(TODAY())<7,1,3),CHOOSE(MONTH(TODAY()), 1,1,3,5,7,9,1,3,3,5,7,9)) 이런 수식을 사용했는데 결과는 숫자가 아닌 이름이 되돌려 집니다. 무엇이 잘못된 것인지요? (문 2) 시트1 셀 P4:P53에 ㅡ표시가 있는 셀의 숫자를 월별 중 지금이 1월이면 1(금월)월만 되돌리기 위해 셀 AC2에 INDEX(P4:P53,IF(MONTH(TODAY())<7,1,3),CHOOSE(MONTH(TODAY()), 1,1,3,5,7,9,1,3,3,5,7,9)) 이런 수식을 사용했는데 결과는 숫자가 아닌 ㅡ가 되돌려 집니다. 무엇이 잘못인지요? (문 3) (문 1), (문 2)에 맞는 수식인 무엇이고, 제시한 수식으로 해당 월만 되돌려 질 수 있는지 지도해 주십시오.
급식현황표 만들기
핵심 요약
- 월별 급식자수와 납입자수를 표시하려면 단순히 INDEX와 CHOOSE로 셀 하나를 반환하는 것보다 실제 집계 조건에 맞는 계산식이 필요합니다.
- 월별 범위에 이름을 정의한 뒤 CHOOSE로 해당 월의 범위를 선택하고 COUNTIF로 표시 기호의 개수를 세어 필요한 인원수를 계산할 수 있습니다.
- 콤보박스로 월을 선택하도록 구성하면 사용자가 선택한 월에 맞춰 급식 관련 수치가 자동으로 바뀌는 현황표를 만들 수 있습니다.
질문하신 것으로 보아 아마 초등학교나 중학교에서 선생님 또는 급식과 관련된 일에 종사하시는 분의 질문인 것 같습니다. 질문의 내용이 근래에 보기 드물게 공손(?)하고 배운 내용을 여러 가지 방향으로 응용하시려는 태도가 너무도 가슴을 찡하게(^^) 합니다. 그리고 EXCEL은 단순한 수치계산 프로그램이 아니라 응용여하에 따라 활용범위가 무궁무진하다는 것을 보여주는 좋은 샘플인 것 같아 소개해 드립니다.
우선 아래의 버튼을 눌러 질문하신 분이 어떤 부분에서 잘 안되는지 살펴보고 오시기 바랍니다.
무엇이 문제인지 아시겠습니까? 단순히 질문하신 부분만을 수정해서 해당 월만을 되돌린다 해도 문제가 해결되는 것은 아니로군요. ^^ 단순히 해당 월만 되돌려서는 해결이 되지 않고 해당 월의 급식자수와 납입자수를 리턴해 주어야 될 것 같습니다.
여기서 한 걸음 더 나아가 에러 표시가 나타날 경우에 대한 처리와 사용자의 편의를 도모하기 위해 콤보박스를 통해 월을 선택할 경우, 해당 월에 대한 자료들만 화면에 표시되는 정도까지의 작업은 해 주어야 비로소 약간 쓸만한 프로그램이라 할 수 있을 것입니다. 그렇다면 이번에는 Exceller가 수정한 시트를 살펴보도록 하지요.
잘 되지요? Exceller가 작성한 것이라 해서 정답이라고 할 수도 없고, 정답일 리도 없겠지만 프로그램을 짤 때에는 항상 사용자의 입장에서, 어떻게 하면 좀더 사용자가 편리하게 작업할 수 있을 것이지를 항상 염두에 두어야 합니다. 혹시 오늘 강좌를 보시는 분 중에,
"VBA 코드를 한 줄도 집어넣고 만든 파일을 가지고 프로그래밍을 했다고 할 수 있습니까? 뭔가 착각하신 게 아닌지…?"
이렇게 생각하시는 분이 혹시 계실지 모르겠습니다만, 절대 그렇지가 않습니다. 복잡한 코드의 삽입유무와는 상관없이 우리의 삶 자체가 곧 Programming의 연속입니다. 컴퓨터 상에서, 컴퓨터를 움직이도록 하는 작동명령이 프로그래밍 이라고 한다면 현실 세계에서 우리를 움직이도록 하는 "계획/목표"가 바로 프로그래밍의 다른 이름인 것이지요. 따라서 삶을 살면서 프로그래밍 없이 사는 사람은 문제가 있는 사람이라고 할 수 있을 것입니다.
년간 사업계획을 짜는데 과장님이 담당별로 업무분장을 잘하고 스캐쥴링을 철저히 해서, 정해진 기한 내에 차질없이 잘 끝마쳤다면 이 과장님은 프로그래머입니다. 기말고사를 앞둔 수험생이 계획에 따라 자신이 정한 규율을 잘 지켜 소기의 목적을 달성하였다면 이 수험생도 프로그래머인 것입니다. 이러한 연유로 우리 모두는 자기 인생의 프로그래머인 것이지요. 사람에 따라 프로그램을 잘짜느냐 못짜느냐의 차이는 있을 지언정…
무슨 얘기를 하다가 또 이런 해괴한(?)… 다시 정신을 차리고…
질문하신 분의 경우, "납입자 수"를 구하기 위해 아래와 같은 수식을 사용해서 해결을 시도하셨습니다.
=INDEX(P4:P53,IF(MONTH(TODAY())<7,1,3),CHOOSE(MONTH(TODAY()),1,1,3,5,7,9,1,3,3,5,7,9))
여러 가지 함수를 복합적으로 조합한 것 까지는 좋았는데… 일단은 Index 함수와 Choose 함수의 사용법에 있어 약간 혼돈을 하신 것 같고, 그리고 이렇게 해서는 납입자수를 구하기가 어렵습니다.
Index 함수는 지정한 영역 내에서 지정한 위치에 해당되는 값을 돌려주는 함수이고, Choose 함수는 index_num값을 사용해서 주어진 목록에서 값을 구하는 함수입니다. index_num이니 리턴이니 해 놓으니까 복잡해 보이는데 쉽게 말해서 서로 사촌뻘 된다고 생각하시면 됩니다. 아래의 수식들을 보세요.
| =INDEX({"월요일","화요일","수요일","목요일","금요일","토요일","일요일"},3) | =INDEX({"월요일","화요일","수요일","목요일","금요일","토요일","일요일"},3) |
| =CHOOSE(3,"월요일","화요일","수요일","목요일","금요일","토요일","일요일") | =CHOOSE(3,"월요일","화요일","수요일","목요일","금요일","토요일","일요일") |
따라서 위의 수식을 뜯었다가 다시 조립해 보면 아래와 같이 될 것입니다.
=Index(P4:P53,1,1)
이렇게 해 놓으니까 당연히 P4:P53 영역 내에 있는 첫번째 셀의 값인 "-"가 화면상에 덩그렇게 나타나게 되는 것이지요. 따라서 이것을
=COUNTIF(CHOOSE(AG1,January,February,March,April,May2,June,July,August,September,October,November,December),"○")
이렇게 고쳐주면 해결이 됩니다. 여기서 January, February… 등은 워크시트 상에 미리 이름을 정의해 둔 것입니다. 이름 상자(Name Box) 또는 "삽입-이름" 메뉴를 통해 어느 부분에 어떻게 이름이 붙여졌나 살펴보시기 바랍니다.
"급식자수" 부분도 대동소이 합니다.
이상에서 설명드린 것 이외에도 ModifiedByExceller 시트에 가 보시면 몇 가지 유익한 것들이 더 숨겨져 있으니까 잘 살펴보시기 바랍니다. 그리고 VBA 코드는 단 한 줄도 사용하지 않았으니까 겁먹지(?) 마시기를… 그리고 하시다가 막히는 부분이 있으면 언제든지 질문하세요.
오늘은 여기까지…
정리 — 급식현황표 만들기
| 구분 | 내용 |
|---|---|
| 질문의 문제 | INDEX와 CHOOSE만으로는 지정한 위치의 셀 값 하나(첫째 셀의 -)가 반환될 뿐 인원수가 계산되지 않음 |
| INDEX 함수 | 지정한 영역에서 지정한 위치에 해당하는 값을 돌려줌 |
| CHOOSE 함수 | index_num 값을 사용해 주어진 목록에서 값을 선택 |
| 해결 수식 | =COUNTIF(CHOOSE(AG1,January,February,March,April,May2,June,July,August,September,October,November,December),"○") |
| 월별 범위 | 워크시트에서 미리 이름을 정의해 두고 CHOOSE로 해당 월의 범위를 선택 |
| 사용자 편의 | 에러 처리와 콤보박스로 월을 선택하면 해당 월 자료만 표시 |
자주 묻는 질문 (FAQ)
Q1. INDEX와 CHOOSE 수식이 숫자가 아닌 기호를 돌려주는 이유는 무엇인가요?
INDEX는 지정한 영역에서 지정한 위치의 값 하나를 돌려주는 함수라서 영역의 첫째 셀 값이 그대로 나타납니다. 인원수를 구하려면 표시 기호가 있는 셀의 개수를 세는 COUNTIF가 필요합니다.
Q2. 월별로 범위를 골라 인원수를 세려면 어떻게 하나요?
월별 범위에 이름을 정의하고 CHOOSE로 해당 월의 이름을 골라 COUNTIF의 범위로 사용해 표시 기호의 개수를 셉니다.
Q3. 월을 편리하게 선택하도록 하려면 어떻게 하나요?
콤보박스로 월을 선택하게 하고 선택한 값을 CHOOSE의 index_num에 연결하면 선택한 월의 자료만 화면에 표시됩니다. 에러가 나는 경우의 처리도 함께 해 주면 좋습니다.
마치며
VBA 코드 없이도 이름 정의와 함수의 조합만으로 사용자가 월을 고르면 수치가 바뀌는 현황표를 만들 수 있습니다. VBA에 대한 기초 지식을 공부하실 분은 아이엑셀러 닷컴 사이트 상단 메뉴에서 [Excel 강의] - [Excel 입문]을 먼저 보시면 이해하기 쉽습니다.