논리/엑셀 프로그래밍

식당 목록 (랜덤) 만들기

섬그늘 2008. 11. 14. 12:29

http://kin.naver.com/detail/detail.php?d1id=1&dir_id=1050202&eid=hirXlD6zkuFfsinpOKk3kbFAkssCxCRm

 

 

B

C

D

E

F

2

 

 

 

 

 

3

날짜

점심

저녁

 

식당목록

4

2008-02-28

속초집

해물전

 

대나무

5

2008-02-29

전주집

소나무

 

소나무

6

2008-03-01

대나무

부산집

 

잣나무

7

2008-03-02

부추전

속초집

 

부산집

8

2008-03-03

전주집

소나무

 

전주집

9

2008-03-04

해물전

잣나무

 

속초집

10

2008-03-05

김치전

대나무

 

부추전

11

2008-03-06

전주집

속초집

 

해물전

12

2008-03-07

부추전

소나무

 

김치전

 

목록이 F4:F12에 있을 때,

C4 =INDIRECT(ADDRESS(SMALL(IF(COUNTIF(C2:D3,$F$4:$F$12)=0,ROW($F$4:$F$12)),INT(RAND()*SUMPRODUCT(N(COUNTIF(C2:D3,$F$4:$F$12)=0)))+1),COLUMN($F$3)))

D4 =INDIRECT(ADDRESS(SMALL(IF(COUNTIF(D2:D3,$F$4:$F$12)+COUNTIF(C2:C4,$F$4:$F$12)=0,ROW($F$4:$F$12)),INT(RAND()*SUMPRODUCT(N(COUNTIF(D2:D3,$F$4:$F$12)+COUNTIF(C2:C4,$F$4:$F$12)=0)))+1),COLUMN($F$3)))

 

위 수식은 모두 입력 후 CTRL+SHIFT+ENTER (배열수식) 해야 합니다. C4:D4 잡아 아래로 복사하면 표가 완성됩니다. 수식을 간단히 설명하면,

 

SMALL(IF(조건식,행번호),순서)

C4의 경우는 해당 셀의 위 두칸 (하루, 이틀 전), D4의 경우는 점심 때를 포함하여 같은 데이타가 있는지 COUNTIF로 확인, 없는 경우에만 행번호를 저장합니다. SUMPRODUCT로 저장된 데이타의 수를 계산, RAND()에 곱하고 INT를 걸어 1을 더하면 완전히 섞는 효과를 냅니다. 그 행에 ADDRESS를 씌우고 INDIRECT를 걸어 데이타를 가져옵니다. 이후는 F9키만 누르면 재계산이 되어 표가 확확 바뀔 겁니다.

 

이걸 응용하면 여러 작업을 (비록 수식이 복잡해진다는 단점은 있지만) 하실 수 있을 겁니다. 50개 점포를 50회 동안 빠짐없이 들르기(순서 로직이 아예 달라져야 합니다), 별도 마크를 한 집은 다른 집 1회 갈 동안 2회 가기, 목록에 휴일은 제외하기 (공휴일 목록, WEEKDAY함수 사용)... 근데 RAND()를 사용한 터라 이미 간 집의 이력은 수동으로 복사-선택하여 붙여넣기-값-확인...을 항상 해야 한다는 번거로움이 있습니다. 이것 마저 자동으로 된다면 좋을텐데, 아마 함수로는 안될 겁니다.(저는 방도를 알지 못합니다.)