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

[기초방] VBA 100제 #18 [ 이름별 카테고리 나열하기 ]

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

왼쪽에 있는 표를 이름별로 나열하는 구문이다.

 

이문제는 이름과 이름과 하위분류로 이루어져있다.

이름이 나오면 한행을 이동후 E열에 이름부터 다시 출력을 하여야 한다.

If InStr(rngA, " ") = 0 Then 
        
Set rngX = Cells(rngX.Row + 1, "e")

rngX = Split(rngA, " ")(0)

문자 조합이 이름은 이름만 있고 이름과 하위분류로 구성된것은 이름 + [공백 ]  + 하위분류로 되어 있기 때문에

Instr로 공백 유무를 따지면 이게 이름으로 구성되어 있는지 이름과 하위분류의 조합인지를 알 수 있다.  따라서 위의 구문은 이름으로만 구성이 되었다면 한행을 내려와서 E열에 이름을 출력하라는 구문임을 알 수 있다.

내말 몬말인지 알지??

 

출력은 [e5] 부터 출력인데 rngX 의 초기 설정값이 e4인걸 확인 바란다. 

엑사남님이 처음이니까 엑사남님부터 rngX의 row 값에 +1 을 해서 "e" 열에 이름을 출력하면서 마지막 모카님까지 차례대로 출력을 하게된다.

더보기
Option Explicit

Sub 기초방_18()

    Dim rngAll As Range: Set rngAll = [b5:b25]
    Dim rngA As Range
    Dim rngX As Range: Set rngX = [e4]
    
    
    For Each rngA In rngAll
            
        If InStr(rngA, " ") = 0 Then           '= 이름만 있는 행이면
        
          Set rngX = Cells(rngX.Row + 1, "e")  '= 현재 있는 행에서 한행 내려와서 "e"  열을
                                               '= rngX로 설정
                                               
              rngX = Split(rngA, " ")(0)       '= 이름을 출력
        
        Else: rngX = Split(rngA, " ")(1)       '= 이름과 서브제목으로 구성이라면 서브제목을 출력
        
        End If
        
        Set rngX = rngX.Offset(, 1)            '= 열방향으로 rngX를 계속 이어나가라.
           
    Next rngA
    
End Sub

 

이번 코드에 사용된 instr은 크롤링할때 문자 파싱할때도 많이 사용되는 함수기 때문에 이번기회에 익혀두길 바란다.

Set rngX = Cells(rngX.Row + 1, "e")  이 구문도 야무지게 사용할 수 있으니 체크하길 바란다.

 

기초방#18.xlsm
0.02MB

댓글