• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA 乱数と配列)

VBA 乱数と配列 - 1から6までの数字を重複しないように配列に入れたい

このQ&Aのポイント
  • VBAを使用して、一次元配列に1から6までの数字を重複しないように入れる方法を教えてください。
  • 上手く行っていないため、ご指導の程お願いします。
  • また、VBAの乱数生成方法についても教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

Sub rndsys() Dim 配列(5) As Integer Dim サイコロ As Integer Dim カウントA As Integer Dim カウントB As Integer Dim フラグ As Integer For カウントA = 0 To 5 Do フラグ = 0 'リセット サイコロ = Int(Rnd(1) * 6) + 1 For カウントB = 0 To 5 If 配列(カウントB) = サイコロ Then フラグ = フラグ + 1 End If Next カウントB Loop While フラグ > 0 '条件変更 配列(カウントA) = サイコロ Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub '全ての順番が等確率で出るとは思うけどちょっと自信ない。

その他の回答 (4)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.5

次のような簡単な方法もあります。 Sub rndsys() Dim 配列(5) As Integer Dim サイコロ As Integer Dim カウントA As Integer Dim カウントB As Integer For カウントA = 0 To 5 配列(カウントA) = カウントA + 1 Next カウントA For カウントA = 0 To 5 カウントB = カウントA + Int(Rnd() * (6 - カウントA)) サイコロ = 配列(カウントA) 配列(カウントA) = 配列(カウントB) 配列(カウントB) = サイコロ Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.4

Sub rndsys() Dim 配列(5) As Integer Dim サイコロ(6) As Integer Dim カウントA As Integer Dim カウントB As Integer For カウントA = 1 To 6 サイコロ(カウントA) = カウントA Next カウントA For カウントA = 6 To 1 Step -1 サイコロ(0) = Int(Rnd() * カウントA) + 1 配列(6 - カウントA) = サイコロ(サイコロ(0)) For カウントB = サイコロ(0) To カウントA - 1 サイコロ(カウントB) = サイコロ(カウントB + 1) Next カウントB Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

重複排除のためにDictionaryオブジェクトを利用する方法です。 Sub Test()   Dim myDic As Object '変数宣言   Dim i As Integer, Dyce As Integer   Dim myAr(5)   Set myDic = CreateObject("Scripting.Dictionary") 'myDicを用意   Randomize   Do While i < 6     Dyce = Int(Rnd(1) * 6) + 1     If Not myDic.exists(Dyce) Then 'myDicになければ       myDic.Add Dyce, "" 'myDicに追加       myAr(i) = Dyce '配列に追加       i = i + 1 'カウント     End If   Loop   MsgBox Join(myAr(), vbCrLf), vbInformation, " ( ̄ー ̄)v"   Set myDic = Nothing End Sub

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

Randomize For カウントA = 0 To 5   Do     サイコロ = Int(Rnd() * 6) + 1     If IsError(Application.Match(サイコロ, 配列, 0)) Then       配列(カウントA) = サイコロ       Exit Do     End If   Loop Next MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5)

関連するQ&A