ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 用VBA于多列多合并区域的单元格范围求平均值(含零值及不含零值两种)方法示例

用VBA于多列多合并区域的单元格范围求平均值(含零值及不含零值两种)方法示例

作者:绿色风 分类: 时间:2022-08-18 浏览:128
楼主
kevinchengcw
我们在前面曾经讨论过合并单元格的取值方法,但其仅对一行或一列比较适用,今天这个示例里我们会在多个合并单元格的列中取出数值并计算其平均值(包含含有零值及不含零值两种结果),在这里你会看到代码与工作表良好结合完成工作的良好效果,代码如下:
  1. Sub test()
  2. Dim M, N, I, T1, T2 As Double
  3. Dim Dic
  4. Application.ScreenUpdating = False  '关闭屏幕刷新
  5. Set Dic = CreateObject("scripting.dictionary")  '建立用于储存结果的字典
  6. M = 2  '设定统计数据的起始行号
  7. With Worksheets("省")  '在需统计的数据表中工作
  8.     .Activate  '先激活该表
  9.     .Cells(M, 1).Select  '选择第一个数据的单元格(之所以用选择是为了方便从合并单元格中取出对应数据)
  10.     Do While Selection.Row <= .Cells(Rows.Count, 1).End(3).Row  '当单元格范围不超出有数据范围时继续循环
  11.         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统计数字个数,注意单元格范围的取得方式)
  12.         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统计数字个数,注意单元格范围的取得方式)
  13.         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的数字个数,注意单元格范围的取得方式)
  14.         Dic.Add ActiveCell.Value, I & vbTab & T1 & vbTab & T2  '将结果存入字典中
  15.         ActiveCell.Offset(1, 0).Select  '下移一个单元格,注意:这样的下移类似按向下键的效果,这样不会取到合并单元格中的单元格
  16.     Loop
  17. End With
  18. With Worksheets("问题")  '到统计的结果表来输出结果
  19.     .Activate   '先激活工作表
  20.     For M = 2 To .Cells(.Rows.Count, 1).End(3).Row  '循环序号区域
  21.         If Dic.exists(.Cells(M, 1).Value) Then   '如果字典中的结果有该序号的,则将储存的结果依特定字符拆分后放入对应单元格中
  22.             .Cells(M, 2) = Split(Dic(.Cells(M, 1).Value), vbTab)(0)
  23.             .Cells(M, 3) = Split(Dic(.Cells(M, 1).Value), vbTab)(1)
  24.             .Cells(M, 4) = Split(Dic(.Cells(M, 1).Value), vbTab)(2)
  25.         End If
  26.     Next M
  27. End With
  28. Dic.RemoveAll  '清空字典
  29. Set Dic = Nothing  '清空项目(注意:这是个好习惯)
  30. Application.ScreenUpdating = True  '打开屏幕刷新
  31. MsgBox "处理完成", vbOKOnly, ""   '给个提示
  32. End Sub


通过上述例子你会发现,在处理数据过程中,充分利用也存在的工作表公式,我们可以省去处理复杂区域的步骤,直接获取结果,所以,写程序中最关键的就是找到数据的规律并想出应对的方法.

附示例文件.
间隔区域分别求平均值.rar
2楼
wnianzhong
学习一下VBA!谢谢!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap