Option Explicit
Sub Click()
Dim A, B, i, j, r, s, blk
'确保B列已排序
A = Sheets(1).Range("a1").CurrentRegion
ReDim B(1 To 10 ^ 4, 1 To UBound(A, 2))
r = 6
For i = 2 To UBound(A)
'1)i大于2意思是除了第2行之外,如果上下地区不同
If i > 2 And A(i, 2) <> A(i - 1, 2) Then
'r-s 表示其它行(空行和平均行)的行数,最后由blk累加
blk = blk + r - s
Call test2(A, B, r, i, blk)
s = 0
End If
'2)无论上下地区是否一样,某地区的记录数s必须<r(否则,就丢弃)
s = s + 1
If s < r Then
For j = 1 To UBound(A, 2)
'当前行 = 累计记录行数i + 累计其它行行数blk
B(i + blk, j) = A(i, j)
Next j
End If
Next i
'末尾地区未进行比较,所以循环结束后单独处理平均行
blk = blk + r - s
Call test2(A, B, r, i, blk)
'3)输出到工作表
Sheets(2).Activate
Cells.Clear
Range("a1").Resize(i + blk, UBound(B, 2)) = B
[a1:e1].Value = Sheets(1).[a1:e1].Value
[a1].Select
End Sub
'处理平均行
Sub test2(A, B, r, x, blk)
Dim i, j, p, q, pj
'x是数据源中当前地区的下一地区,首记录的行号
'减1并加blk,才是结果表的平均行行号
pj = (x - 1) + blk
'求各产品的平均值
'从产品1(第3列)到产品3(最后1列)
For j = 3 To UBound(A, 2)
p = 0: q = 0
'从当前地区的第1行,到当前地区的第5行
For i = pj - r + 1 To pj - 1
'如果产品数不为空(即非空行)
If B(i, j) <> "" Then
'累计该产品的和
p = p + B(i, j)
'累计该产品的次数
q = q + 1
'更新序号
B(pj, 1) = B(i, 1)
End If
Next i
'得到该产品的平均数
B(pj, j) = Format(p / q, "0.000")
Next j
B(pj, 1) = " " & B(pj - r + 1, 1) & "-" & B(pj, 1)
B(pj, 2) = "平均"
End Sub
6.rar
(64.21 KB, 下载次数: 10)