如何透過VBA隨機"萬中取一"(但不能重複),抽完一萬次
- 帖子
- 1018
- 主題
- 15
- 精華
- 0
- 積分
- 1058
- 點名
- 0
- 作業系統
- win7 32bit
- 軟體版本
- Office 2016 64-bit
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 桃園
- 註冊時間
- 2012-5-9
- 最後登錄
- 2022-9-28
|
本帖最後由 stillfish00 於 2014-8-19 17:15 編輯
供參考:- Sub test() '隨機取出指定個數的不重複
- Dim ar, num As Long, r, tmp
-
- ar = [D1:D10000].Value '原始資料(必須是不重複值)
- num = 10000 '設定取幾個值
-
- Randomize '初始化隨機函數Rnd()的種子
- For i = 1 To num
- '從i到最後一筆取出一個
- r = Int(Rnd * UBound(ar) - i) + i
- '取到的換到前面
- tmp = ar(r, 1)
- ar(r, 1) = ar(i, 1)
- ar(i, 1) = tmp
- Next
-
- '依序結果到F欄
- [F1].Resize(num) = ar
- End Sub
複製代碼 |
|
|
|
|
|
|
|
- 帖子
- 1018
- 主題
- 15
- 精華
- 0
- 積分
- 1058
- 點名
- 0
- 作業系統
- win7 32bit
- 軟體版本
- Office 2016 64-bit
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 桃園
- 註冊時間
- 2012-5-9
- 最後登錄
- 2022-9-28
|
回復 7# GBKEE
抱歉,少了括號
r = Int(Rnd * (UBound(ar) - i)) + i
感謝指正!! |
|
|
|
|
|
|
|
- 帖子
- 1018
- 主題
- 15
- 精華
- 0
- 積分
- 1058
- 點名
- 0
- 作業系統
- win7 32bit
- 軟體版本
- Office 2016 64-bit
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 桃園
- 註冊時間
- 2012-5-9
- 最後登錄
- 2022-9-28
|
本帖最後由 stillfish00 於 2014-8-20 09:30 編輯
回復 7# GBKEE
思慮不周:L ,應該是
r = Int(Rnd * (UBound(ar) - i+1)) + i- Sub test() '隨機取出指定個數的不重複
- Dim ar, num As Long, r, tmp
-
- ar = [D1:D10000].Value '原始資料(必須是不重複值)
- num = 10000 '設定取幾個值
-
- Randomize '初始化隨機函數Rnd()的種子
- For i = 1 To num
- '從i到最後一筆取出一個
- r = Int(Rnd * (UBound(ar) - i + 1 )) + i
- '取到的換到前面
- tmp = ar(r, 1)
- ar(r, 1) = ar(i, 1)
- ar(i, 1) = tmp
- Next
-
- '依序結果到F欄
- [F1].Resize(num) = ar
- End Sub
複製代碼 |
|
|
|
|
|
|
|
- 帖子
- 1018
- 主題
- 15
- 精華
- 0
- 積分
- 1058
- 點名
- 0
- 作業系統
- win7 32bit
- 軟體版本
- Office 2016 64-bit
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 桃園
- 註冊時間
- 2012-5-9
- 最後登錄
- 2022-9-28
|
回復 10# PKKO
僅供參考,不同電腦執行時間也不同- Sub test()
- Dim ar1, ar2, ar3, ar
- Dim i As Integer, j As Integer, k As Integer, n As Long
- Dim t, s As String
-
- t = Timer
- ar1 = [A1:A100].Value
- ar2 = [B1:B100].Value
- ar3 = [C1:C100].Value
- ReDim ar(1 To UBound(ar1) * UBound(ar2) * UBound(ar3), 1 To 1)
- n = 0
- For i = 1 To 100
- For j = 1 To 100
- s = ar1(i, 1) & ar2(j, 1)
- For k = 1 To 100
- n = n + 1
- ar(n, 1) = s & ar3(k, 1)
- Next
- Next
- Next
-
- Debug.Print Timer - t '小於1秒
-
- Application.ScreenUpdating = False
- [E1].Resize(UBound(ar)).Value = ar '把結果從array放到工作表上花費最多時間
- Application.ScreenUpdating = True
-
- Debug.Print Timer - t '約 1X 秒
- End Sub
複製代碼 |
|
|
|
|
|
|
|