이번 문제는 셀의 움직임을 정확히 알고 있어야 쉽게 제어할 수 있다.
아래행으로 진행다가 자신이 이전셀보다 크다면 출력값에 본인의 값을 출력하고 영역을 스위칭해야 하는 문제이다.
A 영역에 있을 경우 결과값에 값을 출력하기 위해서는 A 영역기준 열방향으로 +2를 해야한다.
A 영역부터 시작할테니 A영역은 Bln의 초기값인 False 이다
B 영역에 있을 경우 결과값에 값을 출력하기 위해서는 B 영역기준 열방향으로 +1를 해야한다.
B 영역으로 스위칭되면 B영역은 Bln값이 True로 스위칭하면 된다.
C = IIf(bln = False, 2, 1)
'= 해당 영역 기준 A 영역은 +2 / B 영역은 +1 한 영역에 해당 값을 출력하기 위한 상수
A영역 False에서 B로 이동하려면 +1로 이동해야한다.
B영역 True에서 A로 이동하려면 -1로 이동해야한다.
R = IIf(bln = False, 1, -1)
'= A->B 로는 False +1 / B->A 로는 True -1
이 문제의 키포인트는 아래구문중 Loop Until 구문중에서 Cnt<>1 구문이다.
Do
Set rngX = rngX.Offset(1)
rngX(1, 1 + C) = rngX
rngX(1, 1 + C).Interior.Color = rngX.Interior.Color
Cnt = Cnt + 1
If rngX = "" Then Exit Sub
Loop Until rngX(0, 1) < rngX(1, 1) And Cnt <> 1
이게 왜 중요하나면
Loop Until rngX(0, 1) < rngX(1, 1)
단순히 이렇게 조건식으로 써버리면 영역을 옮기자마자 바로 이전셀과 비교를 해버리게 되어서
결과값이 A영역 93에서 B영역 95로 스위칭된 다음 95는 바로 이전셀 39랑 비교하여 바로 또 스위칭하게 된다.
그렇기 때문에 영역의 새로운 초기값은 보호하기 위해 And문으로 첫번째 셀이 아닐 때라는 것을 조건식에 넣어준것이다.
Loop Until rngX(0, 1) < rngX(1, 1) And Cnt <> 1
이렇게 영역을 출력하다가 영역을 변경해야 할 경우는
Set rngX = rngX.Offset(, R)
bln = Not bln
만약 Bln이 False이면 A영역이니까 R값은 +1 이 된다. 따라서 Set rngX = rngX.offset(,1) 이 됨으로 B영역이 된다.
B영역의 Bln값을 변경해야 함으로 bln = Not bln : True가 된다.
만약 Bln이 True이면 B영역이니까 R값은 -1 이 된다. 따라서 Set rngX = rngX.offset(,-1) 이 됨으로 A영역이 된다.
A영역의 Bln값을 변경해야 함으로 bln = Not bln : False가 된다.
Option Explicit
Sub 기초방_6()
Dim rngX As Range: Set rngX = [d5]
Dim C&, R&
Dim bln As Boolean
Dim Cnt&
haja_Clear '= 초기화
Do Until rngX = "" '= 데이터가 없을 때까지 반복
C = IIf(bln = False, 2, 1)
'= 해당 영역 기준 A 영역은 +2 / B 영역은 +1 한 영역에 해당 값을 출력하기 위한 상수
R = IIf(bln = False, 1, -1)
'= A->B 로는 False +1 / B->A 로는 True -1
Do
Set rngX = rngX.Offset(1) '= 행 이동
rngX(1, 1 + C) = rngX '= 출력데이터 영역에 Active 셀값을 출력
rngX(1, 1 + C).Interior.Color = rngX.Interior.Color '= 출력데이터 영역에 Active 셀 인테리어 컬러를 채워라
Cnt = Cnt + 1 '= 바뀐 영역의 몇번째 값인지 파악하기 위한 임시 숫자 카운팅
If rngX = "" Then Exit Sub '= 무한루프를 방지하기 위해 rngX가 빈셀이면 종료
Loop Until rngX(0, 1) < rngX(1, 1) And Cnt <> 1 '= 이전셀보다 현재셀이 더 크거나 카운팅 함수가 1이 아닐때까지 순환
Set rngX = rngX.Offset(, R) '= R값에 따라 rngX를 새로 설정
bln = Not bln '= 현재 Bln 의 반대값으로 bln 설정
'= bln이 False 이면 True / True 이면 False
Cnt = 0 '= Cnt 초기화
Loop
End Sub
Function haja_Clear()
Dim rng_Erase As Range: Set rng_Erase = Range([f6], [f6].End(4))
rng_Erase.Interior.Color = xlNone
rng_Erase.ClearContents
End Function
한단계 한단계 디버깅 모드로 움직이며 셀을 제어하면서 이해해보시길 바란다.
'VBA > 엑사남_기초방' 카테고리의 다른 글
[기초방] VBA 100제 #9 [ 데이터 영역 선택하기 ] (0) | 2023.01.05 |
---|---|
[기초방] VBA 100제 #7 [ 행렬변환 ] (2) | 2023.01.04 |
[기초방] VBA 100제 #8 [ 데이터 영역 선택하기 ] (0) | 2023.01.04 |
[기초방] VBA 100제 #5 [ 영역의 끝찾기 ] (0) | 2023.01.02 |
[기초방] VBA 100제 #3 [ 나를찾아줘 ] (4) | 2022.12.26 |
댓글