Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


62706 / 76732 ←次へ | 前へ→

【18631】Re:乱数(重複なし)の発生は?
発言  ichinose  - 04/10/2(土) 1:59 -

引用なし
パスワード
   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


重複チェックをどうするか という箇所を思いついたもの
を記述しました。確認して下さい
1 hits

【18624】乱数(重複なし)の発生は? ponpon 04/10/1(金) 22:13 質問
【18625】Re:乱数(重複なし)の発生は? ちゃっぴ 04/10/2(土) 0:08 回答
【18627】Re:乱数(重複なし)の発生は? ponpon 04/10/2(土) 0:58 発言
【18628】Re:乱数(重複なし)の発生は? ponpon 04/10/2(土) 1:07 発言
【18629】Re:乱数(重複なし)の発生は? ちゃっぴ 04/10/2(土) 1:38 回答
【18630】Re:乱数(重複なし)の発生は? ちゃっぴ 04/10/2(土) 1:56 回答
【18631】Re:乱数(重複なし)の発生は? ichinose 04/10/2(土) 1:59 発言
【18637】Re:乱数(重複なし)の発生は? ponpon 04/10/2(土) 15:36 お礼
【18638】Re:乱数(重複なし)の発生は? ちゃっぴ 04/10/2(土) 15:55 回答
【18640】Re:乱数(重複なし)の発生は? ponpon 04/10/2(土) 16:19 お礼
【18641】Re:乱数(重複なし)の発生は? ちゃっぴ 04/10/2(土) 16:45 回答
【18642】Re:乱数(重複なし)の発生は? ponpon 04/10/2(土) 17:43 発言
【18653】Re:乱数(重複なし)の発生は? ponpon 04/10/3(日) 9:54 お礼

62706 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free