如何修复 .Evaluate 舍入结果

How to fix .Evaluate rounding result

我正在使用 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)")

是returns1(好像是.Evaluate轮的结果)。 例外的输出是 : 1,00042406864688

xdouble 类型,所以我不明白为什么结果是四舍五入的……有什么想法吗?

问题:

我在构建公式以对其进行评估时是否犯了错误?


下面是我做过的几个测试

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

Excel 工作表公式:

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

执行Window:

注意: 当我将公式放入单元格时,我这样做了

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

输出为:1,00042406864688

我会考虑invoking the function directly,而不是让计算引擎来评估它。

但它应该无论如何都可以工作。我什至怀疑它在工作 - 但 implicit ActiveSheet references 正在向它扔一把扳手。

Cells 成员调用不合格:

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

这暗指 上的单元格,无论活动工作sheet 是什么。对比:

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

这意味着传递给函数的输入数组取决于 sheet 在该指令运行时处于活动状态,因此如果意图是关闭“Fonction DCF” sheet,我建议明确说明。

Select Project Explorer (Ctrl+R) 中的“Fonction DCF”sheet 模块,然后按 F4 调出 Properties工具窗口,看看那个sheet的(Name)属性。如果它显示 Sheet1(或类似的 - 这是默认设置),将其更改为 FonctionDCFSheet,然后更改您的代码以使用其编程名称引用 sheet(我假设 sheet 在编译时存在于 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

(续行以减少水平滚动)

请注意,我还清理/删除了一些无关的步骤:您不需要获取 Range 个单元格然后获取 ParentRange要获取 WorksheetName,您已经按名称取消引用了,并且您不需要获取 RangeAddress 一系列单元格'已经通过地址取消引用。

也因为我们现在正在调用 Worksheet.Evaluate.Evaluate 调用由 With 块变量限定),字符串公式在 sheet 的上下文,因此字符串中的 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 即传递 ActiveSheetIM:CUBDWorksheet.Evaluate 传递相同的列,但始终在正确的 sheet 上,无论哪个 sheet 处于活动状态。