[問題] 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