【问题标题】:To infinity and beyond in VBAVBA 中的无限和超越
【发布时间】:2012-02-09 01:45:46
【问题描述】:

这篇文章是关于将 .NET NaN 和无限值传递回 Excel 2010 VBA。

我使用不受我控制的 C# 方法(显然)可以返回 .NET NaN 或 Neg,Pos Infinity。 VBA 中的结果很奇怪(即比平时更奇怪),我想出的安全处理这种情况的唯一方法是不雅的三字符串比较 "-1.#IND" 或 "-1.#INF"或“1.#INF”。

有没有更好的办法?

如果你好奇的话,我已经在这里记录了奇怪的部分。 (示例是针对 NaN 的,但对于 pos 或 neg infinity 也是如此。)

double  dVal  =  CSharpMethodReturningDouble()  ' via .NET assembly / COM interop
variant vVal  =  CSharpMethodReturningDouble()  ' via .NET assembly / COM interop

如果 C# 方法返回一个 double.NaN,那么我们有(在 immed 窗口中):

?dVal               
 -1.#IND            
?vVal                
 -1.#IND             

持有 NaN 的(盒装)变体对数字测试呈阳性,type = double

?IsNumeric(vVal) 
 True
?TypeName(vVal)
 Double

对(盒装)变体 NaN 的比较有效,但结果与您期望的相反。 比较(未装箱的)双打导致溢出异常

?vVal=1          '<== NaN comparisons should always return false
 True               
?vVal=0          '<== that's not what you get with -1.#IND
 True               
?dVal=0          '<== strangely, the same comparison on the unboxed double fails
 (OverFlow Exc)

对(盒装)变体的操作会导致溢出异常 对(未装箱)双打的操作(并按预期返回 -1.#IND)

?vVal * 1.1      '<== even stranger, for arith ops its the boxed value that fails
 (Overflow Exc)
?dVal * 1.1      '<== but the operation on the unboxed double goes through
-1.#IND 

IsError,IsNumeric 无济于事:

?IsError(vVal)
 False            
?IsError(dVal)
 False            
?IsNumeric(vVal)
 True       
?IsNumeric(dVal)
 True            

总是可以用字符串比较来测试:

?vVal = "-1.#IND"
True
?dVal = "-1.#IND"
True

【问题讨论】:

标签: .net vba excel


【解决方案1】:

由于 Double.NAN 字段表示的值不是数字,因此您很可能使用字符串比较走在正确的轨道上。

如果您选择另一种方式(即从 VB 中传递值),通常会怀疑 ByRef 和 ByVal。

VB 的 IsNumeric() 函数并不总是直观的。例如,如果字母数字代码偶然成为科学计数法中的数字,它将返回 True。

【讨论】:

    【解决方案2】:

    我同意 David 的观点,您当前的解决方法是可以接受的。不过一定要测试外语安装!

    您给出的示例可能是解决方案的一部分:同时等于 1 和 0 的值不是正常数字。该测试可以将 NaN 与正常数字区分开来。可能你可以找到类似的规则来找到 +/-infinity。

    【讨论】:

      【解决方案3】:

      确保您考虑到当前的语言环境。 NaN 可以是 "-1.#IND""-1,#IND",具体取决于小数分隔符设置。

      避免这种情况的一种方法可能是 InStr 比较:

      InStr(CStr(dVal), "#IND") <> 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-24
        • 2021-10-30
        • 2014-12-05
        • 2014-09-21
        • 1970-01-01
        • 2011-05-23
        • 2018-10-09
        • 1970-01-01
        相关资源
        最近更新 更多