使用自定义vba函数计算Excel 2010中的百分位数

时间:2014-07-10 20:27:57

标签: excel vba excel-vba percentile

我没有vba的经验,我需要将这个百分位函数转换为自定义的vba函数

=PERCENTILE(
IF('RAW JO TIME'!$J$2:$J$51816=$A7, 
  IF($B$4="(All)",'RAW JO TIME'!$P$2:$P$51816, 
    IF('RAW JO TIME'!$M$2:$M$51816=$B$4,'RAW JO TIME'!$P$2:$P$51816)
  )
),
E$6)

其中$ A7,$ B $ 4和E $ 6应作为参数传递......

我一直在尝试不同的方法,但都没有效果。在论坛中搜索我发现可能的解决方案是:

ActiveCell.Formula = "=IF('RAW JO TIME'!$J$2:$J$51816=" & InputRange & ", IF($B$4=""(All)"",'RAW JO TIME'!$P$2:$P$51816, IF('RAW JO TIME'!$M$2:$M$51816=$B$4,'RAW JO TIME'!$P$2:$P$51816)))"

其中“InputRange”是作为参数传递的单元格,其值在另一个图纸的范围内被搜索...

也尝试了这个

Dim r As Range

Set r.FormulaArray = "=IF('RAW JO TIME'!$J$2:$J$51816=$A7, IF($B$4=""(All)"",'RAW JO TIME'!$P$2:$P$51816, IF('RAW JO TIME'!$M$2:$M$51816=$B$4,'RAW JO TIME'!$P$2:$P$51816)))"

正如你所看到的,我没有使用这个参数,只是试图按原样测试数组公式......但我得到了相同的结果。执行在Set r.FormulaArray

中停止

根据我的理解,这个IF语句将返回之后将由Percentile函数使用的单元格或数据矩阵...

但是,当我调试代码时,它会在ActiveCell.Formula中陷入困境......为什么会这样?

我想知道在这种情况下最好的解决方案是将函数中的每个“if”作为VB if语句实现吗?

帮助将不胜感激

谢谢!

1 个答案:

答案 0 :(得分:1)

这就是我为解决这个问题所做的......

我开始使用Evaluate方法,仅运行“IF”块,并发现它返回的数组包含与该条件不匹配的记录的“false”,以及那些所需的值。 ..所以我首先将所有范围作为参数传递,并使用它们构建IF(数组公式),然后将其传递给Evaluate方法,并使用结果数组构建将传递给它的最终值数组。 WorksheetFunction百分位数方法(重要说明:结果和范围需要声明为数组......否则它将无效,或者至少对我不起作用):

Dim result() As Variant
Dim ranges() As Variant
Dim i, j, k As Integer
Dim func As Variant

func =“= IF('”& officeRangeSheet&“'!& officeRangeAddress&”=“& officeValue.Address&”,IF('& statusRangeSheet&“'!” & statusRangeAddress&“=”& statusValue.Address&“,IF(”& yearFunctionString&“,'”& valuesRangeSheet&“'!& valuesRangeAddress&”)))“

result = Application.ActiveSheet.Evaluate(func)

    For i = 1 To UBound(result)
        If result(i, 1) <> False Then
            ReDim Preserve ranges(1 To k + 1)
            ranges(k + 1) = result(i, 1)
            k = k + 1
        End If
    Next i

CustomPercentileWFC = Application.WorksheetFunction.Percentile(ranges, Percentile)

复杂的是,在某些情况下,PERCENTILE函数会变得非常庞大,因此EVALUATE方法由于255个字符的限制而失败,这就是为什么我必须将它分解为两部分......