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

[기초방] VBA 100제 #23 [ 제품 나열하기 ]

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

원래는 21번 문제였는데 노화로 인한 초기 치매인지 문제를 낸 지도 몰라서 23번으로 올린다.

같은 크루분들께 죄송하다.

 

이번 문제는 [ 제품 : 과일,라면,음료 ]  이러한 형태의 제품구성에서 제품의 각각의 아이템을

제품 : 아이템1 / 제품 : 아이템2  이런식을 파싱하여 조합하는 형태이다. 보통 이런 경우는 [제품 : ]을 Replace로 없애주고 남아있는 아이템들을 콤마로 Split하여 각각을 조합하면 된다.

 

본인은 이번구문에서 패턴에서 [제품 : ] 을 배제한 Match 값들을 순환하면서 조합하는 형태로 문제를 풀어보려고 한다.

 

패턴을 설명하면 제/품/공백/콜론/콤마가 아닌 다수의 문자를 선택하라는 뜻이다. 

여기서 주의할것은 만일 제품 아이템에 [ 제 또는 품  ] 문자가 들어가면 추출이 불가해진다.

가령 [ 제품 : 유제품, 생선 ] 이렇게 되어있으면 유 / 생선만 걸러지게 된다. 패턴에서 제와 품은 패턴으로 제외시켰기 때문이다.  만일 이런 문자들을 피해서 온전히 제품 아이템만을 가져오고 싶다면 패턴을 이렇게 수정하여야 한다.

물론 이럴경우에는 Match 값들이 아이템별로 따로 떨어져 나오지 않고 하나의 문자열로 나오기 때문에 콤마를 기준으로 Split하여 분리하는 수고를 동반하여야 한다.

 

정규식 관련한 문제는 패턴을 얼마나 빨리 뽑아내서 적용시키는것이 관건임으로 평소에 퍼즐을 풀 듯 지속적인 워밍업을 필요로 한다. 

 

더보기
Option Explicit

Sub 기초방23()

    Dim rngAll As Range: Set rngAll = [a4].CurrentRegion
    Dim rngA As Range
    Dim Mat As Object, Ma As Object
   
    rngAll.Sort [b4], 1, [a4], , 1, Header:=1               '= 정렬
        
    [e4].CurrentRegion.Offset(1).Delete                     '= 초기화
    
    For Each rngA In rngAll.Columns(1).Cells                '= 영역을 순환
    
        With CreateObject("vbscript.regexp")                '= 정규식 선언
        
            .Pattern = "[^제품 :,]+"                        '= 제품, 띄어쓰기, 콜론 , 콤마가 아닌것
            .Global = True
        
            If .test(rngA(1, 3)) Then
    
                Set Mat = .Execute(rngA(1, 3))              '= 패턴과 일치하면 Mat에 담아라
                
                For Each Ma In Mat                          '= 일치된 패턴값을 순환해라
                
                    Cells(Rows.Count, "e").End(3)(2) = rngA '= 이름
                    Cells(Rows.Count, "f").End(3)(2) = Format(rngA.Next, "yyyy-mm-dd") '= 날짜
                    Cells(Rows.Count, "g").End(3)(2) = "제품 : " & Ma  '= 제품과 아이템을 조합
                    
                Next Ma
                
            End If
        
        End With
    
    Next rngA

    haja_format

End Sub

Function haja_format()

    With [e4].CurrentRegion
         .Borders.LineStyle = 1
         .HorizontalAlignment = xlCenter
         
    End With

End Function

기초방23.xlsx
2.53MB

댓글