Excel 如何编写此求值公式,使变量不';不返回错误吗?

Excel 如何编写此求值公式,使变量不';不返回错误吗?,excel,vba,Excel,Vba,我有一个公式,当在With/End With语句中用于以下范围时,它可以完美地工作: .Formula=“=IFERROR(INDEX(“&MasterDataRange.Address(External:=True)”和“&Cells(iRow,Entry1)。Address(True,False)和”&Left(&Cells(iRow+1,Entry2)。Address(False,False)和“,”4)和“&wks4.Range(“L7”)。Value和“,”和MasterRowMatc

我有一个公式,当在With/End With语句中用于以下范围时,它可以完美地工作:

.Formula=“=IFERROR(INDEX(“&MasterDataRange.Address(External:=True)”和“&Cells(iRow,Entry1)。Address(True,False)和”&Left(&Cells(iRow+1,Entry2)。Address(False,False)和“,”4)和“&wks4.Range(“L7”)。Value和“,”和MasterRowMatchRange.Address(extery:=True)和“,”0),匹配(“&header01和“,”&MasterColumnMatchRange.Address(外部:=True)和“0”),0“

当尝试评估上述内容并将其分配给变量时,变量将返回错误结果“error 2015”

xResult=Evaluate(“=IFERROR(INDEX)(&MasterDataRange.Address(External:=True)和“&Cells(iRow,Entry1).Address(True,False)和”&Left(&Cells(iRow+1,Entry2).Address(False,False)和“,”&wks4.Range(“L7”)。Value和“,”和MasterRowMatchRange.Address(extery:=True)和“,”0),匹配(&header01和“,”&MasterColumnMatchRange.Address(外部:=True)和“,”0“)


有人能帮我理解吗?提前感谢。

经过深入研究,发现vba求值方法有255个字符的限制,另外我需要删除.Formula方法使用的一些字符串引用

谢谢你的帮助。对于感兴趣的人,代码现在是:

    Set cell = wks4.Range("L7")
    On Error Resume Next
    rResult = Evaluate("MATCH(" & Cells(iRow, Entry1).Address(True, False) & "&" & "Left(" & Cells(iRow + 1, Entry2).Address(False, False) & ", 4)" & "&" & cell.Address(External:=True) & "," & MasterRowMatchRange.Address(External:=True) & ",0)") 'Match Header
    cResult = Evaluate("MATCH(""" & header01 & """," & MasterColumnMatchRange.Address(External:=True) & ",0)")  'Match Column
    xResult = Evaluate("INDEX(" & MasterDataRange.Address(External:=True) & "," & rResult & "," & cResult & ")")
    On Error GoTo 0
    If IsError(xResult) Then 'Handle Error 2042 = #N/A
        Range(Cells(iRow, iCol), Cells(iRow, iCol)) = 0
    Else:
        Range(Cells(iRow, iCol), Cells(iRow, iCol)) = xResult
    End If

在某些情况下,如果不将公式直接写入单元格,就无法绕过公式的255个字符限制。Excel较新的求值引擎没有旧的求值引擎所具有的相同限制(即
应用程序使用的求值引擎。求值
。求值大于255个字符限制的函数的工作原型如下所示:

Function EvaluateAny(ByVal sFormula as string) as variant
    static evaluatorCell as Range: if evaluatorCell is nothing then set evaluatorCell = Range("...")
    if len(sFormula) > 255 then
        evaluatorCell.formula = sFormula
        evaluatorCell.Calculate
        EvaluateAny = evaluatorCell.value
    else
        EvaluateAny = Application.Evaluate(sFormula)
    end if
End Function
注意:此方法将比Application.Evaluate()慢得多

另一种选择是使用,以便更直接地实现公式:

Dim func as stdLambda: set func = stdLambda.Create("$1 > 10")
Debug.Print func(100) 'true
Debug.Print func(5)   'false

如果你继续这样做的话,你将需要包括可伸缩接口。

确保你使用
工作表。评估
而不是
应用程序。评估
。我将代码更改为
xResult=Worksheet。评估(=IFERROR(INDEX)(&MasterDataRange.Address(External:=True))匹配(&Cells(iRow,Entry1)。地址(True,False)和“&Left(&Cells(iRow+1,Entry2)。地址(False,False)&”,4)&“&wks4.Range(“L7”)。值和“,”&MasterRowMatchRange.Address(外部:=True)和“,”0),匹配(“&header01和“,”&MasterColumnMatchRange.Address(外部:=True)和“,”0)”)
返回以下错误:运行时错误“424”:需要对象。有趣的是,当我编码
xResult=Evaluate(“=SUM(10,20,30)”)时
xResult返回的预期结果为60。您需要引用此公式应该根据的
工作表
。请参阅文档。尝试删除公式开头的
=