|
ponpon さん、ちゃっぴ さん
こんばんは。
>>ユーザー定義のコレクションを使うか、Dictionaryオブジェクトを
> ↑
> ヘルプにありませんでした。見つけられないだけかもしれません。
私も普段は、コレクションを使う事が多いかなあ・・・。
後は、せっかくのExcel/VBAだから、フィルタですね
http://www2.jiu.ac.jp/~en/VBSdocs/390.htm
↑Dictionaryは、ここを見て下さい。
で、ご質問の件です。
1の配列をループで一つ一つ調べる方法
'=================================================================
Sub test()
Dim rndNO(1 To 20) As Integer
Dim intNO As Integer
Dim p As Integer
Dim t As Integer
Randomize
For p = 1 To 20
t = 30
intNO = Int(Rnd() * t) + 1 '1からtまでの乱数の発生
Do Until Not ex_array(intNO, rndNO()) '同じ数字がでたら、違うまでループ
' ↑ここでは、結果だけわかればよいので
' Functionにしました。
intNO = Int(Rnd() * t) + 1 '1からtまでの乱数の発生
Loop
rndNO(p) = intNO
Next
For i = 1 To 20
Cells(i, 1).Value = rndNO(i)
Next
End Sub
'==================================================================
Function ex_array(c_val As Variant, myarray As Variant) As Boolean
' 見つかると True 見つからないとFalse
ex_array = False
For idx = LBound(myarray) To UBound(myarray)
If c_val = myarray(idx) Then
ex_array = True
Exit For
End If
Next idx
End Function
3の乱数を文字列として格納する方法
これは、重複し無いデータをつくる箇所をFunctionにしました。
'=====================================================================
Sub test()
Dim wk As Variant
wk = sp_rng(30, 20)
For idx = LBound(wk) To UBound(wk)
cells(idx,1).value= wk(idx)
Next
End Sub
'=================================================================
Function sp_rng(n As Long, cnt As Long) As Variant
Dim idx As Long
ReDim r_array(1 To cnt) As Variant
Dim wk1
Randomize
For idx = 1 To cnt
r_array(idx) = Format("0", String(Int(WorksheetFunction.Log10(n)) + 1, "0"))
Next
'↑ 配列を0で初期化(実際にはnの値によって例えば、n=30だと"00"で初期化)
' つまり、桁数分0を並べる
For idx = 1 To cnt
wk = Int(Rnd() * n) + 1
Do Until UBound(Filter(r_array(), Format(wk, String(Int(WorksheetFunction.Log10(n)) + 1, "0")))) < 0
'Filter関数の結果同じデータがないとUbound()は、-1になります
wk = Int(Rnd() * n) + 1
Loop
r_array(idx) = Format(wk, String(Int(WorksheetFunction.Log10(n)) + 1, "0"))
' ↑ここもnの桁数分頭に0を付けた文字列として配列に格納
Next idx
For idx = LBound(r_array()) To UBound(r_array())
r_array(idx) = Val(r_array(idx))
Next
' ↑このループは、文字列を数値に直しています
sp_rng = r_array()
Erase r_array
End Function
重複チェックをどうするか という箇所を思いついたもの
を記述しました。確認して下さい
|
|