논리/엑셀 프로그래밍

회원목록 기수별 동일 수로 데이터 배분 정렬

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

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

 

난수를 사용, 특정 인원 수 임의목록 발생하기. 응용하면 꽤 여러 분야에 활용 가능할 것임.

 

 

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

2

이름

기수

주소

우편

 

 

 

 

 

 

 

 

 

 

 

매장

이름

기수

주소

우편

3

1

서울

111

7

 

1

0

1

0

1

1

3

7

 

1

1

대전

555

4

1

부산

222

8

 

1

0

2

0

2

1

7

6

 

1

1

인천

444

5

1

대구

333

5

 

1

0

3

0

3

1

9

12

 

1

2

제주

123

6

1

인천

444

4

 

1

0

4

0

4

2

4

8

 

2

1

광주

666

7

1

대전

555

6

 

0

1

0

1

1

2

8

3

 

2

1

서울

111

8

1

광주

666

3

 

0

1

0

2

2

2

10

9

 

2

2

경기

777

9

2

경기

777

12

 

2

0

1

0

1

3

5

5

 

3

1

대구

333

10

2

충청

888

9

 

2

0

2

0

2

3

11

11

 

3

2

강원

999

11

2

강원

999

11

 

2

0

3

0

3

4

6

4

 

4

1

부산

222

12

2

제주

123

10

 

2

0

4

0

4

4

12

10

 

4

2

충청

888

 

F3 =SMALL(IF((COUNTIF(F$2:F2,ROW(C$3:C$12))=0)*(C$3:C$12=C3),ROW(C$3:C$12)),INT(RAND()*(COUNTIF(C$3:C$12,C3)-COUNTIF(C$2:C2,C3)))+1)

H3 =IF(COUNTIF(G$2:G2,C3)<INT(COUNTIF(C$3:C$12,C3)/4)*4,1,0)

I3 =IF(H3>0,0,1)

J3 =IF(H3=0,0,IF(J2=4,1,J2+1))

K3 =IF(I3=0,0,MOD(COUNTIF(I$2:I2,1),4)+1)

L3 =J3+K3

M3 =IF(COUNTIF(M2:M$2,M2)<COUNTIF(L$3:L$12,M2),M2,M2+1)

N3 =MIN(IF((L$3:L$12=M3)*(COUNTIF(N$2:N2,ROW(L$3:L$12))=0),ROW(L$3:L$12),66000))

O3 =INDIRECT("F"&N3)

Q3 =M3

R3 =OFFSET($B$3,$O3-ROW($B$3),COLUMN()-COLUMN($R$2))

 

수식 중 F3, N3는 입력 후 CTRL+SHIFT+ENTER (배열수식) 해야 합니다. 이후 R3 잡아 오른쪽으로 U3까지, F3:U3 잡아 아래로 데이타 행 만큼 복사하면 결과표를 Q3:U12에 얻습니다. 로직을 간단히 설명하면, F열에서 난수를 발생, 기수별 리스트 인원의 순서를 섞습니다. H:K 열에서 순차적으로 1~4를 부여 (각 기수 총원을 4로 나눈 나머지 짜투리는 따로 모음), O열에서 섞은 행을 가져옵니다. 이로써 기수별, 매장별 인원이 정확히 4등분 되는 효과를 얻습니다. 난수가 들어 있으므로 한번 작업 후엔 결과표를 복사, 적당한 곳에 선택하여 붙여넣기-값-확인...해 두시는 것이 안정적입니다.