当谈到使用 VBA 以及 Excel/代码/等许多其他东西时,我是一个公认的新手。我在尝试寻找一种在计算中位数时考虑出现权重的方法(一列用于值出现,一次用于值),并且我发现了一个运行良好的旧 UDF。
现在我可能有点贪心,但我正在尝试处理相当大量的信息,最快的方法是仅当值由第三列中的标签标识时才执行 WeightedMedian。
Occurr. Cost Store Name
1 9.99 Charlie
4 15 Charlie
5 8 Charlie
6 10 Romeo
9 12 Delta
2 15 Romeo
3 8 Romeo
4 9.99 Delta
6 15 Delta
1 8 Delta
我试过这个 {=加权中位数(IF($C$2:$C$12=$D2,$B$2:$B$12),IF($C$2:$C$12=$D2,$A$2:$A$12) )} 希望返回两个必要的数组来服务WeightedMedian的ValueRange和WeightRange。但是我刚刚收到#Value 错误。关于如何修复它有什么想法吗?下面列出了原始 UDF。
*UDF*
Function WeightedMedian(ValueRange As Range, WeightRange As Range)
Dim MedianArray()
On Error GoTo WrongRanges
ArrayLength = Application.Sum(WeightRange)
ReDim MedianArray(1 To ArrayLength)
Counter = 0
ArrayCounter = 0
For Each ValueRangeCell In ValueRange
LoopCounter = LoopCounter + 1
FirstArrayPos = ArrayCounter + 1
ArrayCounter = ArrayCounter + Application.Index(WeightRange, LoopCounter)
For n = FirstArrayPos To ArrayCounter
MedianArray(n) = ValueRangeCell.Value
Next
Next
WeightedMedian = Application.Median(MedianArray)
Exit Function
WrongRanges:
WeightedMedian = CVErr(2042)
End Function
最佳答案
我刚刚将您的函数更改为以下数组公式:
{=加权中位数(IF($C$2:$C$12=$D2,$B$2:$B$12),IF($C$2:$C$12=$D2,$A$2:$ 12 澳元))}
正如评论中提到的 {IF($C$2:$C$12=$D2,$B$2:$B$12)}
和数组中的其他 IF
context 将不会产生范围,而是产生数组。因此,Function
必须按原样处理它们,而不是按范围处理它们。
请注意,{IF($C$2:$C$12=$D2,$A$2:$A$12)}
结果的 Weights
数组为二维数组。作为 {IF($C$2:$C$12=$D2,$B$2:$B$12)}
结果的 Values
也是如此。但由于 For Each
我们不需要关注这一点。
UDF:
Function WeightedMedian(Values As Variant, Weights As Variant) As Variant
Dim MedianArray()
On Error GoTo WrongRanges
ArrayLength = Application.Sum(Weights)
ReDim MedianArray(1 To ArrayLength)
Counter = 0
ArrayCounter = 0
For Each sValue In Values
LoopCounter = LoopCounter + 1
FirstArrayPos = ArrayCounter + 1
ArrayCounter = ArrayCounter + Weights(LoopCounter, 1)
For n = FirstArrayPos To ArrayCounter
MedianArray(n) = sValue
Next
Next
WeightedMedian = Application.Median(MedianArray)
Exit Function
WrongRanges:
WeightedMedian = CVErr(2042)
End Function
结果:
关于arrays - 加权中位数 - 数组的 UDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43600399/