Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: haiyang81

[已解决]求数组元素连续个数最大值和最大值个数的代码

  [复制链接]
发表于 2011-11-4 15:38 | 显示全部楼层

  1. Sub test()
  2.     Dim A, m%, n%, i%, x$, y$, arr, brr
  3.     A = Array(0, 1, 1, 1, 0, 0, 2, 2, 1, 3, 3, 0, 0, 1, 1, 1, 2, 3, 0, 2)
  4.     m = Application.Min(A)
  5.     n = Application.Max(A)
  6.     x = Replace(Join(A), " ", "")
  7.     ReDim arr(m To n)
  8.     ReDim brr(m To n)
  9.     For i = m To n
  10.         y = pd(x, i)
  11.         arr(i) = Split(y, ",")(0)
  12.         brr(i) = Split(y, ",")(1)
  13.     Next i
  14.     Stop
  15. End Sub

  16. Function pd(x, i) As String    '判断
  17.     Dim regex As Object, matchs As Object, match As Object
  18.     Dim k As Integer, j As Integer
  19.     Set regex = CreateObject("VBScript.RegExp")
  20.     With regex
  21.         .Global = True
  22.         .Pattern = i & "{2,}"
  23.         Set matchs = .Execute(x)
  24.         For Each match In matchs
  25.             j = j + 1
  26.             k = Application.Max(k, Len(match))
  27.         Next
  28.     End With
  29.     pd = k & "," & j
  30. End Function
复制代码
这样吗
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

 楼主| 发表于 2011-11-4 15:56 | 显示全部楼层
本帖最后由 haiyang81 于 2011-11-4 15:56 编辑

回复 爱疯 的帖子

正是我所要的,非常感谢。
回复

使用道具 举报

发表于 2011-11-4 16:00 | 显示全部楼层
我的代码不用循环后面的字典KEY就可以了
此时:
KEYS为不重复值的数组
ITEMS为连续最大值与对应出现次数的二维数组。
回复

使用道具 举报

 楼主| 发表于 2011-11-4 16:12 | 显示全部楼层
1、Arr = Array(0, 1, 1, 1, 0, 0, 2, 2, 1, 3, 3, 0, 0, 1, 1, 1, 2, 3, 0, 2) 数组经常发生变化。我的数据主要是引用单元格区域,然后用Application.Transpose转换。这一点大家的程序都很好修改。
2、i的值发生变化,也就是统计单元格区域的某一数值得个数。有的时候是0到4,有的时候是1 到 7等等。
回头我再好好研究研究大家的代码。
总之,非常感谢大家的帮助。
回复

使用道具 举报

发表于 2011-11-4 16:35 | 显示全部楼层
回复 haiyang81 的帖子

我的代码的ARR直接定义赋值成你要处理的数组的。
另外也很好修改我的那个代码成自定义函数。
主要是你要明确自己已知什么结果,要返回什么结果就可以了。
你的结果可以返回成一个二维数组。对应多行三列。
第一列为不重复数组元素,第二列为最大连续数目,第三列为最大连续数出现的次数
如果用一个自定义函数来返回一个数组的话
可以把我的代码的D.exists判断部分略加变化返回到结果数组就可以了。
回复

使用道具 举报

发表于 2011-11-4 18:05 | 显示全部楼层
本帖最后由 爱疯 于 2011-11-6 22:12 编辑

看清了liuguansky的方法后(3楼)后,我才发现:

题意A:连续出现的最大值及出现连续最大值的次数
题意B:连续出现的最大值及出现连续值的次数

所以,我16楼其实题意B。如果是要题意A得改,比如如下:

  1. Sub test()
  2.     Dim A, m%, n%, i%, x$, y$, arr, brr
  3.     A = Array(0, 1, 1, 1, 0, 0, 2, 2, 1, 3, 3, 0, 0, 1, 1, 1, 2, 3, 0, 2)
  4.     m = Application.Min(A): n = Application.Max(A)
  5.     ReDim arr(m To n): ReDim brr(m To n)
  6.     x = Join(A, "")
  7.     For i = m To n
  8.         y = pd(x, i)
  9.         arr(i) = Split(y, ",")(0)    'arr(i)表示匹配项的长度(即连续最大值)
  10.         brr(i) = Split(y, ",")(1)    'brr(i)表示连续最大值的出现次数
  11.     Next i
  12.     Stop
  13. End Sub

  14. Function pd(x, i) As String    '判断
  15.     Dim regex As Object, matchs As Object, match As Object
  16.     Dim k As Integer, s As Integer
  17.     Set regex = CreateObject("VBScript.RegExp")
  18.     With regex
  19.         .Global = True
  20.         .Pattern = i & "{2,}"
  21.         Set matchs = .Execute(x)
  22.         For Each match In matchs
  23.             If match.Length = k Then    'k表示匹配项的长度(即连续最大值)
  24.                 s = s + 1       's表示连续最大值的出现次数
  25.             ElseIf Len(match) > k Then
  26.                 k = match.Length
  27.                 s = 1    '因为产生了新的最大值,所以s重新计数
  28.             End If
  29.         Next
  30.     End With
  31.     pd = k & "," & s
  32. End Function
复制代码
MhPrykRa.zip (15.39 KB, 下载次数: 6)
回复

使用道具 举报

发表于 2011-11-4 19:19 | 显示全部楼层
爱疯 发表于 2011-11-4 18:05
看清了liuguansky的方法后(3楼)后,我才发现:

题意A:连续出现的最大值及出现连续最大值的次数

由于1楼条件正巧,造成两个巧合:

1)使得两种题意得到相同结果。所以,有的理解为A,有的理解为B。

2)3楼思路:发生不连续时,才统计上一次的key。如果最后是连续相等的,就没被统计了。正巧,1楼条件中倒数第2和最后不同,没被发现。

点评

谢谢指点,加一个判断就可以了。当i=ubound(arr)时,判断下是否相同就可以了。  发表于 2011-11-4 21:12
回复

使用道具 举报

 楼主| 发表于 2011-11-4 19:37 | 显示全部楼层
回复 爱疯 的帖子

其实我是要题意A的。我还真没有注意运行完程序的结果。
回复

使用道具 举报

发表于 2011-11-4 21:26 | 显示全部楼层
我也是无意中发现的。
liuguansky的方法难度高些,我很难做到,看了liuguansky的方法,对数组+字典增加了认识,学习了。
回复

使用道具 举报

 楼主| 发表于 2011-11-5 22:26 | 显示全部楼层
回复 爱疯 的帖子

主要是初学者,所以你的方法还是没能融会贯通。又遇到新问题了。
若是求arr=array(0,1,1,1,0,0,2,2,1,3,3,0,0,1,1,1,2,3,0,2)最后一个元素的连续最大值及出现连续最大值的次数。
结果为pd=Array(2,2,1)
若是数组为Arr = Array(0, 1, 1, 1, 0, 0, 2, 2, 1, 3, 3, 0, 0, 1, 1, 1, 2, 3, 0, 2, 0, 0, 0, 0),
则结果为pd=Array(0,4,1)
则你的代码该如何修改。

点评

30楼的意思,我看不明白  发表于 2011-11-5 22:33
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 13:48 , Processed in 0.355654 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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