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()를 사용한 터라 이미 간 집의 이력은 수동으로 복사-선택하여 붙여넣기-값-확인...을 항상 해야 한다는 번거로움이 있습니다. 이것 마저 자동으로 된다면 좋을텐데, 아마 함수로는 안될 겁니다.(저는 방도를 알지 못합니다.)
'논리 > 엑셀 프로그래밍' 카테고리의 다른 글
2차원 보간법 (유동 참조) (0) | 2008.11.14 |
---|---|
데이타가 하나라도 있는 행 모음 (0) | 2008.11.14 |
금액을 화폐별 수량으로 집계 (0) | 2008.11.14 |
품목별 조건에 따라 누계 계산 (0) | 2008.11.14 |
검색어 포함된 모든 항목 나열 (0) | 2008.11.14 |