Excel精英培训网

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

[已解决]如何产生满足要求的随机数

[复制链接]
发表于 2014-5-4 15:35 | 显示全部楼层 |阅读模式
从sheet2的a3行里随机取2组2个数一组,2组3个数一组,(同一组里的数互不重复)
分别放进sheet1的 b17,c17(一组),b18,c18(一组),b19,c19,d19(一组),b20,c20,d20(一组)
要求 必不与sheet2  a2  行里的数
a2和a3行单元格的个数不一定

最佳答案
2014-5-5 09:16
怎么代码格式没了?
  1. Sub 随机()
  2.     Dim xrng As Range
  3.     Dim datarange As Integer
  4.     Dim brr(1 To 4, 1 To 3)
  5.     Dim rng As Integer
  6.     With Sheet2
  7.         Set xrng = .Range(.[a2], .[a2].End(xlToRight))   '不参与随机的数字
  8.         arr = .Range(.[a3], .[a3].End(xlToRight))       '所有数字
  9.         ReDim crr(1 To UBound(arr, 2))        '所有数字中去掉不参与随机的数字
  10.         For i = 1 To UBound(arr, 2)
  11.             If Application.WorksheetFunction.CountIf(xrng, arr(1, i)) = 0 Then      '去掉不参与随机的数字
  12.                 n = n + 1
  13.                 crr(n) = arr(1, i)
  14.             End If
  15.         Next
  16.     End With
  17.    
  18.     For k = 1 To 4
  19.         drr = crr
  20.         p = n
  21.         q = IIf(k <= 2, 2, 3)
  22.         For i = 1 To q
  23.             rng = Int((p * Rnd) + 1)
  24.             brr(k, i) = drr(rng)
  25.             drr(rng) = drr(p)
  26.             p = p - 1
  27.         Next
  28.     Next
  29.     Sheet1.Range("b15").Resize(4, 3) = brr
  30. End Sub

复制代码

E.rar

14.33 KB, 下载次数: 19

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-5-4 16:10 | 显示全部楼层
  1. Sub 随机()
  2.     Dim datarange As Integer
  3.     Dim brr(1 To 4, 1 To 3)
  4.     Dim rng As Integer
  5.     datarange = Sheet2.Range("a3").End(xlToRight).Column
  6.    
  7.     For k = 1 To 4
  8.         arr = Sheet2.Range("a3").Resize(1, datarange)
  9.         p = datarange
  10.         q = IIf(k <= 2, 2, 3)
  11.         For i = 1 To q
  12.             rng = Int((p * Rnd) + 1)
  13.             brr(k, i) = arr(1, rng)
  14.             arr(1, rng) = arr(1, p)
  15.             p = p - 1
  16.         Next
  17.     Next
  18.     Sheet1.Range("b15").Resize(4, 3) = brr
  19. End Sub
复制代码
回复

使用道具 举报

发表于 2014-5-4 16:12 | 显示全部楼层
是不是这样?“要求 必不与sheet2  a2  行里的数
a2和a3行单元格的个数不一定”这句话看不懂

E.rar

16.57 KB, 下载次数: 2

回复

使用道具 举报

 楼主| 发表于 2014-5-4 16:53 | 显示全部楼层
本帖最后由 akb48 于 2014-5-4 19:50 编辑
grf1973 发表于 2014-5-4 16:12
是不是这样?“要求 必不与sheet2  a2  行里的数
a2和a3行单元格的个数不一定”这句话看不懂

必不与sheet2  a2  行里的数相同,
少打了两个字,
sheet2 a2这行出现的数字不参与随机
如a2=A3,b2=A5,则实际参与随机的数是A1,A2,A4,A6


回复

使用道具 举报

发表于 2014-5-5 09:14 | 显示全部楼层
akb48 发表于 2014-5-4 16:53
必不与sheet2  a2  行里的数相同,
少打了两个字,
sheet2 a2这行出现的数字不参与随机

把初始的数组去掉不参与随机的数字即可。见代码
  1. Sub 随机()
  2. Dim xrng As Range
  3. Dim datarange As Integer
  4. Dim brr(1 To 4, 1 To 3)
  5. Dim rng As Integer
  6. With Sheet2
  7. Set xrng = .Range(.[a2], .[a2].End(xlToRight)) '不参与随机的数字
  8. arr = .Range(.[a3], .[a3].End(xlToRight)) '所有数字
  9. ReDim crr(1 To UBound(arr, 2)) '所有数字中去掉不参与随机的数字
  10. For i = 1 To UBound(arr, 2)
  11. If Application.WorksheetFunction.CountIf(xrng, arr(1, i)) = 0 Then '去掉不参与随机的数字
  12. n = n + 1
  13. crr(n) = arr(1, i)
  14. End If
  15. Next
  16. End With

  17. For k = 1 To 4
  18. drr = crr
  19. p = n
  20. q = IIf(k <= 2, 2, 3)
  21. For i = 1 To q
  22. rng = Int((p * Rnd) + 1)
  23. brr(k, i) = drr(rng)
  24. drr(rng) = drr(p)
  25. p = p - 1
  26. Next
  27. Next
  28. Sheet1.Range("b15").Resize(4, 3) = brr
  29. End Sub

复制代码
回复

使用道具 举报

发表于 2014-5-5 09:16 | 显示全部楼层    本楼为最佳答案   
怎么代码格式没了?
  1. Sub 随机()
  2.     Dim xrng As Range
  3.     Dim datarange As Integer
  4.     Dim brr(1 To 4, 1 To 3)
  5.     Dim rng As Integer
  6.     With Sheet2
  7.         Set xrng = .Range(.[a2], .[a2].End(xlToRight))   '不参与随机的数字
  8.         arr = .Range(.[a3], .[a3].End(xlToRight))       '所有数字
  9.         ReDim crr(1 To UBound(arr, 2))        '所有数字中去掉不参与随机的数字
  10.         For i = 1 To UBound(arr, 2)
  11.             If Application.WorksheetFunction.CountIf(xrng, arr(1, i)) = 0 Then      '去掉不参与随机的数字
  12.                 n = n + 1
  13.                 crr(n) = arr(1, i)
  14.             End If
  15.         Next
  16.     End With
  17.    
  18.     For k = 1 To 4
  19.         drr = crr
  20.         p = n
  21.         q = IIf(k <= 2, 2, 3)
  22.         For i = 1 To q
  23.             rng = Int((p * Rnd) + 1)
  24.             brr(k, i) = drr(rng)
  25.             drr(rng) = drr(p)
  26.             p = p - 1
  27.         Next
  28.     Next
  29.     Sheet1.Range("b15").Resize(4, 3) = brr
  30. End Sub

复制代码
回复

使用道具 举报

发表于 2014-5-5 09:17 | 显示全部楼层
请看附件。

E.rar

18.06 KB, 下载次数: 0

回复

使用道具 举报

 楼主| 发表于 2014-5-5 11:25 | 显示全部楼层
grf1973 发表于 2014-5-5 09:17
请看附件。

如果A3行最后几格是这种有数组公式,但却是空白的单元格,如G3,H3,I3,J3,用  datarange = Sheets("参数").Range("a15").End(xlToRight).Column,都会提到到这几个单元格。导致随机出来的数会出现空白,怎么能够解决这个问题
QQ图片20140505111933.jpg
回复

使用道具 举报

发表于 2014-5-5 11:31 | 显示全部楼层
If Application.WorksheetFunction.CountIf(xrng, arr(1, i)) = 0 And Len(arr(1,i))>0 Then      
回复

使用道具 举报

 楼主| 发表于 2014-5-5 13:22 | 显示全部楼层
grf1973 发表于 2014-5-5 11:31
If Application.WorksheetFunction.CountIf(xrng, arr(1, i)) = 0 And Len(arr(1,i))>0 Then

  • Sub 随机()
  •     Dim datarange As Integer
  •     Dim brr(1 To 4, 1 To 3)
  •     Dim rng As Integer
  •     datarange = Sheet2.Range("a3").End(xlToRight).Column
  •     For k = 1 To 4
  •         arr = Sheet2.Range("a3").Resize(1, datarange)
  •         p = datarange
  •         q = IIf(k <= 2, 2, 3)
  •         For i = 1 To q
  •             rng = Int((p * Rnd) + 1)
  •             brr(k, i) = arr(1, rng)
  •             arr(1, rng) = arr(1, p)
  •             p = p - 1
  •         Next
  •     Next
  •     Sheet1.Range("b15").Resize(4, 3) = brr
  • End sub






a2行不出的数字我用公式去掉了。

如果 是原来这段代码要加在哪?

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 08:44 , Processed in 0.436156 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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