我没有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语句实现吗?
帮助将不胜感激
谢谢!
答案 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个字符的限制而失败,这就是为什么我必须将它分解为两部分......