【问题标题】:How to fix .Evaluate rounding result如何修复。评估舍入结果
【发布时间】:2021-05-16 07:43:12
【问题描述】:

我使用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

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

问题:

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


以下几个我做过的测试

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

Excel工作表公式:

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

执行窗口:

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

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

输出为:1,00042406864688

【问题讨论】:

  • cells(2,"C") 指向您想要的工作表(Activesheet)?
  • @FunThomas 确实如此。我的问题是结果被四舍五入到 1 但我不希望它被四舍五入
  • 将难以重现,但可能有几个问题:使用Worksheet.Evaluate 而不是Application.Evaluate。那么ThisWorkbook.Worksheets("Fonction DCF ").Range("U8:U31").Parent.Name可以简化为"Fonction DCF "
  • 不能直接调用AdInterp吗?
  • 不,我的意思是x = AdInterp(args)。您正在让 Excel 计算引擎评估一个函数,但您已经在代码中,计算引擎不需要参与 - 只需调用函数 如果它在范围内(请参阅@BigBen's上面的评论,看起来确实有可能只需要从DLL中导入函数)。

标签: excel vba evaluate thomson-reuters-eikon


【解决方案1】:

我会考虑invoking the function directly,而不是让计算引擎对其进行评估。

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

Cells 成员调用不合格:

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

这隐含地引用了活动工作表上的单元格。对比:

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

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

Project Explorer中选择“Fonction DCF”工作表模块(Ctrl+R),然后按F4调出Properties工具窗口,查看@ 987654326@ 该工作表的属性。如果它显示Sheet1(或类似的 - 这是默认值),请将其更改为FonctionDCFSheet,然后更改您的代码以使用其程序名称引用该工作表(我假设该工作表存在于@ 987654329@ 编译时- time) - 也正如@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 来获取 Name 的单元格Worksheet 您已经按名称取消引用,对于您已经按地址取消引用的一系列单元格,您不需要获取 RangeAddress

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


    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:CUBDActiveSheetWorksheet.Evaluate 传递相同的列,但始终在正确的工作表上,无论哪个工作表处于活动状态。

【讨论】:

  • 我仍然主张将公式写入中间变量(并使用Debug.Print 检查),然后再将其扔给Evaluate-Function。
  • 调用函数解决了我的问题。但是使用计算引擎我仍然有同样的问题,谢谢
  • @Dorian 最后一个 sn-p 是否按预期工作?我完全期望直接调用能够工作,但我很好奇隐式 ActiveSheet 引用是否与意外输出有关:)
  • @MathieuGuindon nop 我不得不修改它并添加对我的 wokbook 的引用...并且我使用的语法略有不同,我建议进行编辑:)
  • @Dorian aye, FunctionDCFSheet 将是未定义的,如果您不将工作表的 (Name) 设为 - 无需按名称从 Worksheets 中提取,该工作表在编译时存在-ThisWorkbook中的时间=)
猜你喜欢
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 2013-01-27
相关资源
最近更新 更多