본문 바로가기
VBA

[VBA] Evaluate로 계산하기

by 일등미노왕국 2022. 5. 4.

Evaluate는 계산식을 조합하여 계산하기 위해서 쓰곤 한다.

1
2
3
4
5
Evaluate("A1*B2") 'Activeworksheet, A1 = 10, B2 = 2
'Result: 20
 
Evaluate("'Sheet1'!A1*'Sheet1'!A1B2") '"Sheet1", A1 = 10, B2 = 2
'Result: 20

Evaluate는 대괄호[]를 통해서도 표현이 되는데

이는 깔끔하고 보기는 좋지만 속도는 정석적인 표현 보다는 느리다.

 

1
2
3
4
5
6
7
8
9
'This is the same...
Range("A1").Value
'...as this
[A1].Value
 
'This is the same...
Range("A1:A2").Select
'...as this
[A1:A2].Select

실제 본인의 업무에서 있었던 일이었다..어떤 엑셀을 모르는 잡(?) 스러운 인간이 이렇게 엑셀을 한글화 시켰는지는 모르겠으나, 지나고 나니 이렇게 블로그에 글을 쓸 수 있는 소재를 준거 같아 노여움을 없애기로 했다.

 

약간의 극단적이게 예를 들었지만 이런식으로 엑셀로 작성해서 계산기로 작성하고 있었다..

충격적......

 

지금은 웃을 수 있지만 본인도 처음 엑셀을 배울땐 이런 실수를 하지 않았을까?

 

여튼 

 

코드 진행은 이렇다...

1. 정규식을 Guid방식으로 참조를 하였다. / 참조를 수동으로 하셔도 되고 Early Binding이 아닌 late Binding으로 해도 된다. 

 

2. 정규식 패턴은 [^\sㄱ-힇] 공백과 한글이 아닌 것으로 하였다

 

3. 일치된 패턴을 순환하면서(보편적으로는 Mid를 순환한다) Select Case에서 값을 비교한후 sTemp에 값들을 조합한다

Select Case말고 Like를 사용해도 되지만 한글 영어 숫자 특수문자등을 섞을 수가 없다..

가령 수기 계산에 한글 특수문자 영어등이 있다면 LIke문을 각각 다 써줘야 하기에 여기서는 Select Case로 처리하였다.

 

4. 마지막으로 Application.Evaluate로 계산하면된다.

 

Option Explicit
Sub Haja_references()  '= VBScript_RegExp_55 정규식 참조 Guid
    
    Dim strGuid$: strGuid = "{3F4DACA7-160D-11D2-A8E9-00104B365C9F}"
    On Error Resume Next
        ThisWorkbook.VBProject.References.AddFromGuid strGuid, 0, 0
    On Error GoTo 0
   '= 정규식 Early Binding / Late Binding : CreateObject("Vbscript.Regexp")
    Call Haja_Evaluate
End Sub
Sub Haja_Evaluate()

    Dim i&, sTemp$                           '= 수기 계산을 조합할 변수 sTemp
    Dim rngX As Range: Set rngX = [a2]
    Dim Mat As Object                        '= 정규식 일치값
    Dim Reg As New RegExp                    '= 정규식 선언
        Reg.Pattern = "[^\sㄱ-힇]"            '= 정규식 패턴
        Reg.Global = True                    '= 공백이 아니고 한글이 아닌 패턴
    
    Do Until rngX = ""                        '= 수기 계산값이 없을 때 까지 순환
    
        If Reg.Test(rngX) Then                '= 정규식 패턴과 일치하면
        
           Set Mat = Reg.Execute(rngX)        '= 일치값을 Mat으로 선언해라
           
           For i = 0 To Mat.Count - 1         '= 일치값들을 순환해라
           
                Select Case Mat(i)            '= 일치값 중
                
                Case 0 To 9, "+", "-", "*", "/", "(", ")", ".", "%"
                                              '= 0-9까지 거나 해당 특수문자이면
                    sTemp = sTemp & Mat(i)    '= sTemp에 하나씩 조합을 해라
                    
                Case "X", "x"                 '= 영문자 X는 곱하기(*) 표기
                    temp = temp & "*"
                
                End Select
           
           Next i
        
           rngX.Next = Application.Evaluate(sTemp) '= 수기 계산한 값을 실제 구해라
           sTemp = ""                         '= 다음을 위해 sTemp를 초기화해라
        End If
    
    Set rngX = rngX.Offset(1)                 '= 다음 행으로 이동해라
    Loop
    
End Sub

Evaluate(22.05.04).xlsm
0.02MB

댓글