Excel精英培训网

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

[已解决]数组求解:求large的第1到3次

[复制链接]
发表于 2011-1-23 04:47 | 显示全部楼层 |阅读模式
5学分
如:arr = [A2:BA400],注明:是用数组求,不是单元格循环求解

需要用到arr(i,j)来求各行的第1大,第2大,第3大数字,即large(数据,1),相同大小的同large结果一样,即第1,第2都是一样的

不可以用公式求,因为我测试了下,速度慢,想数据循环快。谢谢


最佳答案
2011-1-24 13:48
  1. Sub MLarge1()
  2.     Dim ArrYS
  3.     Dim ArrJG
  4.     Dim iCount%
  5.     '初始化数组
  6.     iCount = 3
  7.     ReDim ArrJG(1 To iCount)
  8.     ReDim ArrYS(1 To 100)
  9.     For i = 1 To UBound(ArrYS)
  10.         ArrYS(i) = Int(Rnd * 100)
  11.     Next i
  12.     '开始遍历原始数组
  13.     For i = 1 To UBound(ArrYS)
  14.         '依次与结果数组中的元素比较
  15.         For j = 1 To iCount
  16.             If IsEmpty(ArrJG(j)) Then
  17.                 ArrJG(j) = ArrYS(i)
  18.                 Exit For
  19.             End If
  20.             If ArrJG(j) <= ArrYS(i) Then
  21.                 '找到比原始数组中小的数,就替换
  22.                 For k = iCount To j + 1 Step -1
  23.                     ArrJG(k) = ArrJG(k - 1)
  24.                 Next
  25.                 ArrJG(j) = ArrYS(i)
  26.                 Exit For
  27.             End If
  28.         Next
  29.     Next i
  30.     MsgBox "原始数组" & Join(ArrYS, ",") & "中最大的三个数为:" & Join(ArrJG, ",")
  31. End Sub
复制代码

发表于 2011-1-23 08:22 | 显示全部楼层
你有几个帖子涉及排序,坛子中有好几个网友都写有排序的主题贴(http://www.excelpx.com/forum.php ... ghlight=&page=1是我07年写的)可以找来参考参考。
不过排序不建议另写代码,因为excel本身带有排序功能,他的速度应该是最快的(以前见过彭大师的排序,应该是我见过的排序中最优秀的,但似乎也没有快过excel)。当然做为练技术则除外哈
回复

使用道具 举报

发表于 2011-1-23 09:05 | 显示全部楼层
不排序的话,设三个变量呗,逐个比较
回复

使用道具 举报

发表于 2011-1-23 09:27 | 显示全部楼层
按开车的说法写了个仅供参考(数据源是c1:c100,为整数,最后的结果仅为一句msgbox,按自己的需求改吧)
Sub test()
ar = [c1:c100]
lar1% = ar(1, 1): k1% = 1
lar2% = ar(1, 1): k2% = 1
lar3% = ar(1, 1)
For i% = 2 To UBound(ar)
  If lar1 < ar(i, 1) Then
     lar3 = lar2
     lar2 = lar1: k2 = k1
     lar1 = ar(i, 1): k1 = 1
  ElseIf lar1 = ar(i, 1) Then
     k1 = k1 + 1
  Else
     If lar2 < ar(i, 1) Then
         lar3 = lar2
         lar2 = ar(i, 1): k2 = 1
     ElseIf lar2 = ar(i, 1) Then
         k2 = k2 + 1
     Else
         If lar3 < ar(i, 1) Then lar3 = ar(i, 1)
     End If
  End If
Next
MsgBox "最大值" & lar1 & "出现" & k1 & "次,第二大值" & lar2 & "出现" & k2 & "次,第三大值" & lar3
End Sub
回复

使用道具 举报

发表于 2011-1-23 09:29 | 显示全部楼层
学习,真棒!
回复

使用道具 举报

发表于 2011-1-23 09:48 | 显示全部楼层
你最好上传附件,大家帮你解决
回复

使用道具 举报

发表于 2011-1-23 19:12 | 显示全部楼层
其实我感觉还是自带的东西最快了。。。
回复

使用道具 举报

 楼主| 发表于 2011-1-23 19:17 | 显示全部楼层
提问只是个比喻,因为实际的数组,是我求出来的,又没有想让单元格过度的意思
回复

使用道具 举报

发表于 2011-1-23 19:25 | 显示全部楼层
学习         
回复

使用道具 举报

发表于 2011-1-24 13:48 | 显示全部楼层    本楼为最佳答案   
  1. Sub MLarge1()
  2.     Dim ArrYS
  3.     Dim ArrJG
  4.     Dim iCount%
  5.     '初始化数组
  6.     iCount = 3
  7.     ReDim ArrJG(1 To iCount)
  8.     ReDim ArrYS(1 To 100)
  9.     For i = 1 To UBound(ArrYS)
  10.         ArrYS(i) = Int(Rnd * 100)
  11.     Next i
  12.     '开始遍历原始数组
  13.     For i = 1 To UBound(ArrYS)
  14.         '依次与结果数组中的元素比较
  15.         For j = 1 To iCount
  16.             If IsEmpty(ArrJG(j)) Then
  17.                 ArrJG(j) = ArrYS(i)
  18.                 Exit For
  19.             End If
  20.             If ArrJG(j) <= ArrYS(i) Then
  21.                 '找到比原始数组中小的数,就替换
  22.                 For k = iCount To j + 1 Step -1
  23.                     ArrJG(k) = ArrJG(k - 1)
  24.                 Next
  25.                 ArrJG(j) = ArrYS(i)
  26.                 Exit For
  27.             End If
  28.         Next
  29.     Next i
  30.     MsgBox "原始数组" & Join(ArrYS, ",") & "中最大的三个数为:" & Join(ArrJG, ",")
  31. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 06:25 , Processed in 0.312616 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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