ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 350977106

随机数字

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-27 10:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
excel海 发表于 2020-2-21 19:06
能解决大部分问题

老师,你好!
自定义函数部分,感觉是对数组重新排序,但d值是从1到15个数中随机产生的,可能有很多重复啊,还未对数组真正理解,数组下标改变,原来的顺序不改变吗?海老师能帮忙解释一下这几句代码和真正作用和意图吗。就像绕了一个圈。
For i = 1 To 15
        d = Int(Rnd * 15 + 1)
        t = arr(i, 1)
        arr(i, 1) = arr(d, 1)
        arr(d, 1) = t
    Next

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-4 18:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一把小刀闯天下 发表于 2020-2-23 12:12
If Timer - tm > 0.01 Then j = j - 1: Exit For

相应行修改了一下能跑出15*10,不是很吃力,估计偶尔会 ...

老师,你好了!
这句代码怎么解释,起到什么作用,为什么还要强调  i>1


If i > 1 Then dic(j)(arr(i - 1) & "-" & arr(i)) = 1

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-4 19:36 | 显示全部楼层

老师,你好!
下面的这段代码,假设部分,用数组方法该怎么改写:如能提到上一个循环内,goto 语句从随机数字开始,是不是效果更好一些。
我的意思是每一行做为一个数组,数组的最后一个随机数字与前面的不重复,这个数字就是有效的,否则重新生成一个随机数字。


Sub 随机数字()

Dim m, n, i, x, k, t, r, arr(), brr()
m = Range("a18"): n = Range("a19")
ReDim arr(1 To n, 1 To 1)
ReDim brr(1 To n, 1 To m)
Cells(1, 1).Resize(16, 16) = ""

For k = 1 To m
For i = 1 To n
arr(i, 1) = i
Next i

xx:
   For i = 1 To n
x = Int(Rnd * (n - i + 1)) + i
t = arr(i, 1): arr(i, 1) = arr(x, 1): arr(x, 1) = t
Cells(i, k) = arr(i, 1)
brr(i, k) = arr(i, 1)
Next i

  For r = 1 To n
If Application.CountIf(Cells(r, 1).Resize(1, k), Cells(r, k)) > 1 Then GoTo xx
Next r

Next k

Cells(1, 1).Resize(n, m) = brr
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-4 20:00 | 显示全部楼层
请问老师这段代码如何修改成数组表达方式

For r = 1 To n
If Application.CountIf(Cells(r, 1).Resize(1, k), Cells(r, k)) > 1 Then GoTo xx
Next

随机数字.rar

18.47 KB, 下载次数: 1

TA的精华主题

TA的得分主题

发表于 2020-3-4 20:14 | 显示全部楼层
350977106 发表于 2020-3-4 18:28
老师,你好了!
这句代码怎么解释,起到什么作用,为什么还要强调  i>1

同列行的第1个数据不用去判断的,因为最小组为2,也就是1-2、2-3,,,

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-3-4 20:17 | 显示全部楼层
350977106 发表于 2020-3-4 19:36
老师,你好!
下面的这段代码,假设部分,用数组方法该怎么改写:如能提到上一个循环内,goto 语句从随 ...

yjh自定义函数  7L
http://club.excelhome.net/thread-1509415-1-1.html
(出处: ExcelHome技术论坛)


mode=1   行列不重复

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-4 21:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
yjh_27 发表于 2020-3-4 20:17
yjh自定义函数  7L
http://club.excelhome.net/thread-1509415-1-1.html
(出处: ExcelHome技术论坛)

老师,你写的代码是最符合原要求的,考虑到了数字连锁问题,可惜我能力太弱,一下了消化不了那么多。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-7 17:52 | 显示全部楼层
yjh_27 发表于 2020-3-4 20:17
yjh自定义函数  7L
http://club.excelhome.net/thread-1509415-1-1.html
(出处: ExcelHome技术论坛)

老师,您好!
不考虑数字连锁的问题,我们可以先对数字错位排列,再对行列随机调整,应该可以得到无数个15*15的工作表,但很明显,按附件代码运行,到后来会越来越慢,因为生成的符合要求随机数字越来越少。假如换个思路,该怎样去写代码呢?
显然,最后一列,最后一排的可选数字就一个,越往右下角,如图,可用数字越少。假如将1-15个数字作为一个初始数组,单元格所在行和列作为另两个数组,与初始数组作比较,排除用过的数字,从剩下的数字中挑选,图中黄色单元格至少有3个数字可选,最多有7个数字可选。
行列所在的数组是随机变化的,与初始数组进行比较筛选,现在对我都是个难题,老师能否帮忙写一个,我再对照学习,不甚感激!谢谢!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-7 18:03 | 显示全部楼层
老师,你好!
能否按排除法写代码,即从1-15个数字中,去除行,列已用过的数字,再随机挑选可用的随机数字。
捕获.PNG

随机区组.rar

31.32 KB, 下载次数: 1

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-7 18:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
yjh_27 发表于 2020-3-4 20:17
yjh自定义函数  7L
http://club.excelhome.net/thread-1509415-1-1.html
(出处: ExcelHome技术论坛)

老师,你好!
能否按我下面的思路,帮写一下代码。我参照学习。i5即黄色单元格有3-7个符合要求的数字可选。需要将1-15个数字作为初始数组,已用的行,列数字作为两个动态数组。初始数组减去动态数组用过的数字,为可选数字。谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-5 17:17 , Processed in 0.034545 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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