質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

4835閲覧

Excel VBAで重複なしのランダムな数字が欲しい

A111

総合スコア13

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2020/10/04 10:46

編集2020/10/04 11:57

実現したいこと

ExcelのVBAでランダムな数字はできたものの一度出した数字は2回目以降使わない方法がわからないでいます.
参考にしたのは

https://hayashi-rin.net/post-416

です.この

‘ ランダムで呼び出すデータナンバーを決定する Randomize num = Int(Rnd() * cnt) + 2

を変更する必要があると分かったのですが具体的にどの様にしたら良いかお教えいただけると幸いです.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ロジカルな方法はあるのですが、私の場合この様にします。

VBA

1Sub RdnTest() 2 3 Dim RdnNo() As Integer 'ランダム値が入っている配列 4 Dim RdnIndex As Integer '配列の位置 5 Dim RdnValue As Integer '取得したランダム値 6 Dim index As Integer '繰り返しテスト用 7 8 9 ReDim RdnNo(0 To 4) 10 RdnNo(0) = 1 11 RdnNo(1) = 2 12 RdnNo(2) = 3 13 RdnNo(3) = 4 14 RdnNo(4) = 5 15 16 For index = 0 To 3 'この繰り返しはテスト用 17 18 'Int((最大値-最小値+1)* Rnd + 最小値) 19 RdnIndex = Int((UBound(RdnNo) - LBound(RdnNo) + 1) * Rnd + LBound(RdnNo)) 20 '配列からランダムに抽出 21 RdnValue = RdnNo(RdnIndex) 22 Debug.Print "ランダムな数字:" & RdnValue 23 '取得した後配列の最後の値で上書き 24 RdnNo(RdnIndex) = RdnNo(UBound(RdnNo)) 25 '配列を1減らす 26 ReDim Preserve RdnNo(UBound(RdnNo) - 1) 27 28 Next index 29 30End Sub

ランダム数の調整とロジックが簡単なので応用させやすいので好んで使っています。

投稿2020/10/04 11:15

kuma_kuma_

総合スコア2506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A111

2020/10/04 11:37

ご回答いただきありがとうございます アドバイスいただいた方法を参考にしてみたのですが嵌め込むことができませんでした ``` Sub questionen() Worksheets("AnswerEnglish").Cells(3, 2).Font.ColorIndex = 2 cnt = Worksheets("Question").Cells(2, 4) Randomize num = Int(Rnd() * cnt) + 2 Dim RdnNo() As Integer Dim RdnIndex As Integer Dim RdnValue As Integer Dim index As Integer ReDim RdnNo(0 To 4) RdnNo(0) = 1 RdnNo(1) = 2 RdnNo(2) = 3 RdnNo(3) = 4 RdnNo(4) = 5 For index = 0 To 3 RdnIndex = Int((UBound(num) - LBound(RdnNo(0)) + 1) * Rnd + LBound(RdnNo)) RdnValue = RdnNo(RdnIndex) Debug.Print "RandomNumber:" & RdnValue RdnNo(RdnIndex) = RdnNo(UBound(RdnNo)) ReDim Preserve RdnNo(UBound(RdnNo) - 1) Next index no = Worksheets("Question").Cells(index, 3) q = Worksheets("Question").Cells(index, 1) a = Worksheets("Question").Cells(index, 2) Worksheets("AnswerEnglish").Cells(2, 2) = q Worksheets("AnswerEnglish").Cells(3, 2) = a End Sub ``` 恐らくUBoundのあたりで間違っていると思うのですが使い方について詳しく教えていただけますと幸いです
kuma_kuma_

2020/10/04 11:49

いやこれ「こう書いたら重複しないでしょ」っていう事で 関数化してどう使うかは質問者様が解かないと。 (いくつからいくつまでの数値で何回まで重複を許さないかは質問者様が設定しないと) 関数化するならRdnNoをパブリック変数にして初期値設定用とランダム抽出用の2種類用意ってことぐらいで... というか一度動かしてみました?
A111

2020/10/04 12:06

動かしましたが用法が理解できなかったのでコメントさせていただきました。 まず,参考にしたリンクを貼った理由としましては当方が作成しようとしているものを提示することによりコードの修正等を具体的に簡単な形でご回答いただけやすくなると考え貼らさせていただいております。 したがって関数化などの作業が理解できていない当方ではそもそもその様な作業が必要であると認識できていないため詳細情報の提供をお願いした次第であります. この部分をご理解いただけますと幸いです. また,関数化等につきましては当方で調べ利用できるか試してみようと思います.
kuma_kuma_

2020/10/04 12:16

その参考先URLの言葉を借りるなら 「15行ぐらいで重複しないランダムな数値の取得を作った」 というのが現在の状態です。 メインは4行しかありませんから 利用用途によっては関数化の必要もありません。 処理が判らないのではないかとコメントも書いています。 ステップ実行という1行ずつ確認しながら実行する手段もVBAにはあります。 たった4行ですので頑張って理解して下さい。
guest

0

ベストアンサー

リンク先の「問題シート」のF2に下記の式を設定します。
=RAND()
フィルハンドルを問題の最後の行までドラッグします。

F列上で右クリック→並べ替え→昇順
でランダムに並べ替えられます(シャッフルされます。)

あとは、この状態で、上から順に問題、回答を読み込めばいいでしょう。

この処理をVBA化すればいいでしょう。

別案

配列をシャッフルする関数を下記で紹介しています。

配列をランダムに並べ替える関数 - hatena chips

問題のNOを格納した配列を作成しておいて、上記関数でシャッフルします。
あとは、配列のNOを順番に読み込んで出題すればOKです。

投稿2020/10/04 12:18

編集2020/10/04 12:26
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A111

2020/10/04 12:31

ご回答いただきありがとうございます 予め指定しておくというアイデアは思いつきませんでした ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問