👻
Excelで文字列計算できるVBA関数(CalcText)【括弧不一致も検出】
はじめに
数量計算書などで (2.000+3.000)/2×5.400 のような文字列を計算したい場面があります。
Excel標準では文字列を直接計算できませんが、VBAの Evaluate 関数を使えば可能です。
ただし、括弧の不一致や不正文字があると #VALUE! エラーになってしまいます。
そこで、括弧不一致を検出し、わかりやすいメッセージを返す関数を作成しました。
解決策
- 全角記号を半角に変換(×、÷、π、√など)
- 括弧の不一致を検出してメッセージ表示
- エラー時は「計算エラーです」と返す
VBAコード
Public Function CalcText(txt As String) As Variant
Dim expr As String
expr = NormalizeExpression(txt)
If expr = "" Then
CalcText = ""
Exit Function
End If
If Not IsValidBrackets(expr) Then
CalcText = "括弧の不一致があります"
Exit Function
End If
Dim result As Variant
result = Application.Evaluate(expr)
If IsError(result) Then
CalcText = "計算エラーです。式を確認してください。"
Else
CalcText = result
End If
End Function
Private Function NormalizeExpression(txt As String) As String
Dim expr As String
expr = StrConv(txt, vbNarrow)
expr = Replace(expr, "×", "*")
expr = Replace(expr, "*", "*")
expr = Replace(expr, "÷", "/")
expr = Replace(expr, "/", "/")
expr = Replace(expr, "−", "-")
expr = Replace(expr, "π", "3.14159265358979")
expr = Replace(expr, "√", "SQRT(")
expr = Replace(expr, "%", "/100")
NormalizeExpression = expr
End Function
Private Function IsValidBrackets(expr As String) As Boolean
Dim i As Long, ch As String
Dim depth As Long
For i = 1 To Len(expr)
ch = Mid(expr, i, 1)
If ch = "(" Then
depth = depth + 1
ElseIf ch = ")" Then
depth = depth - 1
If depth < 0 Then
IsValidBrackets = False
Exit Function
End If
End If
Next i
IsValidBrackets = (depth = 0)
End Function
Excelでの使い方
セルに =CalcText(D12) と入力。
丸めたい場合は以下の式を使います:
=IF(D12="","",IF(ISNUMBER(CalcText(D12)),ROUND(CalcText(D12),3),CalcText(D12)))
実行例
正常な式
((0.800×0.750+0.500×0.600)×4×10.000)+5.0
→ 41.00
括弧不一致
(0.800×0.750+0.500×0.600)×4)×10.000+5.0
→ 「括弧の不一致があります」
!Excel実行例
Excelでの実行例。正常な式は計算結果、括弧不一致はメッセージを返す
!VBAコード例
VBAで作成したCalcText関数。括弧の不一致や不正文字を検出する仕組みを実装

最後に
トライ&エラーの繰返しでしたねー
なかなか、問題がどこにあるのか? わからなかったりで...
やっと、できたみたい って感じながよー
ほいたらねー
Discussion