http://kin.naver.com/detail/detail.php?d1id=1&dir_id=1050202&eid=5DcZU6lEIemseRJwgdZCpYJZIDoWt3kl
|
B |
C |
D |
E |
F |
G |
2 |
번호 |
데이터 |
날짜 |
시간 |
|
|
3 |
333 |
aaa |
2008-02-10 |
21:00 |
1 |
1 |
4 |
111 |
bbb |
2008-02-12 |
11:00 |
2 |
3 |
5 |
111 |
ccc |
2008-02-12 |
12:00 |
2 |
4 |
6 |
222 |
ddd |
2008-02-12 |
10:00 |
3 |
3 |
7 |
111 |
eee |
2008-02-10 |
21:10 |
2 |
1 |
8 |
222 |
fff |
2008-02-10 |
15:00 |
3 |
1 |
9 |
333 |
ggg |
2008-02-11 |
18:01 |
1 |
3 |
10 |
222 |
hhh |
2008-02-12 |
17:00 |
3 |
4 |
11 |
333 |
iii |
2008-02-11 |
18:00 |
1 |
2 |
12 |
111 |
jjj |
2008-02-12 |
10:00 |
2 |
2 |
13 |
222 |
kkk |
2008-02-10 |
20:00 |
3 |
2 |
14 |
|
|
|
|
|
|
15 |
333 |
ggg |
|
|
|
9 |
16 |
111 |
ccc |
|
|
|
5 |
17 |
222 |
hhh |
|
|
|
10 |
18 |
#N/A |
#N/A |
|
|
|
### |
설명을 위해 간략히 예시했습니다. (구조는 올리신 질문과 같습니다.) 데이타가 B3:E13에 있을 때,
F3 =IF(COUNTIF(B$2:B2,B3)=0,MAX(F$2:F2)+1,VLOOKUP(B3,B$3:F3,5,0)) ; 새로운 번호가 나오면 카운터 증가
G3 =SUMPRODUCT((B$3:B$13=B3)*(D$3:D$13<D3))+SUMPRODUCT((B$3:B$13=B3)*(D$3:D$13=D3)*(E$3:E$13<=E3)) ; 해당 번호 중 시간 순서
B15 =INDEX(B$3:B$13,MATCH(ROW(A1),F$3:F$13,0)) ; 등장 순서대로 번호 가져오기
G15 =SUMPRODUCT((B$3:B$13=B15)*(G$3:G$13=COUNTIF(B$3:B$13,B15))*ROW(G$3:G$13)) ; 행 번호
C15 =OFFSET(C$2,G15-ROW(C$2),0) ; G15의 마지막 행 번호에 해당하는 데이타 가져오기
F3:G3 잡아 아래로 데이타 행 만큼, B15:C15 잡아 아래로 데이타가 다 나오기까지 (#N/A에러가 뜨기까지) 채우면 표가 완성됩니다. 배열수식(속도 문제)을 쓰지 않으려면 이와 같이 보조열을 하나는 써줘야 할 듯 싶습니다. G15가 원하는 '그 번호의 가장 최근 데이타'가 있는 행번호이며, 이걸 구하기 위해 G3에서 (번호가 일치하면서도 날짜는 빠른 행의 수) + (번호와 날짜가 일치하고 시간이 빠른 행 수)를 계산, 주어진 B15의 번호가 원본에 등장하는 수 (333의 경우 3번)와 같은 G열의 행 (9행)을 찾아냅니다. 이 방법은 B열이 문자열로 주어질 때 더욱 유효합니다.
'논리 > 엑셀 프로그래밍' 카테고리의 다른 글
Vlookup 2, 3,...,n번째 값 구하기 (0) | 2008.11.14 |
---|---|
시그마 구현 (a, b 유동참조) (0) | 2008.11.14 |
조건을 만족하는 데이타를 한 셀에 결합 (0) | 2008.11.14 |
특수문자 없애기 (0) | 2008.11.14 |
주소 정렬 (번지수는 숫자로 ; 2-1이 11 보다 앞에 오게) (0) | 2008.11.14 |