0

当我使用 VBA 计算数组的中值时,Excel 2010 崩溃(Windows XP 说 Excel“没有响应”)出现问题,在中值函数计算为零的情况下。不幸的是,该问题仅在特定代码集的上下文中是可重现的(当我尝试编写简化版本以进行调试时,该问题不会发生)。尽管如此,我认为由于以下原因,有人会发现这个问题很有趣。

调用 application.worksheetfunction.median 时发生崩溃。VBA 无法通过该调用。这不是随后跳水为零的问题。

即使数组非常小(例如,8)也会发生崩溃。

我发现一个有效的解决方法是为每个数组项添加一个小常数,然后计算中位数,然后立即从每个数组值中减去该常数。这似乎产生了一个正确的答案。但令我担心的是 Excel 需要这种解决方法。

另一个涉及排序的工作表函数也会出现此问题:百分位数函数。

4

2 回答 2

0

我在类似的条件下遇到了同样的问题——除了在 Excel 2003 中,并且仅在计算 Double 或 Single 类型的数组时。也就是说,当计算的“答案”为零时,Excel 在计算数组的中位数时只是挂起(没有响应)。

计算数组的百分位数或修剪均值函数时相同。

如果我将数组写入一个范围,然后使用公式(“=MEDIAN(myRng)”等)进行计算,Excel 不会冻结。仅在计算 Double 或 Single 类型的数组时。(如果我使用 Long,Excel 似乎不介意;没有尝试过 Integer。)

我使用了上面建议的解决方法:

For i = 1 To UBound(myArr)
    ratioArr(i) = ratioArr(i) + 0#
Next i

{我的计算在这里,然后:}

For i = 1 To UBound(myArr)
    ratioArr(i) = ratioArr(i) - 0#
Next i

似乎工作,作为一个kludge。(但表明我需要从 Excel 迁移到任何严肃的统计工作。我猜是时候最终学习 C++ 了,或者哭了。)

于 2012-01-17T20:15:25.883 回答
0

谢谢你。我现在可以复制这个问题。对我来说,这看起来像是 Excel 2010 中的一个错误。缩小它看起来像一个与中位数中极小数字的浮点问题相关的错误:例如,您可以通过添加零来绕过该问题

tempCrossZ(i) = tempA(i) * tempB(i)

使

tempCrossZ(i) = tempA(i) * tempB(i) + 0#

在致电 MEDIAN 之前。
如果您允许,我将使用您的测试文件将此作为错误报告给 Excel 团队。

于 2011-12-26T18:37:36.383 回答