我在Excel VBA模块中有一个用户定义的函数。让我们说是:
Function MyFunc( val1 as Double, val2 as int, val3 as int ) as Double
MyFunc = val1 * val2 + val3
End Function
我还有另一个功能MyEval:
Function MyEval( formula as string )
MyEval = Evaluate( formula )
End Function
在工作表中,单元格B1包含以下字符串:
"blah blah blah "&MyFunc(VAL,2,0)&" foobar "&MyFunc(VAL,6,5)&" do re mi"
请注意,引号是字符串的一部分,而不仅仅是表示它是一个字符串。在第二个单元格中,我有以下内容:
=MyEval(SUBSTITUTE(B1,"VAL",8))
一般来说,这是有效的。在上面的例子中,我会按预期得到字符串:
blah blah blah 16 foobar 53 do re mi
但在某些情况下,我会得到#VALUE!。当我检查那些失败的例子时,我会发现删除不同的部分会允许字符串进行评估,但没有特定的部分导致它失败,即,只是前半部分工作,只是下半部分工作,只是中间部分工作。
认为它可能是一个长度问题(字符串最多200个字符),我写了一个新的评估函数,我将字符串分解为连接符号(&)上的部分,分别评估每个部分,然后将结果连接在一起:
Function MyEval2(formula As String)
If Len(formula) = 0 Then
Eval2 = ""
Else
Dim parts() As String
parts = Split(formula, "&")
Dim result As String
result = ""
Dim index As Integer
Dim part As String
For index = LBound(parts) To UBound(parts)
part = parts(index)
If (Left(part, 1) = """") And (Right(part, 1) = """") Then
part = Left(part, Len(part) - 1)
part = Right(part, Len(part) - 1)
result = result & part
Else
Dim val As Variant
val = Evaluate(part)
result = result & val
End If
Next index
Eval2 = result
End If
结束功能
在这种情况下,有时当变量'part'是,例如,字符串
MyFunc(8,6,5)
行
val = Evaluate(part)
导致'val'成为字符串
MyFunc(8,6,5)
而不是值53。
注意:我已经对此进行了大量重写,以使其更加清晰。