3

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

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

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

如果我将数组大小限制为最大 65536,则代码运行良好。据我所知,自从 Excel 2007数组大小传递到自 Excel 2000 以来受可用内存限制的宏时,计算受到可用内存的限制。

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

4

2 回答 2

1

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

百分位数和置信水平 (Excel-VBA)

鉴于 Jean 揭露了直接插入方法效率低下。我用以下内容编辑了这个答案:

我读到 QuickSelect 似乎擅长处理大量记录,并且这样做非常有效。

参考:

  1. Wikipedia.org:快速选择
  2. 可以在@Fast Algorithm 中找到 AC# 实现,用于计算百分位数以删除应轻松转换为 VB 的异常值。
于 2011-08-14T19:54:55.267 回答
1

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

Dim arr1(1 to 100000, 1 to 1)

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

于 2018-03-15T13:05:53.083 回答