Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 6400|回复: 12

[已解决]很多列中7个数字连续出现的最大次数

[复制链接]
发表于 2014-1-25 18:26 | 显示全部楼层 |阅读模式
5学分
本帖最后由 zss7758258 于 2014-1-26 22:53 编辑

请教.zip (7.32 KB, 下载次数: 22)

发表于 2014-1-25 18:45 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2014-1-25 18:52 | 显示全部楼层
tgydslr 发表于 2014-1-25 18:45
看起来好麻烦啊

{:021:}谢谢关注
回复

使用道具 举报

发表于 2014-1-25 21:03 | 显示全部楼层
不明白,你想求什么?
是已知那七个数字,出现次数为31,求区域
回复

使用道具 举报

 楼主| 发表于 2014-1-25 21:09 | 显示全部楼层
芐雨 发表于 2014-1-25 21:03
不明白,你想求什么?
是已知那七个数字,出现次数为31,求区域

C4:C34中1564082这七个数字出现了31次,是已知单元格区域中出现次数最多的,通过《求结果》表中的按钮,求出结果:1564082从C4到C34出现31次,

也可以这样理解:1564082这七个数字在C4:C34中数完后,单元格C35出现了第八个数字3,这时候停止数数,从C4:C35共有32格,减去第八个数字出现的那一个一格,要求的结果为31。
回复

使用道具 举报

 楼主| 发表于 2014-1-26 02:03 | 显示全部楼层
再来看看,求解
回复

使用道具 举报

发表于 2014-1-26 13:18 | 显示全部楼层
这么晚,早点睡吧!
举例里多余的数据先删除,如附件。你测试下吧
  1. Sub 连续七个数出现的最大值_芐雨()
  2. Dim brr(1 To 1000000, 2), crr(1 To 10000, 1 To 11)
  3. Dim Rng As Range, arr

  4. Application.ScreenUpdating = False

  5. Set d = CreateObject("scripting.dictionary")
  6. Set Rng = Sheets("举例").Range("A1").CurrentRegion '范围

  7. Sheets("求结果").Range("A2").Resize(Rows.Count - 1, 11).Clear '清除数据
  8. col = Rng(Rng.Count).Column '列数
  9. arr = Rng
  10. y = 1
  11. For j = 1 To col
  12. d.RemoveAll '每次转列:清空字典
  13. x = x + 1
  14. y = y + 7
  15. jmax = 0
  16. For i = 1 To UBound(arr)
  17. arr(i, j) = arr(i, j) & "" '转成字符
  18. If Not d.exists(arr(i, j)) Or i = UBound(arr) Then '字典不存在或最后一行时运行
  19. k = k + 1 '记录字典数
  20. d(arr(i, j)) = "" '添加字典
  21. brr(x, 1) = brr(x, 1) & arr(i, j) '记录出现的数
  22. If brr(x, 2) <> "" Then
  23. brr(x, 2) = brr(x, 2) & ":" & Cells(i, j).Address '记录地址
  24. Else
  25. brr(x, 2) = Cells(i, j).Address '记录地址
  26. End If
  27. If k = y Then
  28. If i < UBound(arr) Then '不是最后一行时
  29. d.Remove (Left(brr(x, 1), 1)) '删除第一个数的字典
  30. L = InStrRev(brr(x, 2), "$") '最后一个$的位置
  31. brr(x, 2) = Left(brr(x, 2), L) & Right(brr(x, 2), Len(brr(x, 2)) - L) - 1 '最后一个地址上移一格
  32. End If
  33. imax = Range(brr(x, 2)).Count '求出连续出现的数
  34. If imax > jmax Then '比较是否最大值
  35. jmax = imax
  36. crr(j, 2) = "'" & Left(brr(x, 1), 7) '转成文本数值,记录出现什么数
  37. crr(j, 4) = Range(brr(x, 2)).Item(1).Address(0, 0) '返回区域内的第一个地址
  38. crr(j, 6) = Range(brr(x, 2)).Item(imax).Address(0, 0) '返回区域内的最后个地址
  39. crr(j, 8) = jmax '连续出现的次数
  40. End If
  41. x = x + 1
  42. y = y + 1
  43. brr(x, 1) = Right(brr(x - 1, 1), 7) '生成新的连续数
  44. brr(x, 2) = Right(brr(x - 1, 2), Len(brr(x - 1, 2)) - InStr(1, brr(x - 1, 2), ":")) '生成新的连续数地址
  45. End If
  46. End If
  47. Next
  48. Next

  49. For j = 1 To col
  50. crr(j, 1) = "第" & j & "列最大结果"
  51. crr(j, 3) = "从"
  52. crr(j, 5) = "到"
  53. crr(j, 7) = "次"
  54. crr(j, 9) = "出现"
  55. crr(j, 11) = "没有出现"
  56. crr(j, 10) = "1234567890"
  57. For i = 2 To 8 '找出没有出现的数
  58. crr(j, 10) = Replace(crr(j, 10), Val(Mid(crr(j, 2), i, 1)), "")
  59. Next
  60. Next

  61. Sheets("求结果").Range("A2").Resize(col, 11) = crr
  62. Application.ScreenUpdating = True
  63. End Sub
复制代码
连续七个数出现的最大值_芐雨.rar (12.63 KB, 下载次数: 3)
回复

使用道具 举报

 楼主| 发表于 2014-1-26 18:52 | 显示全部楼层
本帖最后由 zss7758258 于 2014-1-26 19:10 编辑
芐雨 发表于 2014-1-26 13:18
这么晚,早点睡吧!
举例里多余的数据先删除,如附件。你测试下吧


请教3333.zip (17.64 KB, 下载次数: 2)
回复

使用道具 举报

发表于 2014-1-26 20:30 | 显示全部楼层    本楼为最佳答案   
附件请测试,由于版本关系,代码内不能用中文,你测试无误后可以将"ge shu zi"替换为"个数字"
  1. Sub aaa()
  2. Dim arr, i&, j&, k&, d As Object, m&, n&, ad&, r&, brr, s$, s1$, c
  3. s = "0123456789"
  4. Set d = CreateObject("scripting.dictionary")
  5. arr = Sheets(1).[a1].CurrentRegion
  6. For j = 1 To UBound(arr, 2)
  7.   For i = 1 To UBound(arr) - 6
  8.     For k = i To UBound(arr)
  9.       d(arr(k, j)) = d(arr(k, j)) + 1
  10.       If d.Count > 7 Then d.Remove (arr(k, j)): Exit For
  11.     Next k
  12.     If d.Count = 7 Then
  13.       n = Application.Sum(d.items)
  14.       If m <= n Then
  15.         If m = n Then
  16.           r = r + 1
  17.         ElseIf m < n Then
  18.           m = n
  19.           ReDim brr(1 To 100, 1 To 6)
  20.           r = 1
  21.         End If
  22.         brr(r, 1) = Join(d.keys, "")
  23.         brr(r, 2) = Replace(Cells(i, j).Address, "$", "")
  24.         brr(r, 3) = Replace(Cells(k, j).Address, "$", "")
  25.         s1 = s
  26.         For Each c In d.keys
  27.           s1 = Replace(s1, c, "")
  28.         Next c
  29.         brr(r, 4) = m
  30.         brr(r, 5) = Len(s1)
  31.         brr(r, 6) = s1
  32.       End If
  33.     End If
  34.     d.RemoveAll
  35.   Next i
  36. Next j
  37. [b2].Resize(UBound(brr)) = Application.Index(brr, , 1)
  38. [d2].Resize(UBound(brr)) = Application.Index(brr, , 2)
  39. [f2].Resize(UBound(brr)) = Application.Index(brr, , 3)
  40. [h2].Resize(UBound(brr)) = Application.Index(brr, , 4)
  41. [j2].Resize(UBound(brr)) = Application.Index(brr, , 6)
  42. [j1] = brr(1, 5) & "ge shu zi"
  43. End Sub
复制代码

请教.zip

10.56 KB, 下载次数: 7

回复

使用道具 举报

发表于 2014-1-26 21:40 | 显示全部楼层
  1. Sub 区域内连续七个数出现的最大值_芐雨()
  2.     Dim brr(), crr()
  3.     Dim Rng As Range, arr
  4.     Application.ScreenUpdating = False
  5.     Set d = CreateObject("scripting.dictionary")
  6.     Set Rng = Sheets("举例").Range("A1").CurrentRegion    '范围
  7.     Sheets("求结果").Range("A2").Resize(Rows.Count - 1, 11).Clear    '清除数据
  8.     col = Rng(Rng.Count).Column    '列数
  9.     arr = Rng
  10.     For j = 1 To col
  11.         ReDim brr(1 To UBound(arr), 1 To 2)
  12.         x = 1
  13.         For i = 1 To UBound(arr)
  14.             arr(i, j) = arr(i, j) & ""    '转成字符
  15.             If Not d.exists(arr(i, j)) Or i = UBound(arr) Then    '字典不存在或最后一行时运行
  16.                 k = k + 1    '记录字典数
  17.                 d(arr(i, j)) = ""    '添加字典
  18.                 brr(x, 1) = brr(x, 1) & arr(i, j)    '记录出现的数
  19.                 If brr(x, 2) <> "" Then
  20.                     brr(x, 2) = brr(x, 2) & ":" & Cells(i, j).Address    '记录地址
  21.                 Else
  22.                     brr(x, 2) = Cells(i, j).Address    '记录地址
  23.                 End If
  24.                 If k = 8 Then
  25.                     If i < UBound(arr) Then    '不是最后一行时
  26.                         d.Remove (Left(brr(x, 1), 1))    '删除第一个数的字典
  27.                         L = InStrRev(brr(x, 2), "$")    '最后一个$的位置
  28.                         brr(x, 2) = Left(brr(x, 2), L) & Right(brr(x, 2), Len(brr(x, 2)) - L) - 1    '最后一个地址上移一格
  29.                     End If
  30.                     imax = Range(brr(x, 2)).Count    '求出连续出现的数
  31.                     If imax = jmax Then    '最大值相同时
  32.                         m = m + 1
  33.                         crr(m, 2) = "'" & Left(brr(x, 1), 7)    '转成文本数值,记录出现什么数
  34.                         crr(m, 4) = Range(brr(x, 2)).Item(1).Address(0, 0)    '返回区域内的第一个地址
  35.                         crr(m, 6) = Range(brr(x, 2)).Item(imax).Address(0, 0)    '返回区域内的最后个地址
  36.                         crr(m, 8) = jmax    '连续出现的次数
  37.                     End If
  38.                     If imax > jmax Then    '比较是否最大值
  39.                         ReDim crr(1 To 1000, 1 To 11)  '有最大值清空数组
  40.                         jmax = imax
  41.                         m = 1
  42.                         crr(m, 2) = "'" & Left(brr(x, 1), 7)    '转成文本数值,记录出现什么数
  43.                         crr(m, 4) = Range(brr(x, 2)).Item(1).Address(0, 0)    '返回区域内的第一个地址
  44.                         crr(m, 6) = Range(brr(x, 2)).Item(imax).Address(0, 0)    '返回区域内的最后个地址
  45.                         crr(m, 8) = jmax    '连续出现的次数
  46.                     End If
  47.                     x = x + 1    '记录
  48.                     d.RemoveAll
  49.                     k = 0
  50.                     If i = UBound(arr) Then Exit For
  51.                     i = x
  52.                 End If
  53.             End If
  54.         Next
  55.     Next
  56.     For j = 1 To m
  57.         If j > 1 Then dd = "重复"
  58.         crr(j, 1) = dd & "第" & j & "个最大结果"
  59.         crr(j, 3) = "从"
  60.         crr(j, 5) = "到"
  61.         crr(j, 7) = "次"
  62.         crr(j, 9) = "出现"
  63.         crr(j, 11) = "没有出现"
  64.         crr(j, 10) = "1234567890"
  65.         For i = 2 To 8    '找出没有出现的数
  66.             crr(j, 10) = Replace(crr(j, 10), Val(Mid(crr(j, 2), i, 1)), "")
  67.         Next
  68.     Next
  69.     Sheets("求结果").Range("A2").Resize(m, 11) = crr
  70.     Application.ScreenUpdating = True
  71. End Sub
复制代码
原来是求区域内的最大值

评分

参与人数 1 +1 收起 理由
zss7758258 + 1 很给力!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 09:16 , Processed in 0.909873 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表