ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何利用vba代码剔除偏差值超过平均值10%的数据后重新排序?

如何利用vba代码剔除偏差值超过平均值10%的数据后重新排序?

作者:绿色风 分类: 时间:2022-08-17 浏览:116
楼主
kevinchengcw
Q: 如何利用vba代码剔除偏差值超过平均值10%的数据后重新排序?
A: 代码如下:
  1. Sub test()
  2. Dim Arr, Dic As Object, Dic2 As Object, N&, I&, T#, D#, Have As Boolean
  3. Arr = Range([a2], Cells(Rows.Count, 1).End(3)).Value  '读取源数据到数组中
  4. Set Dic = CreateObject("scripting.dictionary")  '创建字典1和字典2
  5. Set Dic2 = CreateObject("scripting.dictionary")
  6. For N = LBound(Arr) To UBound(Arr)  '将数据装入字典1的items中
  7.     Dic.Add CStr(N), Arr(N, 1)
  8. Next N
  9. Do
  10.     Have = False  '设定逻辑变量初始值为假
  11.     Arr = Dic.keys  '将字典1的keys转给数组用于后面的循环
  12.     T = WorksheetFunction.Sum(Dic.items) / Dic.Count  '提取平均值
  13.     For N = LBound(Arr) To UBound(Arr)  '循环将同样的key写入字典2中,item是与平均值的差值的绝对值
  14.         Dic2.Add Arr(N), Abs(Dic(Arr(N)) - T)
  15.     Next N
  16.     D = WorksheetFunction.Max(Dic2.items)  '取得差值中的最大值
  17.     If D > T * 0.1 Then  '如果最大值大于平均值的10%(即我们要求的偏差率上限)
  18.         For N = LBound(Arr) To UBound(Arr)  '找到该项,从字典1中删除,并将逻辑变量值设为真,退出循环(每次只删除一个)
  19.             If Dic2(Arr(N)) = D Then
  20.                 Dic.Remove Arr(N)
  21.                 Have = True
  22.                 Exit For
  23.             End If
  24.         Next N
  25.     End If
  26.     Dic2.RemoveAll  '清空字典2
  27. Loop While Have = True  '当逻辑值为真时循环
  28. Arr = Dic.keys  '将最后剩余的结果交给数组,用于循环
  29. T = WorksheetFunction.Sum(Dic.items) / Dic.Count  '取得当前的平均值
  30. For N = LBound(Arr) To UBound(Arr) - 1  '对数据依偏差值从大到小顺序排序
  31.     For I = N + 1 To UBound(Arr)
  32.         If Abs(Dic(Arr(I)) - T) > Abs(Dic(Arr(N)) - T) Then
  33.             D = Dic(Arr(N))
  34.             Dic(Arr(N)) = Dic(Arr(I))
  35.             Dic(Arr(I)) = D
  36.         End If
  37.     Next I
  38. Next N
  39. With Cells(2, 2)  '清空结果区域,并写入结果
  40.     .Resize(Rows.Count - 1).ClearContents
  41.     .Resize(Dic.Count) = Application.Transpose(Dic.items)
  42. End With
  43. Set Dic = Nothing  '清空字典项目
  44. Set Dic2 = Nothing
  45. End Sub
详见附件及素材源帖。
测试.rar
2楼
海洋之星
代码太长了吧,

免责声明

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

评论列表
sitemap