2014-07-10 35 views
0

我没有在VBA的经验,我需要这个百分功能转换为一个自定义的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”是为具有被搜索在另一片的范围值paramters通过细胞...

也试过这个

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)))" 

正如你所看到的,我没有使用的参数为这一个,只是想测试数组公式是...但我得到了相同的结果。执行在设置r.FormulaArray

停止我的理解是,这IF语句将返回小区或之后将由百分函数中使用的数据矩阵的范围...

但后来,我当调试代码,它被卡在ActiveCell.Formula ...为什么会这样?

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

帮助将不胜感激

谢谢!

+0

这是有效的,这是一个数组公式。 – ApplePie

+1

@ jprealini你至少需要知道如何开始使用VBA。一种简单的方法是重建公式并使用Application.Evaluate()。 – ApplePie

+0

@ Dave.Gugg,正如我所解释的那样,我需要创建一个自定义的PERCENTILE函数,将矩阵作为它的一系列数据,这些数据将成为“IF”语句和您在其中进行比较的结果... – jprealini

回答

1

这是我做过什么来解决这个...

我开始玩的评估方法,只运行了“IF”块,并发现它返回含有的阵列“假“对于不符合条件的记录,以及那些所需的值......所以我首先将所有范围作为参数传递,并用它们构建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) 

的复杂的事情在这里的是,在某些情况下百分功能将得到真正巨大的,所以评估方法是失败归因于255个字符的限制,这就是为什么我不得不把它分解为两个部分...