楼主 kevinchengcw |
我们在前面曾经讨论过合并单元格的取值方法,但其仅对一行或一列比较适用,今天这个示例里我们会在多个合并单元格的列中取出数值并计算其平均值(包含含有零值及不含零值两种结果),在这里你会看到代码与工作表良好结合完成工作的良好效果,代码如下:
- Sub test()
- Dim M, N, I, T1, T2 As Double
- Dim Dic
- Application.ScreenUpdating = False '关闭屏幕刷新
- Set Dic = CreateObject("scripting.dictionary") '建立用于储存结果的字典
- M = 2 '设定统计数据的起始行号
- With Worksheets("省") '在需统计的数据表中工作
- .Activate '先激活该表
- .Cells(M, 1).Select '选择第一个数据的单元格(之所以用选择是为了方便从合并单元格中取出对应数据)
- Do While Selection.Row <= .Cells(Rows.Count, 1).End(3).Row '当单元格范围不超出有数据范围时继续循环
- I = WorksheetFunction.Sum(.Range(.Cells(Selection.Row, 2), .Cells(Selection.Row + Selection.Rows.Count - 1, 2))) / WorksheetFunction.Count(.Range(.Cells(Selection.Row, 2), .Cells(Selection.Row + Selection.Rows.Count - 1, 2))) '取得对应数据区的平均值(用工作表公式sum加和,工作表公式count统计数字个数,注意单元格范围的取得方式)
- T1 = WorksheetFunction.Sum(.Range(.Cells(Selection.Row, 3), .Cells(Selection.Row + Selection.Rows.Count - 1, 3))) / WorksheetFunction.Count(.Range(.Cells(Selection.Row, 3), .Cells(Selection.Row + Selection.Rows.Count - 1, 3))) '取得对应数据区的平均值(用工作表公式sum加和,工作表公式count统计数字个数,注意单元格范围的取得方式)
- T2 = WorksheetFunction.Sum(.Range(.Cells(Selection.Row, 3), .Cells(Selection.Row + Selection.Rows.Count - 1, 3))) / WorksheetFunction.CountIf(.Range(.Cells(Selection.Row, 3), .Cells(Selection.Row + Selection.Rows.Count - 1, 3)), ">0") '取得对应数据区的平均值(用工作表公式sum加和,工作表公式countif统计大于0的数字个数,注意单元格范围的取得方式)
- Dic.Add ActiveCell.Value, I & vbTab & T1 & vbTab & T2 '将结果存入字典中
- ActiveCell.Offset(1, 0).Select '下移一个单元格,注意:这样的下移类似按向下键的效果,这样不会取到合并单元格中的单元格
- Loop
- End With
- With Worksheets("问题") '到统计的结果表来输出结果
- .Activate '先激活工作表
- For M = 2 To .Cells(.Rows.Count, 1).End(3).Row '循环序号区域
- If Dic.exists(.Cells(M, 1).Value) Then '如果字典中的结果有该序号的,则将储存的结果依特定字符拆分后放入对应单元格中
- .Cells(M, 2) = Split(Dic(.Cells(M, 1).Value), vbTab)(0)
- .Cells(M, 3) = Split(Dic(.Cells(M, 1).Value), vbTab)(1)
- .Cells(M, 4) = Split(Dic(.Cells(M, 1).Value), vbTab)(2)
- End If
- Next M
- End With
- Dic.RemoveAll '清空字典
- Set Dic = Nothing '清空项目(注意:这是个好习惯)
- Application.ScreenUpdating = True '打开屏幕刷新
- MsgBox "处理完成", vbOKOnly, "" '给个提示
- End Sub
通过上述例子你会发现,在处理数据过程中,充分利用也存在的工作表公式,我们可以省去处理复杂区域的步骤,直接获取结果,所以,写程序中最关键的就是找到数据的规律并想出应对的方法.
附示例文件. 间隔区域分别求平均值.rar |