Excel精英培训网

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

[已解决]不放回抽取

[复制链接]
 楼主| 发表于 2015-10-17 18:46 | 显示全部楼层
grf1973 发表于 2015-10-16 16:55
n是可提取的总组数,每提掉一个,n=n-1

搞了二天,强烈不对啊。
  1. Sub 不对的()

  2. On Error GoTo Err
  3. arr = Range("A7:E" & [A1048576].End(3).Row)
  4. n = UBound(arr) '总组数
  5. Set d = CreateObject("scripting.dictionary")
  6. ytq = Application.WorksheetFunction.Sum(Rows(3)) '已提取量
  7. n = n - ytq '剩下的总提取量
  8. tql = Val(InputBox("看看谁被抽到" & Chr(10) & "多少个?", "市名额", _
  9. Application.WorksheetFunction.RandBetween(1, Val(UBound(arr)))))

  10. If tql > n Then tql = n '如果提取量大于剩余量,那么提取量=剩余量

  11. ReDim brr(1 To tql, 1 To 5)
  12. If ytq = 0 Then '未进行过提取
  13. c = 1
  14. Else '已进行过提取
  15. c = Cells(3, 256).End(xlToLeft).Column
  16. tqrr = Range([G7], Cells(UBound(arr) + 6, c + 1)) '已提取的组
  17. For j = 1 To UBound(tqrr, 2) Step 6 '已提取过的内容进字典
  18. For i = 1 To UBound(tqrr)
  19. If tqrr(i, j) <> "" Then
  20. d(tqrr(i, j)) = ""
  21. End If
  22. Next
  23. Next

  24. For i = 1 To UBound(arr) '剩下可提取的内容放到数组arr的前n位
  25. If Not d.exists(arr(i, 4)) Then '怎么不对??????????????????????????????????????????????
  26. kk = kk + 1
  27. arr(kk, 1) = arr(i, 1)
  28. arr(kk, 2) = arr(i, 2)
  29. arr(kk, 3) = arr(i, 3)
  30. arr(kk, 4) = arr(i, 4)
  31. arr(kk, 5) = arr(i, 5)
  32. End If
  33. Next
  34. End If

  35. For i = 1 To tql '在arr中的前n位中提取tql个数
  36. k = Int(Rnd * n) + 1 '生成1--n的随机数
  37. brr(i, 1) = arr(k, 1): arr(k, 1) = arr(n, 1)
  38. brr(i, 2) = arr(k, 2): arr(k, 2) = arr(n, 2)
  39. brr(i, 3) = arr(k, 3): arr(k, 3) = arr(n, 3)
  40. brr(i, 4) = arr(k, 4): arr(k, 4) = arr(n, 4)
  41. brr(i, 5) = arr(k, 5): arr(k, 5) = arr(n, 5)
  42. n = n - 1
  43. Next

  44. Cells(3, c + 6) = tql
  45. Cells(6, c + 6).Resize(1, 5) = Array("工号唯一", "体重公斤", "入厂日期", "姓名", "血液")
  46. Cells(7, c + 6).Resize(tql, 1).NumberFormatLocal = "@" '根据需要哪些列要强制文本!
  47. Cells(7, c + 6).Offset(0, 2).Resize(tql, 1).NumberFormatLocal = "yyyy-mm-dd"
  48. Cells(7, c + 6).Resize(tql, 5) = brr
  49. Cells(7, c + 6).Resize(tql, 5).EntireColumn.AutoFit
  50. Err:
  51. End Sub

复制代码

不对的.rar

1.32 MB, 下载次数: 7

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2015-10-18 07:09 | 显示全部楼层
试试看。

抽取信息.zip

26.38 KB, 下载次数: 6

评分

参与人数 1 +8 收起 理由
张雄友 + 8 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-10-18 08:36 | 显示全部楼层
冬日夏雨 发表于 2015-10-18 07:09
试试看。

谢谢!很慢,假如,共60000个。数组输出应该很快才对。第一次抽取1个,第二次抽取59999个,半天 没反应。

抽取信息2.rar

1.66 MB, 下载次数: 8

回复

使用道具 举报

发表于 2015-10-18 14:06 | 显示全部楼层
再试试看,这回第二次抽取59999个,大约需要10秒左右。突然不能发附件了,试试这个链接地址中的文件h t t p : //pan.baidu.com/s/1ntCfoGL

评分

参与人数 1 +9 收起 理由
张雄友 + 9 不依懒于唯一值判断,强。

查看全部评分

回复

使用道具 举报

发表于 2015-10-18 14:11 | 显示全部楼层
为了方便传送,网盘文件里的数据,我减小到30000条,实际上可以增加到60000条进行测试。
回复

使用道具 举报

 楼主| 发表于 2015-10-18 14:50 | 显示全部楼层
冬日夏雨 发表于 2015-10-18 14:06
再试试看,这回第二次抽取59999个,大约需要10秒左右。突然不能发附件了,试试这个链接地址中的文件h t t p ...

链接找不到东西,上代码即可。

点评

能不能分享一下你的提速技巧?我一直没找到方法。  发表于 2015-10-18 16:47
回复

使用道具 举报

发表于 2015-10-18 14:50 | 显示全部楼层
grf1973 发表于 2015-10-16 10:56

这代码写的,看的真是眼晕,先保存下来学习一下,水平有限呀,从来没写过这么长的篇的代码。
回复

使用道具 举报

发表于 2015-10-18 14:54 | 显示全部楼层
张雄友 发表于 2015-10-17 18:46
搞了二天,强烈不对啊。

干嘛搞这么复杂,正名单放在一个表内,抽取几个完成后,就把这几个名字行剪切粘贴到另一个表内,再进行下一次抽取;全部抽取完成后,把剪切过去的名单恢复到原表中不就行了吗?

评分

参与人数 1 +1 收起 理由
张雄友 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2015-10-18 14:56 | 显示全部楼层
张雄友 发表于 2015-10-18 08:36
谢谢!很慢,假如,共60000个。数组输出应该很快才对。第一次抽取1个,第二次抽取59999个,半天 没反应。 ...

EXCEL中的数组在元素超过50000个以后也不会很快的,

点评

跟数组元素无关,只跟循环判断有关。  发表于 2015-10-18 15:00
回复

使用道具 举报

发表于 2015-10-18 15:28 | 显示全部楼层
张雄友 发表于 2015-10-18 14:50
链接找不到东西,上代码即可。

这个速度的问题,前两天我帮别人处理过一次,刚开始他的代码是用单元格循环来的,我让它弄成数组,但他上传的数据只几千行,按成数组后就快了十倍,后来他说有九十多万行数据要统计,我也说用数组应该也没问题,结果同样的代码,就等不到结果了,简直就像死循环;后来测试了几次
50000万行以下,运行时间3秒多
50000到100000,运行时间6秒多
10万行以上到60万,运行时间5分多钟
60万行以上的就等半天没反应了。
这个帖应该还在浮着,你可以看一下。

点评

哈哈,不是的,同一个工作表中处理,100万行也是很快的。  发表于 2015-10-18 16:18
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 03:43 , Processed in 0.247369 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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