【问题标题】:WorksheetFunction array size limitWorksheetFunction 数组大小限制
【发布时间】:2011-10-24 21:17:00
【问题描述】:

我正在尝试使用 percentile 函数计算 VBA 中数组 (arr1) 中包含 100000 个值的数据集的 99.5% 百分位数,如下所示:

Pctile = Application.WorksheetFunction.Percentile(arr1, 0.995)
Pctile = Application.WorksheetFunction.Percentile_Inc(arr1, 0.995)

两者都不起作用,而且我不断收到类型不匹配 (13)。

如果我将数组大小限制为最大 65536,则代码运行良好。据我所知,calculation limited by available memory 自 Excel 2007 以来 array sizes when passing to macro limited by available memory 自 Excel 2000 以来。

我在高性能服务器上使用 Excel 2010。任何人都可以确认这个问题存在吗?假设是这样,我认为我的选择是构建一个 vba 函数来“手动”计算百分位数或输出到工作表,在那里计算并读回。是否有任何替代方案,最快的方法是什么?

【问题讨论】:

  • 我可以确认“问题”。即使在 Excel 2007/2010 中,从 UDF 返回数组时也存在数组大小限制。我也没有任何其他链接给你,所以这只是一个评论。最后,我在您发布的链接中看不到任何暗示数组大小限制对于来自 UDF 的返回值 受“可用内存”限制的内容。
  • 我在处理大数据时也有类型转换错误

标签: vba excel excel-2010


【解决方案1】:

如果 arr1 是一维的并且具有超过 65536 个元素,则会发生错误(请参阅 Charles 在 Array size limits passing array arguments in VBA 中的回答)。维度 arr1 作为具有单列的二维数组:

Dim arr1(1 to 100000, 1 to 1)

这适用于 Excel 2013。根据 Charles 的回答,它似乎适用于 Excel 2010。

【讨论】:

    【解决方案2】:

    这是一个模仿 Excel Percentile 函数的经典 VBA 示例。

    Percentile and Confidence Level (Excel-VBA)

    鉴于 Jean 曝光 Straight Insertion 方法效率低下。我用以下内容编辑了这个答案:

    我读到 QuickSelect 似乎在处理大量记录时表现出色,而且这样做非常有效。

    参考资料:

    1. Wikipedia.org: Quick Select
    2. 可以在@Fast Algorithm for computing percentiles to remove outliers 找到一个 C# 实现,它应该很容易转换为 VB。

    【讨论】:

    • 小心!它使用straight insertion sort!直接插入是 N² 例程,仅适用于小 N,例如N
    • 感谢 JFC。我在这里的重点是尽可能减少运行时间。你能推荐一个替代方案吗?
    猜你喜欢
    • 2023-04-02
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多