评估()未按预期在Excel VBA中工作

时间:2016-02-09 20:31:33

标签: excel vba excel-vba

我在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。

注意:我已经对此进行了大量重写,以使其更加清晰。

0 个答案:

没有答案