arrays - 加权中位数 - 数组的 UDF?

标签 arrays excel excel-formula median vba

当谈到使用 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

结果:

enter image description here

关于arrays - 加权中位数 - 数组的 UDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43600399/

相关文章:

excel - 比较Excel中的时间

java - java中的列表字符串列表

ruby - 从 ruby 数组中获取随机元素(您的解决方案)?

python - Numpy:合并多个切片的有效方法

r - 将 R 中具有不同范围间隔的 2 个数据集组合起来,创建一个新数据集,其范围可解释原始数据集中的重叠

excel - 逐行自动计算不同数值的平均值

excel - 使用列号计算列中数字的平均值

excel - 使用 excel 或在 excel 中求平均值

java - 从 Linked hashMap 派生时数组的顺序是什么?

vba - 如何在Excel VBA中将项目添加到表单中的组合框?