[问题] Excel VBA从某范围乱数抽取计数

楼主: passion929 (baby)   2020-04-15 10:59:28
大家好:
不好意思有一个VBA的问题想请教
文件连结:https://bit.ly/3ckveLI
我在Actual工作表中,已经算出1~3999对应的罗马数字以及其字串长度,
而字串长度会介于1~15之间,
我在Results工作表也已经算出字串长度在1~3999的分配状况并以枢纽分析表呈现。
我的疑问是我现在要在Results工作表的a1:b17用vba写出
当我用乱数在Actual的c栏随机挑5000次,
那机率分配会是如何?
目前我写的code可以算出5000次,但只能1~15平均分配,
而原本的Actual c栏1~15的机率分配并非随机,
不知道能不能从Actual c栏挑出5000次,
并产出如图片(a,b栏的样貌。
图: https://imgur.com/o2QNhDy
另外我自己产生的数字都会从a1 b1开始,
但我希望a1, b1是表头,
已经尝试过很多次但都调整失败。
请教一下各位高手了,谢谢!
作者: soyoso (我是耀宗)   2020-04-15 11:13:00
储存格a1和b1为表头,写入资料从第二列起的话Range("a" & display_it)改为Range("a" & display_it + 1)Range("b" & display_it)亦同表头方面再写入"Number"和"VBA"后 listobjects.add格式化为表格,要合计showtotals为真true
楼主: passion929 (baby)   2020-04-15 11:27:00
谢谢 刚刚用display_it+1已经成功让资料从第二列开始但我在第二行打了Range(“a1”)=“number” 跑的时候仍然出不来另外也想请教一下 因为之前没有学过listtoobjects.add的用法,请问具体是要在哪一部分加入呢以及Showtotoals=True是要加在哪一个地方呢? 谢谢另外目前算出来仍然是1-15平均出现共5000次,有可能套用Actual c栏的次数分配机率吗? 谢谢
作者: soyoso (我是耀宗)   2020-04-15 11:33:00
第二行是指?Dim count_of_each_toss(50)下方吗?如果加在dim ...和Call clean_a1b17中间的话,就会执行程序clean_a1b17,储存格a1的值被清除表头要加在Call clean_a1b17的下方
楼主: passion929 (baby)   2020-04-15 11:36:00
对的 我在sub dice_with_dimension() 下面写了range(“a1”)= “number”喔喔喔谢谢 突破盲点 我忘记有clean的设定了
作者: soyoso (我是耀宗)   2020-04-15 11:39:00
listobjects.add和showtotals用法可google,加在循环结束档案来看为next和end sub中间用法方面也可以用录制,格式化为表格这个功能
楼主: passion929 (baby)   2020-04-15 11:41:00
好的 非常感谢你 我再来试试看!
作者: soyoso (我是耀宗)   2020-04-15 11:49:00
Actual c栏为分配机率是指?1 Length为1,当乱数时取出1次后就不会被取出的意思吗?如果是的话,1.乱数,2.取出后length减1,3.判断当0时不再被取得,以变量暂存(如宏内变量count_of_each_toss这样的方式),或是以储存格暂存都是可以的
楼主: passion929 (baby)   2020-04-15 12:40:00
我想要用vba做出的次数比例是接近我在result的j栏(根据actual工作表中1-3999的罗马数字字串算出再count的结果)但是必须抽5000次,我的想法是因为actual c栏的1-15是有某种比例分配的,能不能从这一栏抽5000次再count到results的vba制成的表格,这样分配比例就会跟actual很接近(像图所示一样)因为1-15并非平均分配 我想这应该是我用randbetween没办法得出正确答案的原因,但一直查不到应该怎么写对了我已经成功在vba设定表头名称 并格式化为表格和加入合计(用录制的)非常感谢对了因为是要模拟actual c栏产生的分配结果,应该是取出不放回
作者: soyoso (我是耀宗)   2020-04-15 13:06:00
要做出的次数比例是接近枢纽分析表的话那1.先5000乘i2:i16,会取得actual的次数2.取整数int,或四舍五入(工作表函数的round),这时总数有可能多或少3.随机分配给占比前几的,这样比较不会影响占比小的actualpercent4.确定1~15的actual的次数后,再来循环乱数1~15,每次都递减1~15的actual次数直至0,每当次数0值增加,乱数最大值就会递减,如1的次数没有了,乱数会是1~14乱数的1~15或1~14要对应的是次数还大于0的值
楼主: passion929 (baby)   2020-04-15 13:28:00
谢谢你花时间回复我 真的很感谢 我大概了解设计的逻辑了 但因为我是vba新手 之前虽然有用excel函数 但vba对我来说是全新的东西 我再来研究要怎么把这些思维转成vba 非常感谢
作者: soyoso (我是耀宗)   2020-04-15 13:48:00
或是要用资料分析内的乱数产生器,离散分配,值及机率就以枢纽分析表的h2:h16和j2:j16这方面有要连续参照位址,再复制到其他储存格,乱数个数5000但测试上是否符合要的接近,原po再看看;也可用循环重复产生出乱数,再判断最符合接近的结果最后再以该结果来产生枢纽分析表如 https://i.imgur.com/IP88dMO.jpg 这是测试循环100次下的结果判断上是以两两相减abs后最小值,当然这只是模拟而已,至于最接近的定义为何,原po再自行调整https://i.imgur.com/cc5rWQP.jpg当循环300次时 https://i.imgur.com/k6C7Y1H.jpg
楼主: passion929 (baby)   2020-04-16 03:45:00
谢谢你这么专业又热心 我后来因为还是研究不出来怎么写 所以我试着用另一个macro产生5000个乱数在excel某个地方后 再countif再表格里 也有产生差不多的结果 只是变成要录好多macro再call进来 目前档案虽然能跑 但离完美还很远真的非常感谢你花时间帮我看 这个问题比较复杂 一定花了你很多时间理解我的表达与测试

Links booklink

Contact Us: admin [ a t ] ucptt.com