1

我正在使用Evaluate以执行此公式:

x = Application.Evaluate("AdInterp(" & cells(2,"C").value & "," & "'" & ThisWorkbook.Worksheets("Fonction DCF ").Range("U8:U31").Parent.Name & "'!" & ThisWorkbook.Worksheets("Fonction DCF ").Range("U8:U31").Address(external:=False) & "," & "'" & ThisWorkbook.Worksheets("Fonction DCF ").Range("V8:V31").Parent.Name & "'!" & ThisWorkbook.Worksheets("Fonction DCF ").Range("V8:V31").Address(external:=False) & ",IM:CUBD)")

它返回 1(似乎是.Evaluate舍入结果)。例外的输出是:1,00042406864688

x是一种double类型,所以我不明白为什么结果是四舍五入的……知道吗?

问题 :

为了评估它,我在构建公式时犯了错误吗?


下面是我做过的几个测试

当我将公式放入单元格时,输出为:1,00042406864688

Excel工作表公式:

=AdInterp(C2;'Fonction DCF '!U8:U31;'Fonction DCF '!V8:V31;IM:CUBD)

执行窗口:

在此处输入图像描述

注意:当我将公式放入单元格中时

Evaluate(Cells(2,"G").Formula)

输出为: 1,00042406864688

在此处输入图像描述

4

1 回答 1

2

我会考虑直接调用函数,而不是让计算引擎来评估它。

但无论如何它都应该工作。我怀疑它甚至可以正常工作 - 但是隐式的 ActiveSheet 引用正在向它扔扳手。

Cells成员调用不合格:

& cells(2,"C").value &

这隐含地指的是活动工作表上的单元格。对比:

ThisWorkbook.Worksheets("Fonction DCF ") & "!" ...

这意味着传递给函数的输入数组取决于该指令运行时哪个工作表处于活动状态,因此如果打算处理“Fonction DCF”工作表,我建议明确说明它。

在Project Explorer (Ctrl+R)中选择“Fonction DCF”工作表模块,然后按 F4 调出“属性”工具窗口,并查看(Name)该工作表的属性。如果它说Sheet1(或类似的 - 这是默认值),请将其更改为FonctionDCFSheet,然后更改您的代码以使用其编程名称引用该工作表(我假设工作表ThisWorkbook在编译时存在) - 也正如@FunThomas 恰当地建议的那样,考虑将动态评估的字符串拉入它自己的局部变量中,以使其更易于调试:

With FonctionDCFSheet
    Dim dynamicEval As String
    dynamicEval = "AdInterp(" & .Cells(2,"C").value & "," & _
                  "'" & .Name & "'!U8:U31," & _
                  "'" & .Name & "'!V8:V31, IM:CUBD)"
    Debug.Print dynamicEval
    x = .Evaluate(dynamicEval)
End With

(行延续以减少水平滚动)

请注意,我还清理/删除了一些无关的步骤:您不需要获取 a Rangeof 单元格然后获取 the ParentofRange来获取您已经按名称取消引用Name的 a Worksheet,并且您不需要获取您已经通过地址取消引用的一系列单元格的 a AddressRange

同样因为我们现在正在调用Worksheet.Evaluate.Evaluate调用由With块变量限定),字符串公式在该 sheet 的上下文中进行评估,因此字符串中的工作表命名变得多余,并且可以进一步简化字符串:


    CreateAdxUtilityModule.AdInterp(Periode, ThisWorkbook.Worksheets("Fonction DCF ").Range("U8:U31").Value, ThisWorkbook.Worksheets("Fonction DCF ").Range("V8:V31").Value, "IM:CUBR")

'Periode  is a date format dim

刚才我注意到最后一部分IM:CUBD也被评估为不合格;随之Application.Evaluate而来IM:CUBD的是ActiveSheet; 即通过Worksheet.Evaluate相同的列,但始终在正确的工作表上,无论哪个工作表处于活动状态。

于 2021-02-12T15:33:23.723 回答