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

[기초방] VBA 100제 #44 [ 각종 통화 할인율 구하기 ]

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

 

 

정규식을 이용한 파씽문제이다.

문제에서 한자리 통화기호 + 금액 / 할인율을 파씽하여 그 결과를 도출하는 문제이다.

 

처음 본인이 했던것은 1그룹(통화기호 + 금액)  / 2그룹(할인률) 이렇게 하여 통화기호를 분리하여 계산후 다시 통화기호를 붙히는 작업을 하였는데,  1그룹(통화기호) + 2그룹(금액) + 3급액(할인률) 이렇게 분리하는게 코드가 좀 더 깔끔할 것 같아 수정하였다.


패턴설명은 이렇다.

(1그룹 : 숫자앞에 임의의 한자리)+(2그룹:숫자열) [.+? : 의미없는 문자] +(3그룹: 1자리부터3자리의 숫자와 퍼센트기호)

 

With Mat(0)               
       
    rngA(1, -2) = .submatches(0) & .submatches(1)   '= 통화 기호 + 통화
    rngA(1, -1) = .submatches(2)                    '= 할인율
    rngA(1, 0) = .submatches(0) & Format(CLng(.submatches(1)) * (1 - rngA(1, -1)), "0.00")

End With

분리된 숫자들은 문자화되기 때문에 Clng로 String에서 Long 타입으로 변경해줘야 계산이 된다.

이렇게 계산된 금액을 소수점 2자리까지 표현하는 Format(숫자,"0.00") 까지 해주면 결과물처럼 나오게 된다.

 

더보기
Sub test()

    Dim rngAll As Range: Set rngAll = Range([f6], [f6].End(4))
    Dim rngA As Range
    Dim Reg As New RegExp
    Dim Mat As Object
    Dim Num
    
    With Reg
    
        .Pattern = "(.\d+).+?(\d{1,3}%)"
        .Global = True
    
    End With
    
    For Each rngA In rngAll
    
        Set Mat = Reg.Execute(rngA)
        
        rngA(1, -2) = Mat(0).submatches(0)
        rngA(1, -1) = Mat(0).submatches(1)
        rngA(1, 0) = Left(rngA(1, -2), 1) & Format(CLng(Right(rngA(1, -2).Value, Len(rngA(1, -2)) - 1)) * (1 - rngA(1, -1)), "0.00")
    
    Next rngA
    
End Sub

 

오늘도 맛있는 코드 냠냠!!

기초방44.xlsm
0.02MB

댓글