
이번 문제는 숫자와 사칙계산 부호만을 이용하여 계산하는 문제이다.
숫자만 가져오는 구문은 like문처럼 [0-9] 이렇게 하거나 정규식 패턴은 \d 이렇게 하면 되는데,
\d 는 1234 라는 숫자가 있으면 1만 선택이 된다. 여러자리의 숫자를 선택하려면 \d+ 이렇게 하면된다.
이 문제를 해결하기 위해서 본인이 사용한 패턴은 이렇다.
.Pattern = "[^\d++-×÷]"
숫자가 아니고 사칙연산 기호가 아닌 모든것을 패턴으로 잡고 삭제하기 위함이다.


부정기호인 ^ 의 사용으로 선택된 패턴들이 반전되는것을 볼 수 있다.

우리가 사용하는 사칙연산 기호중 곱하기와 나누기는 컴퓨터가 이해하는 기호와는 다르기 때문에 변경을 해줘야 한다.
If .test(rngX) Then
str = Replace(.Replace(rngX, ""), "×", "*")
str = Replace(str, "÷", "/")
rngX.Next = Application.Evaluate(str)
End If
이 구문을 넣어서 사용하면 이 문제를 해결할 수 있다.
정규식을 반드시 익혀서 본인의 무기로 꼭 만드길 바란다.
더보기
Sub 기초방13()
Dim Reg As Object: Set Reg = CreateObject("Vbscript.regexp")
Dim rngX As Range: Set rngX = [b3]
Dim str$
Do Until rngX = ""
With Reg
.Pattern = "[^\d++-×÷]" '= 정규식패턴
.Global = True
If .test(rngX) Then
str = Replace(.Replace(rngX, ""), "×", "*") '= 사칙연산을 위한 기호변경
str = Replace(str, "÷", "/")
rngX.Next = Application.Evaluate(str) '= 수식 그대로 계산
End If
End With
Set rngX = rngX.Offset(1)
Loop
End Sub


기초방13.xlsm
0.02MB
'VBA > 엑사남_기초방' 카테고리의 다른 글
[기초방] VBA 100제 #15 [ 이벤트 + 사용자함수 ] (0) | 2023.01.15 |
---|---|
[기초방] VBA 100제 #14 [ 이벤트 필터링하기 ] (0) | 2023.01.15 |
[기초방] VBA 100제 #12 [ Like구문 ] (0) | 2023.01.10 |
[기초방] VBA 100제 #11 [ 영역과 조건에 따른 숫자채우기 ] (0) | 2023.01.07 |
[기초방] VBA 100제 #10 [ 데이터 영역 재설정하기 ] (0) | 2023.01.06 |
댓글