如何解决如何修复 .Evaluate 四舍五入结果
我使用 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
解决方法
我会考虑 invoking the function directly,而不是让计算引擎对其进行评估。
但无论如何它应该工作。我怀疑它甚至有效 - 但 implicit ActiveSheet references 正在向它扔扳手。
此 Cells
成员调用不合格:
& cells(2,"C").value &
这隐含地引用了无论活动工作表是什么上的单元格。对比:
ThisWorkbook.Worksheets("Fonction DCF ") & "!" ...
这意味着传递给函数的输入数组取决于该指令运行时哪个工作表处于活动状态,因此如果目的是处理“Fonction DCF”工作表,我建议对其进行明确说明。
>在项目资源管理器中选择“Fonction DCF”表单模块(Ctrl+R),然后按F4调出属性工具窗口,查看{该工作表的 {1}} 属性。如果它显示 (Name)
(或类似 - 这是默认值),请将其更改为 Sheet1
,然后更改您的代码以使用其编程名称引用该工作表(我假设该工作表存在于 {{ 1}} 在编译时) - 也正如@FunThomas 恰当地建议的那样,考虑将动态计算的字符串拉入其自己的局部变量中,以使其更易于调试:
FonctionDCFSheet
(行延续以减少水平滚动)
请注意,我还清理/删除了一些无关的步骤:您不需要获取 ThisWorkbook
的单元格,然后获取该 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
来获得Parent
的 Range
您已经按名称取消引用,并且您不需要为您正在使用的一系列单元格获取 Name
的 Worksheet
已经通过地址取消引用。
另外,因为我们现在正在调用 Address
(Range
调用由 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:CUBD
传递相同的列,但始终在正确的工作表上,无论哪个工作表处于活动状态。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。