Excel精英培训网

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

[已解决]EXCEL高手用VBA做两个条件

[复制链接]
发表于 2015-4-21 12:45 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2015-4-21 14:15 | 显示全部楼层
  1. Sub main()
  2.     tms = Timer
  3.     arr = [c17:h37]       '彩票数据数组
  4.     brr = [j12:u15]        '条件数组
  5.     ReDim crr(1 To UBound(arr), 1 To UBound(brr, 2))       '结果数组
  6.     Dim ar%(1 To 6), br%(1 To 3)
  7.     For i = 1 To UBound(arr)
  8.         For k = 1 To 6: ar(k) = arr(i, k): Next
  9.         For j = 1 To UBound(brr, 2)
  10.             br(1) = brr(1, j): br(2) = brr(2, j): br(3) = brr(3, j)
  11.             p = CompAB(ar, br)
  12.             If p > 0 Then crr(i, j) = brr(4, j)
  13.         Next
  14.     Next
  15.     [J17].Resize(UBound(crr), UBound(crr, 2)) = crr
  16.    
  17.     For j = 1 To UBound(crr, 2)        '判断连续出现的最大次数
  18.         smax = 0
  19.         For i = 1 To UBound(crr)
  20.             If crr(i, j) = "" Then s = 0 Else s = s + 1
  21.             If s > smax Then smax = s
  22.         Next
  23.         Cells(5, j + 9) = smax & "次"
  24.     Next
  25.    
  26.     MsgBox Timer - tms & "秒"
  27. End Sub

  28. Function CompAB(ar%(), br%())        '返回数组br各数在数组ar中出现的次数
  29.     Dim s%(1 To 33)
  30.     For Each a In ar    '数组s以ar中每个数为下标的值设为1
  31.         If a > 0 Then s(a) = 1
  32.     Next
  33.     For Each b In br       '数组s以br中每个数为下标的值相加,即为数组br各数在数组ar中出现的次数
  34.         If b > 0 Then CompAB = CompAB + s(b)
  35.     Next
  36. End Function
复制代码

评分

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

查看全部评分

回复

使用道具 举报

发表于 2015-4-21 14:16 | 显示全部楼层
请看附件。以前做的那个数组比较的函数能用到此例中。

EXCEL高手用VBA做两个.rar

12.09 KB, 下载次数: 6

评分

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

查看全部评分

回复

使用道具 举报

发表于 2015-4-21 14:22 | 显示全部楼层
主程序代码还可简化。
  1. Sub main()
  2.     tms = Timer
  3.     arr = [c17:h37]       '彩票数据数组
  4.     brr = [j12:u15]        '条件数组
  5.     ReDim crr(1 To UBound(arr), 1 To UBound(brr, 2))       '结果数组
  6.     Dim ar%(1 To 6), br%(1 To 3)
  7.     For j = 1 To UBound(brr, 2)
  8.         smax = 0
  9.         br(1) = brr(1, j): br(2) = brr(2, j): br(3) = brr(3, j)
  10.         For i = 1 To UBound(arr)
  11.             For k = 1 To 6: ar(k) = arr(i, k): Next
  12.             p = CompAB(ar, br)
  13.             If p > 0 Then crr(i, j) = brr(4, j): s = s + 1 Else s = 0
  14.             If s > smax Then smax = s
  15.         Next
  16.         Cells(5, j + 9) = smax & "次"
  17.     Next
  18.     [J17].Resize(UBound(crr), UBound(crr, 2)) = crr
  19.     MsgBox Timer - tms & "秒"
  20. End Sub
复制代码

评分

参与人数 1 +3 收起 理由
laoau132 + 3

查看全部评分

回复

使用道具 举报

发表于 2015-4-21 14:31 | 显示全部楼层    本楼为最佳答案   
继续简化,不用子程序,一个主程序解决。
  1. Sub main()
  2.     tms = Timer
  3.     arr = [c17:h37]       '彩票数据数组
  4.     brr = [j12:u15]        '条件数组
  5.     ReDim crr(1 To UBound(arr), 1 To UBound(brr, 2))       '结果数组
  6.     For j = 1 To UBound(brr, 2)
  7.         smax = 0
  8.         For i = 1 To UBound(arr)
  9.             xstr = "," & Join(Application.Index(arr, i), ",") & ","
  10.             If InStr(xstr, "," & brr(1, j) & ",") > 0 Or InStr(xstr, "," & brr(2, j) & ",") > 0 _
  11.                 Or InStr(xstr, "," & brr(3, j) & ",") > 0 Then crr(i, j) = brr(4, j): s = s + 1 Else s = 0
  12.             If s > smax Then smax = s
  13.         Next
  14.         Cells(5, j + 9) = smax & "次"
  15.     Next
  16.     [J17].Resize(UBound(crr), UBound(crr, 2)) = crr
  17.     MsgBox Timer - tms & "秒"
  18. End Sub
复制代码

EXCEL高手用VBA做两个.rar

11.1 KB, 下载次数: 10

评分

参与人数 1 +3 收起 理由
laoau132 + 3 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-4-21 17:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 08:38 , Processed in 0.343167 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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