• 締切済み

Excelでランダムで選んだ行を別のシートに出力

excelで、ミニテストを作っているのですが、いままで作ったものをランダムでえらんだまとめテストを作ろうと思っています。毎回、手動で選んでいるのですが、何種類も作るのが大変なので、Excelで自動に作る方法を教えてください。 現在の形式は   l l テスト第1回 l なまえ l l 01 l 漢字 l 答え l l 02 l 漢字 l 答え l        ・        ・        ・ l 25 l 漢字 l 答え l l l テスト第2回 l なまえ l l 26 l 漢字 l 答え l l 27 l 漢字 l 答え l このように25個ずつテストを用意しています。 まとめテストはテスト第1回~第5回の中から25個選んで、別のシートに l l テスト第1~5回 l なまえ l l 05 l 漢字 l 答え l l 29 l 漢字 l 答え l l 34 l 漢字 l 答え l l 36 l 漢字 l 答え l のように選択した範囲内のものを25個出力できるようにしたいと思っています。 よろしくお願いします。

みんなの回答

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.5

#02です エラーが出た行は  IntRND = Int(MumMAX * Rnd) + 1 にしてみてください

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.4

#02です。お手数をかけます 私の環境 Xp+EXCEL2003では動作したのですが。 恐れ入りますがどのようなエラーメッセージが出たか教えていただけませんか

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

#02です。一番簡単そうな方法で説明します。 過去の問題が登録されているBOOKを開いて、ツール→マクロ→新しいマクロの記録 を選びます。「マクロの記録」といウィンドウはそのままOKでよいです。 次にツール→マクロ→記録終了 を選びます。これで(見えませんが)標準モジュールシートが作成されました。次にそのシートを表示させます。そのためには Alt+F11 を押下します。 すると 「Sub Macro1() ・・以下省略」のような、今記録したマクロが表示されているはずです。この1行目のSub Macro1()の上に#02のマクロ全文をペーストしてください。(Option Explicitが先頭行になるように) 元の問題文のシートに戻り、シート名を”過去問”に変更して、Alt+f8 を押下すると、実行可能なマクロのリストが表示されますから、その中から”問題作成”を選んで「実行」ボタンをクリックしてみてください。 なお#02のマクロは夜中に急いで作ったので、美しくありません(→言い訳です) A列の番号は途中の行が空白でも良いですが、最小値は1で抜け番がないことが前提となっていますのでお気をつけください。抜け番があると k = Application.Match(NO(l - 1), Worksheets("過去問").Range("A1:A2000"), 0) の行でエラーとなる場合があります。 過去問(第6回以降)を行の末尾に追加してもマクロは動作するはずです。

freebird11
質問者

補足

おっしゃる通りにやってみたところ IntRND = Int((Rnd(Now()) * 1062347) Mod NumMAX) + 1 の行でエラーが出たみたいです。 どうしたらいいでしょうか?

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

過去問のシート名を”過去問”とします。またA列は重複のない数字とします その前提で以下のマクロを実行してみてください Option Explicit Sub 問題作成() Dim i, j, k, l, NumMAX, IntRND As Integer Dim NO(25) Dim SHname As Worksheet i = 0 IntRND = Rnd(0) NumMAX = Application.Max(Worksheets("過去問").Range("A:A")) For Each SHname In Worksheets If SHname.Name = "新問題" Then i = 1 End If Next If i = 0 Then Worksheets.Add.Name = "新問題" Else Worksheets("新問題").Range("a1:C100").ClearContents End If Worksheets("新問題").Range("B1") = "問題1~5" Worksheets("新問題").Range("C1") = "なまえ" NO(1) = 0 j = 1 Do IntRND = Int((Rnd(Now()) * 1062347) Mod NumMAX) + 1 For i = 1 To j If NO(i) = IntRND Then i = 9999 End If Next i If i < 9999 Then NO(j) = IntRND j = j + 1 End If Loop Until j > 25 For l = 2 To 26 Worksheets("新問題").Cells(l, 1) = NO(l - 1) k = Application.Match(NO(l - 1), Worksheets("過去問").Range("A1:A2000"), 0) Worksheets("新問題").Cells(l, 2) = Worksheets("過去問").Cells(k, 2) Worksheets("新問題").Cells(l, 3) = Worksheets("過去問").Cells(k, 3) Next End Sub

freebird11
質問者

補足

すみません。Excelはほとんど素人なので、マクロとかが良く分かりません。詳しく分かるサイトまたはその方法を教えていただけないでしょうか?

  • hirumin
  • ベストアンサー率29% (705/2376)
回答No.1

どこか1列を使います。 そこに =RAND() と入れて、問題の行数分コピーします。 このRANDという関数は、再計算([F9]キー)する度に毎回違った数(乱数)を出力するものです。 再計算した後、この関数を入れた列で並び替え([データ]→[並べ替え])をすれば、順序がランダムで並び変わります。 並べ替えの結果、上位25問を、まとめテストにするというのはいかがでしょうか?