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

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

VBA 乱数と配列

VBA 乱数と配列 配列(0)~配列(5)の一次元配列の中に、1から6までの数字を重複しないように入れたいのですが、 上手くいきません。 ご指導の程、お願いします。 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 サイコロ = Int(Rnd(1) * 6) + 1 For カウントB = 0 To 5 If 配列(カウントB) = サイコロ Then フラグ = フラグ + 1 End If Next カウントB Loop Until フラグ > 0 配列(カウントA) = サイコロ Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub

  • rezon
  • お礼率25% (10/39)

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

  • ベストアンサー
回答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

  • ※VBA配列

    http://oshiete1.goo.ne.jp/qa5196795.htmlで 質問させてもらった者です。質問不足だったため 質問の内容を追加したかったのですが、追加の方法がわからず またこちらで質問させていただきました Dim time1 As Integer, time As Integer Dim X As Integer, Y As Integer Dim X1 As Integer, Y1 As Integer Dim X2 As Integer, Y2 As Integer Dim maru As String, yoko As String, tate As String Dim sankaku As String, shikaku As String Sub 描画() Cells(Y2, X2).Value = shikaku Cells(Y1, X1).Value = sankaku Cells(Y, X).Value = maru End Sub Sub 削除() Cells(Y2, X2).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() X2 = X1 Y2 = Y1 X1 = X Y1 = Y If yoko = "右" Then X = X + 1 Else X = X - 1 End If If X = 30 Then yoko = "左" ElseIf X = 1 Then yoko = "右" End If If tate = "上" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 20 Then tate = "下" ElseIf Y = 1 Then tate = "上" End If End Sub Sub main() maru = "●" sankaku = "▲" shikaku = "■" X = 1 Y = 1 X1 = 1 Y1 = 1 X2 = 1 Y2 = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub a~tの文字が、上記のような動きをする プログラムを作成するにはどのように配列を活かせばいいですか? 配列がよくわかっておらず勉強したのですが…使えずにいます;;

  • ●Excel VBA 配列●教えて下さい

    a~tの文字が順々に文字を追っていくプログラムにしたいと思い 配列を使用したのですが…プログラムが稼動しません、 下記のプログラムでは何が足りないのでしょうか わかる方いたら教えて下さい; 配列の使い方についてアドバイスがあれば そちらも教えていただきたいです…。 '――ここから―― Dim time1 As Integer, time2 As Integer, n As String Dim X As Integer, Y As Integer Dim yoko As String, tate As String Dim suuji (19) As String Sub 描画() Cells(X, Y).Value = suuji End Sub Sub 削除() Cells(X, Y).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() If yoko = "右" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 30 Then yoko = "左" ElseIf Y = 1 Then yoko = "右" End If If tate = "上" Then X = X + 1 Else X = X - 1 End If If X = 20 Then tate = "下" ElseIf X = 1 Then tate = "上" End If End Sub Sub main() suuji (0) = a suuji (1) = b suuji (2) = c suuji (3) = d suuji (4) = e suuji (5) = f suuji (6) = g suuji (7) = h suuji (8) = i suuji (9) = j suuji (10) = k suuji (11) = l suuji (12) = m suuji (13) = n suuji (14) = o suuji (15) = p suuji (16) = q suuji (17) = r suuji (18) = s suuji (19) = t For n = 0 To 19 Cells(X,Y).Value = suuji (n) Next X = 1 Y = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub '――ここまでです―― 何度も同じような質問をさせてもらってすみません;

  • VBAで行列を作る方法

    次のようなプログラミングで1,0,-1の要素で作られる3×3行列を全通り調べています。 この場合3の9乗通り調べることができます。 これを4×4や5×5行列など数を大きくして調べたいのですが、このプログラムを配列を使うなどして 簡単にできる方法を教えてください。 よろしくおねがいします。 Sub test() Dim a As Integer '行 Dim b As Integer '列 Dim c As Integer, i As Integer, j As Integer, d As Integer, e As Integer Dim 内積 As Integer, step As Integer Dim f As Integer, g As Integer, h As Integer, l As Integer, m As Integer, n As Integer, k As Integer, x As Integer Dim sum As Integer, total As Integer Dim aa As Integer, aaa As Integer, aaaa As Integer, bb As Integer, bbb As Integer, bbbb As Integer a = 3 '行 b = 3 '列 c = 0 内積 = 0 con = 0 sum = 0 tatal = 0 aa = 0 aaa = 0 aaaa = 0 bb = 0 bbb = 0 bbbb = 0 x = 0 For n = 0 To 2 For m = 0 To 2 For l = 0 To 2 For k = 0 To 2 For h = 0 To 2 For g = 0 To 2 For f = 0 To 2 For e = 0 To 2 For d = 0 To 2 '要素がすべて1 For i = 1 To a For j = 1 To b Cells(i, j) = 1 Next j Next i If bbbb = 1 Then Cells(a - 2, b - 2) = 0 ElseIf bbbb = 2 Then Cells(a - 2, b - 2) = -1 End If If bbb = 1 Then Cells(a - 1, b - 2) = 0 ElseIf bbb = 2 Then Cells(a - 1, b - 2) = -1 End If If bb = 1 Then Cells(a, b - 2) = 0 ElseIf bb = 2 Then Cells(a, b - 2) = -1 End If If aaaa = 1 Then Cells(a - 2, b - 1) = 0 ElseIf aaaa = 2 Then Cells(a - 2, b - 1) = -1 End If If aaa = 1 Then Cells(a - 1, b - 1) = 0 ElseIf aaa = 2 Then Cells(a - 1, b - 1) = -1 End If If aa = 1 Then Cells(a, b - 1) = 0 ElseIf aa = 2 Then Cells(a, b - 1) = -1 End If If total = 1 Then Cells(a - 2, b) = 0 ElseIf total = 2 Then Cells(a - 2, b) = -1 End If If sum = 1 Then Cells(a - 1, b) = 0 ElseIf sum = 2 Then Cells(a - 1, b) = -1 End If If con = 1 Then Cells(a, b) = 0 ElseIf con = 2 Then Cells(a, b) = -1 End If con = con + 1 Next d con = 0 sum = sum + 1 Next e sum = 0 total = total + 1 Next f total = 0 aa = aa + 1 Next g aa= 0 aaa = aaa + 1 Next h aaa = 0 aaaa = aaaa + 1 Next k aaaa = 0 bb = bb + 1 Next l bb = 0 bbb = bbb + 1 Next m bbb = 0 bbbb = bbbb + 1 Next n End Sub

  • マインスイーパーもどき(VBA)

    ExcelのVBAでマインスイーパーもどきを作っていますが、どうも上手くいきません。9が地雷で0が何もないと言うことです。以下、ソースです。 Sub mine() Dim minefield(11, 13) As Integer Dim i As Integer, a As Integer, b As Integer, x As Integer x = 0 Randomize For i = 1 To 20 a = Int(Rnd * 10) + 1 b = Int(Rnd * 12) + 1 If minefield(a, b) = 9 Then x = x + 1 i = i - 1 End If minefield(a, b) = 9 Next i MsgBox "地雷が" & x & "回重複" countMine minefield, 10, 12 showInt minefield, 10, 12 show minefield, 10, 12 End Sub Sub show(f() As Integer, h As Integer, w As Integer)  Dim a As Integer, b As Integer For a = 1 To 10 For b = 1 To 12 If (f(a, b) = 9) Then CStr(f(a, b)) = "*" If (f(a, b) = 0) Then CStr(f(a, b)) = " " Next b Next a End Sub If (f(a, b) = 9) Then CStr(f(a, b)) = "*" If (f(a, b) = 0) Then CStr(f(a, b)) = " " の部分でコンパイル時に 「コンパイルエラー:修正候補 識別子」 とでます。ヘルプを見てもよくわかりませんでした。 テキストが長すぎるので途中は省きました。 よろしくお願いします。

  • エクセルマクロ配列で変数は使えますか

    エクセル2013です。 初めて配列を使います。 以下のように作成し思ったようにできました。 Sub 計算() '成功 Dim a As Integer Dim c As Integer Dim b(5) As Integer Dim 最終行 Dim 値列  値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To 5 b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub ただ計算する列の範囲をインプットボックスで入力した値 にしたい為以下のように改造しました。 Dim b(対象列) As Integerでエラーになります 配列には変数は使用できないのでしょうか? よろしくお願いします。 Sub 計算() '失敗 Dim a As Integer Dim c As Integer Dim b(対象列) As Integer’★ここでERRになる Dim 最終行 Dim 対象列 Dim 値列  対象列 = 22'インプットボックスで入力した値 値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To (対象列 - 17) b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub

  • 配列

    エクセルvbaなのですが Sub test() ' 配列 Dim arr() As Integer= {0, 1, 2, 3, 4, 5} ' 抜き出した要素を格納するための変数 Dim i As Integer ' すべての要素について繰り返す For Each i In arr Console.WriteLine (i) Next End Sub これって何でエラーになるのでしょう? Dim arr() As Integer= {0, 1, 2, 3, 4, 5} でエラーになりますが、なぜだかわかりません。

  • 動的配列が存在(要素が有る)か否かを判定できますか?

    VBAで、「For ループが初期化されていません」エラーが発生します。 動的配列が要素0の時に発生するようです。 動的配列の要素が生成された場合だけ、Forループしたいのですが、 どうやって判定すればよいのでしょうか? ------------------------------- Dim 配列() As Integer Dim i As Integer i = 0 If (i < 0) Then ' 本当は真になったり偽になったり ReDim 配列(0 To i) 配列(i) = a + b i = i + 1 End If '' if ★★★ then '' 配列が有るか確認 For Each c In 配列 MsgBox c Next '' end if -------------------------------

  • 擬似マインスイーパー

    任意の地雷を設置するというプログラムです。 この中で地雷を*に、安全地帯を空白にしたいのですがやり方がわからないので、わかる方お願いします。 Sub mine() Dim minefield(11, 13) As Integer Dim i As Integer, a As Integer, b As Integer Dim c As Integer c = InputBox("地雷の数を決めます") Randomize For i = 1 To c a = Int(Rnd * 10) + 1 b = Int(Rnd * 12) + 1 If minefield(a, b) = 9 Then i = i - 1 minefield(a, b) = 9 Next i countMine minefield, 10, 12 showInt minefield, 10, 12 ' show minefield, 10, 12 End Sub Sub countMine(f() As Integer, h As Integer, w As Integer) Dim i As Integer, j As Integer Dim a As Integer, b As Integer Dim x As Integer For a = 1 To 10 For b = 1 To 12 If f(a, b) < 9 Then x = 0 If f(a, b - 1) = 9 Then x = x + 1 '左に地雷があるか If f(a, b + 1) = 9 Then x = x + 1 '右に地雷があるか ' ... この部分に追加したいのだが ... f(a, b) = x End If Next b Next a End Sub Sub showInt(f() As Integer, h As Integer, w As Integer) Dim i As Integer Const a As Integer = 7 Const b As Integer = 3 Do While h > 0 For i = 1 To w Cells(a + h, b + i) = f(h, i) Next i h = h - 1 Loop End Sub

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

  • ■Excel VBA グローバルな書き方■

    Sub 跳ね返る() Dim time1 As Integer, time As Integer Dim X As Integer, Y As Integer Dim hyouji As String, yoko As String, tate As String hyouji = "●" X = 1 Y = 1 yoko = "右" tate = "上" Do Cells(X, Y).Value = hyouji '★ For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next Cells(X, Y).Value = hyouji For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next          '★ If yoko = "右" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 30 Then yoko = "左" ElseIf Y = 1 Then yoko = "右" End If If tate = "上" Then X = X + 1 Else X = X - 1 End If If X = 20 Then tate = "下" ElseIf X = 1 Then tate = "上" End If Loop End Sub ************************************ 上記のプログラムを Dim a() EndSub Dim b() EndSub Dim c() endSub Sub main() a b c EndSub のような、mainを動かせばabcも動く グローバルな(ローカルでもいいのですが) プログラムにするにはどうしたらいいですか? ★印から★印までの間の動作が同じような動作で 二つあるので、それを一つにまとめ 尚且つ、表示と時間稼ぎと表示削除の 3つの動作を分けた形にしたいです。 質問が下手で申し訳ありません…;;

専門家に質問してみよう