欢迎转发和点一下“在看”,文末留言互动!
置顶公众号或设为星标及时接收更新不迷路
朋友们好,这里是EXCEL应用之家,坚持分享EXCEL操作技巧。
今天来和大家分享一道合并单元格的题目。原题目是下面这样的:
这道题目中,由于部门名称是在合并单元格中,因此就给求平均带来了巨大的苦难。
传统方法,利用LOOKUP函数将合并单元格填充,再按条件来平均。不过这种方法公式太冗长了。今天和大家分享一条公式,两段代码来解决这个问题。
01
MATCH函数法
选中单元格区域G2:G10,并输入下列公式即可。
=AVERAGE(OFFSET(D2,,,MATCH(1=0,B3:B9=0,-1)))
这条公式重复利用了MATCH函数的特点。在之前的推文中我们也曾多次介绍过这个技巧了,今天就不再赘述了。
02
字典方法
完整代码如下:
Sub 部门平均值() Dim i%, k%, s%, arr As Variant, brr As Variant, mydic As Object Set mydic = CreateObject("scripting.dictionary") arr = Range("A1").CurrentRegion ReDim brr(1 To UBound(arr) - 1, 1 To 1) For i = 2 To UBound(arr) If arr(i, 2) <> "" Then k = i mydic(arr(k, 1)) = mydic(arr(k, 1)) + arr(i, 4) s = Cells(i, 2).MergeArea.Count If i - k + 1 = s Then brr(k - 1, 1) = mydic(arr(k, 1)) / s End If Next [G2].Resize(k, 1) = brrEnd Sub
这一小段代码的逻辑思路也非常简单。
If arr(i, 2) <> "" Then k = imydic(arr(k, 1)) = mydic(arr(k, 1)) + arr(i, 4)s = Cells(i, 2).MergeArea.Count
对在同一个个合并单元格内的单元格,都使用同样的行号,用变量k来代替变量i。这样做的原因是,直到下一个非空单元格前,变量k的值都是不变的。
利用字典来汇总同一个单元格内的数值。
利用Range对象的MergeArea属性,可以得到当前河北单元格的行高,并赋值给变量s。
If i - k + 1 = s Then brr(k - 1, 1) = mydic(arr(k, 1)) / sEnd If
接下来就简单了。利用If语句,将总绩效除以总人数,就是当前部门的平均值了。

03
循环法
完整代码如下:
Sub 部门平均值1() Dim rng As Range For Each rng In [B2:B10] If rng <> "" Then rng.Offset(, 5) = WorksheetFunction.Average( _ rng.Offset(, 2).Resize(rng.MergeArea.Count)) End If NextEnd Sub
大音老师的手笔,实在是佩服佩服!
我就知道你“在看”