ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7066|回复: 14

[原创] 迎中秋 【香川巨量随机取数】程序发布

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-8-28 22:15 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:自定义函数开发
本帖最后由 香川群子 于 2014-8-31 23:00 编辑

具体请看附件,不懂来问。

附件更新,改为自定义函数版用法:
香川巨量随机取数20140828.rar (23.83 KB, 下载次数: 506)
  1. Sub kagawa()
  2.     If [g2] = 0 Then [g2] = 5 '列数指定不能为0
  3.     [a5].CurrentRegion.Offset(1) = "" '清空输出区域
  4.     [a6].Resize([c2] \ [g2] + 1, [g2]) = GetRndAvg([a2], [b2], [c2], [d2], [e2], [h2], [g2]) '按指定列数输出结果
  5. End Sub

  6. Function GetRndAvg(a, b, m, Optional d = 0, Optional h = 1, Optional s = 1, Optional l = 5) '指定区间内 均匀随机取不重复值 按指定列数输出
  7. '    Dim a, b, c(), d, f(), h, i, l, m, n, r, t '因为数值个数会超Long范围,所以不应该定义数据类型
  8. '     [f2]=IF(E2,INT((B2-A2)*10^D2/E2)+1,"无限")
  9.      
  10. '    d = [d2] '小数位数d 用法同=Round(,numdecimalplaces)的第2参数 零为整数、正数为小数、负数为个十百千位向上取整
  11. '    a = [a2] * 10 ^ d '取值下限、自动按小数位设置扩大/缩小
  12. '    b = [b2] * 10 ^ d '取值上限、自动按小数位设置扩大/缩小
  13. '    m = [c2] '取值个数 F2单元格中公式计算取值允许个数 =IF(E2,INT((B2-A2)*10^D2/E2)+1,"无限")
  14. '    h = [e2] '最小间隔步长 h=0时允许重复。而h不为零时如取值个数大于取数范围则取数不足部分返回=0
  15. '    l = [g2] '输出时列数指定 行数自动=m\l
  16. '    s = [h2] '输出时是否排序 s=0时返回随机乱序(数组洗牌法)、s=1时按从小到大升序输出
  17.     a = a * 10 ^ d
  18.     b = b * 10 ^ d
  19.    
  20.     Randomize
  21.     ReDim c(m - 1) '按取值个数定义存放结果的数组c
  22.     If b - a < m * h Then c(0) = a Else c(0) = Int(((b - a + 1) / m - h) * Rnd) + a '首位取值*Rnd即可
  23. '    n = 0 当前取值个数
  24.     Do
  25.         If b - c(n) < (m - n) * h Then
  26.             If c(n) + h > b Then Exit Do Else c(n + 1) = c(n) + h
  27.         Else
  28.             c(n + 1) = c(n) + Int(((b - c(n) + 1) / (m - n) - h) * Rnd * 2) + h
  29.             '取数原理为: 上个值c(n) + 剩余范围(b - c(n) + 1) 除以剩余个数(m - n)得到的均匀区间
  30.             '             并扣除最小间隔h然后 乘以2倍随机数 Rnd*2 取值  再加上最小间隔h
  31.             '其中关键是 要乘以2倍随机数 Rnd*2 取值 这是因为Rnd的期望平均值=0.5
  32.         End If
  33.         n = n + 1
  34.     Loop Until n = m - 2 '到剩下最后一个时停止 (因最后一个的计算方法不同)
  35.     If c(n) + h <= b Then c(m - 1) = c(n) + Int((b - c(n) + 1 - h) * Rnd) + h '末位取值*Rnd即可
  36.    
  37.     ReDim f(m \ l, l - 1) '按指定列数计算所需行数后定义存放结果的数组f
  38.     If s = 0 Then 's=0时返回随机乱序(数组洗牌法)
  39.         For i = 0 To m - 1
  40.             r = Int((m - i) * Rnd) + i '数组洗牌算法进行不重复随机乱序抽取
  41.             f(i \ l, i Mod l) = c(r) / 10 ^ d '该随机位置结果按指定小数位换算后输出
  42.             c(r) = c(i) '该随机位置和当前位置值交换 防止遗漏
  43.             
  44. '            t = c(r): c(r) = c(i): c(i) = c(r) '抽取后进行位置交换 保证不重复以及无遗漏
  45. '            f(i \ l, i Mod l) = t / 10 ^ d '结果按指定小数位换算
  46.         Next
  47.     Else 's=1时按从小到大升序输出
  48.         For i = 0 To m - 1
  49.             f(i \ l, i Mod l) = c(i) / 10 ^ d '结果按指定小数位换算
  50.         Next
  51.     End If
  52.    
  53. '    [a5].CurrentRegion.Offset(1) = "" '清空输出区域
  54. '    [a6].Resize(m \ l + 1, l) = f '按指定列数输出结果
  55.     GetRndAvg = f '数组结果赋值给该函数
  56.    
  57. End Function
复制代码

评分

6

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-8-28 22:24 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-8-28 23:38 来自手机 | 显示全部楼层
谢谢香川老师分享!果然收藏了!

TA的精华主题

TA的得分主题

发表于 2014-8-29 07:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
昨天刚学习了裙子老师的贴,裙子老师就公布了!学习收藏!

TA的精华主题

TA的得分主题

发表于 2014-12-26 09:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-1-28 19:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢您的帮助,收藏学习

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-1 23:07 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-2-19 16:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
个人宏更新

PRSNL20160216.zip

516.83 KB, 下载次数: 221

TA的精华主题

TA的得分主题

发表于 2016-4-27 07:44 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-3-21 00:31 | 显示全部楼层
谢谢香川老师分享!果然收藏了!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 07:11 , Processed in 0.047561 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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