ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何列出数的密集分布并找出最接近预测值的覆盖率

如何列出数的密集分布并找出最接近预测值的覆盖率

作者:绿色风 分类: 时间:2022-08-17 浏览:91
楼主
芐雨
Q:如何列出数的密集分布并找出最接近预测值的覆盖率

 
A:
解决思路:
1.用循环列出所有解(即所有数组合的密集分布与覆盖率)。
2.找出(实际覆盖率-预测值)的绝对值的最小值。
3.若等于最小值,列出上限,下限和覆盖率。

代码如下:
  1. Sub 根据预测值找出最接近的覆盖率_芐雨()
  2. Dim i%, arr, ar, arP, arS, minP, arC
  3. Dim d As Object

  4. On Error Resume Next '防止点取消时出错
  5. Set d = CreateObject("Scripting.Dictionary")

  6. Set Rng = Application.InputBox("根据D2单元格的值求出最接近值" & Chr(10) & Chr(10) & "请选择数值区域", Title:="芐雨", Type:=8)
  7. arr = Rng

  8. Range("E1").Resize(65536, 255).Clear '消除单元格
  9. P = Range("D2") '设P为预测覆盖率
  10. For i = 1 To UBound(arr) '把数组放入字典中去重复,计个数
  11. For j = 1 To Rng.Count / UBound(arr)
  12. If arr(i, j) <> "" And IsNumeric(arr(i, j)) Then '跳过空单元格与非数值
  13. d(arr(i, j)) = d(arr(i, j)) + 1
  14. N = N + 1 '记录个数,作为分母,设为N
  15. End If
  16. Next
  17. Next
  18. k = d.keys: t = d.items 'k是各个不重复值,t是各个不重复值的个数
  19. ReDim ar(1 To 2 + d.Count, 1 To d.Count) '存放值,个数,与所有覆盖率
  20. ReDim arP(1 To d.Count, 1 To d.Count) '存放所有覆盖率与预测覆盖率的差的绝对值
  21. ReDim arS(1 To 3, 1 To d.Count * (d.Count + 1) / 2) 'd.Count * (d.Count + 1) / 2) 为所有组合覆盖率的个数
  22. ReDim arC(1, 1 To d.Count + 2)

  23. For i = 1 To d.Count
  24. ar(1, i) = Application.Small(k, i) '从小到大排序
  25. ar(2, i) = d(ar(1, i)) '对应该不重复值的个数
  26. ar(3, i) = d(ar(1, i)) / N '每个数的覆盖率
  27. arP(1, i) = Abs(ar(3, i) - P) '每个数的覆盖率与预测覆盖率的差的绝对值,设为arP
  28. Next i
  29. If d.Count = 1 Then GoTo AB '如果去重后是1行直接返回结果

  30. For j = 4 To d.Count + 2
  31. For i = 1 To d.Count
  32. ar(j, i) = ar(j - 1, i) + ar(3, i + j - 3) '求出每个组合的覆盖率
  33. arP(j - 2, i) = Abs(ar(j, i) - P) '每个组合的覆盖率与预测覆盖率的差的绝对值
  34. If i + j - 3 = d.Count Then Exit For '跳出循环
  35. Next
  36. Next
  37. AB:
  38. minP = Application.Min(arP, 1) '所有组合覆盖率与预测覆盖率的差的绝对值的最小值

  39. For i = 1 To d.Count
  40. For j = 1 To d.Count
  41. If i + j - 2 = d.Count Then Exit For '跳出循环
  42. If arP(i, j) = minP Then '判断是否等于最小值
  43. x = x + 1
  44. arS(1, x) = ar(1, j) '上限
  45. arS(2, x) = ar(1, j + i - 1) '根据j+i-1的大小判断下限
  46. arS(3, x) = ar(i + 2, j) '实际覆盖率
  47. End If
  48. Next
  49. Next

  50. For i = 1 To d.Count '设置标题
  51. Cells(1, i + 10) = i & "个数的覆盖率"
  52. Next

  53. Cells(1, 5) = "上限"
  54. Cells(1, 6) = "下限"
  55. Cells(1, 7) = "实际覆盖率"
  56. Cells(1, 9) = "数值"
  57. Cells(1, 10) = "个数"

  58. Range("I2").Resize(d.Count, 2 + d.Count) = Application.Transpose(ar) '列出所有组合的覆盖率
  59. Range("K2").Resize(d.Count, d.Count).NumberFormatLocal = "0.00%" '设置格式
  60. Range("E2").Resize(x, 3) = Application.Transpose(arS) '输出结果
  61. Range("G2").Resize(x).NumberFormatLocal = "0.00%" '设置格式
  62. End Sub





根据预测值找出最接近的覆盖率_芐雨.rar
2楼
海洋之星
谢谢分享,哈哈
3楼
湘潭水
严重顶起!

4楼
wise


学习了
5楼
hustclm
芐雨V5
6楼
水星钓鱼
感谢分享
7楼
jm9999
谢谢分享,哈哈
8楼
老糊涂
学习

免责声明

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

评论列表
sitemap