본문 바로가기
VBA/엑사남_기초방

[기초방] VBA 100제 #6 [ 데이터 영역 스위칭 ]

by 일등미노왕국 2023. 1. 2.

이번 문제는 셀의 움직임을 정확히 알고 있어야 쉽게 제어할 수 있다.

 

아래행으로 진행다가 자신이 이전셀보다 크다면 출력값에 본인의 값을 출력하고 영역을 스위칭해야 하는 문제이다.

 

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

한단계 한단계 디버깅 모드로 움직이며 셀을 제어하면서 이해해보시길 바란다.

기초방#6-1 지그재그.xlsm
0.02MB

댓글