| 
    
     |  | 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
 
 
 重複チェックをどうするか という箇所を思いついたもの
 を記述しました。確認して下さい
 
 |  |