2011-08-11 60 views
3

我试图使用百分功能如下,以计算在一个阵列(ARR1)内VBA为100000个的值的数据集合中的99.5%百分位数:WorksheetFunction阵列大小限制

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函数来计算“手动”百分点或输出到工作表,在那里计算并读回。有没有其他的选择,最快的是什么?

+3

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

+0

我也有类型转换错误,当它去大数据 –

回答

0

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

Percentile and Confidence Level (Excel-VBA)

在Jean的曝光Straight Insertion方法是低效的光。我用下面的方式编辑了这个答案:

我读到QuickSelect似乎擅长大型记录,并且这样做效率很高。

参考文献:

  1. Wikipedia.org: Quick Select
  2. A C#实现可以发现@Fast Algorithm for computing percentiles to remove outliers应容易地转化为VB。
+2

小心!它使用[直接插入排序](http://en.wikipedia.org/wiki/Insertion_sort)!直接插入是N²例程,并且只能用于小N例如N <20,而不是N = 100000,这将是非常低效的。 –

+0

谢谢JFC。尽可能地减少运行时间,我在此着重关注。你能提出一个替代方案吗? – kavmeister