Excel评估函数返回#REF使用间接

我有一个查询返回一个公式为文本,具体取决于特定的单元格的值。

返回的公式(如文本)如下所示:

SUM(INDIRECT("AF"&row()),INDIRECT("AG"&row())) 

然后,我使用EVALUATE()函数来评估公式,但由于使用了INDIRECT()而收到#REF错误。

此Microsoft支持页是我能find这个特定问题的唯一参考,它似乎并没有提供适当的解决方法。

我怎样才能:a)重构公式避免使用INDIRECT ,或者b)让EVALUATE()玩的很好?

编辑

查找表看起来像这样:

typesA SUM(INDIRECT(“AF”&row()),INDIRECT(“AG”&row()))
typesB SUM(INDIRECT(“AF”&row()),INDIRECT(“AG”&row()),INDIRECT(“AH”&Row()))

在另一个工作表上,单元格B1:200的内容是Atypes或Btypes。查找将返回基于单元格的公式string并将其放入Bx。 然后我评估string给我的结果。

好的第三次尝试在一个答案:

谢谢你的例子:它失败了,因为你试图使用INDIRECT来评估一个命名公式,而INDIRECT只处理引用而不是公式。

您需要使用EVALUATE,但是没有内置的EVALUATE工作表函数(您在定义名称中使用的EVALUATE是一个古老的XLMmacros函数)。
我build议你改用我的EVAL VBA UDF

 Public Function EVAL(theInput As Variant) As Variant ' ' if UDF evaluate the input string as though it was on this sheet ' else evaluate for activesheet ' Dim vEval As Variant Application.Volatile On Error GoTo funcfail If not IsEmpty(theInput) then If TypeOf Application.Caller.Parent Is Worksheet Then vEval = Application.Caller.Parent.Evaluate(Cstr(theInput)) Else vEval = Application.Evaluate(cstr(theInput)) End If If IsError(vEval) Then EVAL = CVErr(xlErrValue) Else EVAL = vEval End If End If Exit Function funcfail: EVAL = CVErr(xlErrNA) End Function 

然后使用相关引用(如typeA = SUM(Sheet3!RC1,Sheet3RC2))来定义名称。

评估中有一些“怪癖”,你应该知道:参见
http://www.decisionmodels.com/calcsecretsh.htm

如果我明白你想要正确地做什么,为什么不直接从单元中获得resukt ..
我不认为你需要间接的,因为你只需要公式的文本
(虽然我不确定ROW()应该做什么)
SUM( “AF” 和行(), “AG” &行())

如果您只想使用Defined Name在当前行上添加列AF和AG,那么只需使用相对引用(在R1C1模式下更容易定义,然后切换回A1)。定义名称AndySum的引用公式为=SUM(RC32,RC33)
然后,无论您在公式中使用AndySum,都会在该行中添加AF和AG列的内容。

为了扩展查尔斯的答案:这个函数将负责查找和评估行号。 我假设公式(在你的例子中)只是为了总结与返回最终结果的单元格相同的行中的某些值。

我的查找表如下所示:

 TypeA SUM(B<r> ,D<r>) TypeB SUM(C<r>,D<r>) 

UDF:

 Public Function GetAndRunCalc(CalcType As String) Application.Volatile Dim ac As Object, rw, f On Error GoTo haveError If TypeOf Application.Caller.Parent Is Worksheet Then Set ac = Application.Caller rw = ac.Parent.Range(ac.Address).Row 'adjust for your lookup table... f = Application.VLookup(CalcType, Sheet1.Range("B4:C5"), 2, False) If Not IsError(f) Then f = Replace(f, "<r>", rw) GetAndRunCalc = ac.Parent.Evaluate(f) Else GetAndRunCalc = "Type??" End If Else GetAndRunCalc = "Must be called from worksheet cell" End If Exit Function haveError: GetAndRunCalc = CVErr(xlErrValue) End Function