WorksheetFunction数组大小限制

时间:2011-08-11 11:12:24

标签: excel vba excel-vba excel-2010

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

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

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

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

我在高性能服务器上使用Excel 2010。谁能证实这个问题存在吗?假设如此,我认为我的选择是构建一个vba函数来“手动”计算百分位数或输出到工作表,在那里计算并读回来。有没有其他选择,什么是最快的?

2 个答案:

答案 0 :(得分:1)

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

Percentile and Confidence Level (Excel-VBA)

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

我读到QuickSelect似乎在大型记录方面表现优异,并且效率很高。

参考文献:

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

答案 1 :(得分:1)

如果arr1是1维且大于65536个元素,则会发生错误(请参阅Array size limits passing array arguments in VBA中的Charles'回答)。将arr1尺寸标注为具有单列的二维数组:

Dim arr1(1 to 100000, 1 to 1)

这适用于Excel 2013.基于Charles'回答,它似乎适用于Excel 2010。