• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:▲特定のセルからランダムに抽出しテストを作成▲)

エクセルのVBAで問題シートからランダムに問題とヒントを抽出する方法

このQ&Aのポイント
  • エクセルのVBAを使用して、特定のシートから問題とヒントをランダムに抽出する方法を教えてください。
  • 問題シート内のC3〜C17には問題が、D3〜D17には問題に付随したヒントが記載されています。
  • また、問題とヒントは初級、中級、上級の各シートに20問ずつ記載されています。特定の難易度から問題を抽出する方法も教えてください。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! 面白そうなのでトライしてみました。 Sheet6を作業用のSheetとして追加・使用するようにしていますので、 Book上にはお示しの5つのSheetが存在しているという前提です。 尚、各Sheetともお示しの配置通りとします。 ます「TOP」Sheetにコマンドボタンを挿入 → コマンドボタンのコードを↓にしてみてください。 Private Sub CommandButton1_Click() Worksheets("問題").Select Worksheets("問題").Range("E3:E17").Interior.ColorIndex = xlNone Call Sample1 End Sub 次にAlt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面に ↓のコードをコピー&ペーストしてください。 Sub Sample1() 'この行から Dim i As Long, lastRow As Long, c As Range Dim wS2 As Worksheet, wS3 As Worksheet, wS4 As Worksheet, wS5 As Worksheet, wS6 As Worksheet Set wS2 = Worksheets("問題") Set wS3 = Worksheets("初級") Set wS4 = Worksheets("中級") Set wS5 = Worksheets("上級") Application.ScreenUpdating = False If Worksheets.Count <> 6 Then Worksheets.Add after:=Worksheets(Worksheets.Count) End If Set wS6 = Worksheets(Worksheets.Count) wS6.Visible = xlSheetHidden wS6.Range("A:C").Clear wS2.Range("C3:E17").ClearContents With wS3 lastRow = .Cells(Rows.Count, "B").End(xlUp).Row .Range("E:F").Insert Range(.Cells(2, "E"), .Cells(lastRow, "E")).Formula = "=RAND()" Range(.Cells(2, "F"), .Cells(lastRow, "F")).Formula = "=RANK(E2,E:E)" For i = 1 To 10 Set c = .Range("F:F").Find(what:=i, LookIn:=xlValues, lookat:=xlWhole) c.Offset(, -4).Resize(, 3).Copy wS6.Activate ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues Next i .Range("E:F").Delete End With With wS4 .Range("E:F").Insert lastRow = .Cells(Rows.Count, "B").End(xlUp).Row Range(.Cells(2, "E"), .Cells(lastRow, "E")).Formula = "=RAND()" Range(.Cells(2, "F"), .Cells(lastRow, "F")).Formula = "=RANK(E2,E:E)" For i = 1 To 3 Set c = .Range("F:F").Find(what:=i, LookIn:=xlValues, lookat:=xlWhole) c.Offset(, -4).Resize(, 3).Copy wS6.Activate ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues Next i .Range("E:F").Delete End With With wS5 .Range("E:F").Insert lastRow = .Cells(Rows.Count, "B").End(xlUp).Row Range(.Cells(2, "E"), .Cells(lastRow, "E")).Formula = "=RAND()" Range(.Cells(2, "F"), .Cells(lastRow, "F")).Formula = "=RANK(E2,E:E)" For i = 1 To 2 Set c = .Range("F:F").Find(what:=i, LookIn:=xlValues, lookat:=xlWhole) c.Offset(, -4).Resize(, 3).Copy wS6.Activate ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues Next i .Range("E:F").Delete End With wS6.Range("A2:B16").Copy wS2.Activate ActiveSheet.Range("C3").Select Selection.PasteSpecial Paste:=xlPasteValues wS2.Columns.AutoFit wS2.Range("E3").Select Application.ScreenUpdating = True End Sub 'この行まで 最後に「問題」SheetのSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペースト → Excel画面に戻り「TOP」Sheetのコマンドボタンをクリックし 「問題」SheetのE列に答えを入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から Dim c As Range If Intersect(Target, Range("E3:E17")) Is Nothing Or Target.Count > 1 Then Exit Sub With Worksheets(6) If Target <> "" Then Set c = .Range("A:A").Find(what:=Target.Offset(, -2), LookIn:=xlValues, lookat:=xlWhole) If Target = c.Offset(, 2) Then Target.Interior.ColorIndex = 8 '←水色 Else Target.Interior.ColorIndex = 3 End If Else Target.Interior.ColorIndex = xlNone End If End With End Sub 'この行まで ※ 通常の青だと字が見えにくいので「水色」にしています。m(_ _)m

hideyuki-man
質問者

お礼

興味を持って頂き、また色々と試して頂いたことと思います。 本当にありがとう御座います。 VBAをやりたいと思い3日ほどでぶち当たりました。 さすがにこれだけのコードは理解することができません。 これを参考に勉強していきたいと思います。 本当にありがとう御座います。

その他の回答 (2)

noname#192382
noname#192382
回答No.3

次のマクロでしーと3,4,5から10,3,2問をシート2にランダム抽出します。まだ未完成のところは乱数がダブったときの処置ができていないことです。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2014/2/23 ユーザー名 : ' ' Dim ransu As Variant, i As Integer For i = 4 To 13 Sheets("Sheet3").Select ransu = Int(20 * Rnd + 3) Cells(ransu, 3).Select Selection.Copy Sheets("Sheet2").Select Cells(i, 3).Select ActiveSheet.Paste Next For i = 14 To 16 Sheets("Sheet4").Select ransu = Int(20 * Rnd + 3) Cells(ransu, 3).Select Selection.Copy Sheets("Sheet2").Select Cells(i, 3).Select ActiveSheet.Paste Next For i = 17 To 18 Sheets("Sheet5").Select ransu = Int(20 * Rnd + 3) Cells(ransu, 3).Select Selection.Copy Sheets("Sheet2").Select Cells(i, 3).Select ActiveSheet.Paste Next End Sub

  • nac03056
  • ベストアンサー率48% (203/419)
回答No.1

いろいろなやり方があるかと思うので、あくまで私流ということで。 面倒なので、問題番号1~10は初級、11~13が中級、14~15が上級と決めます。 事前準備として、初級・中級・上級のA2からA21までに計算式「 =rand() 」を入れておき乱数を表示させておきます。 シート1のスタートに、レコードマクロで記録開始。 初級のA2からD21を範囲選択しA列をキーにソートします。(昇順降順どちらでも可。ご存知とは思いますが、先頭行を見出しにしないよう注意してください。1行目が動かず固定になってしまいます) 同様に中級・上級も並べ替え。 これでレコードマクロを終了します。 問題シートの計算式ですが、セルC3に「 =初級!B2 」をD3に「 =初級!C2 」を入れてそれらを12行まで複写、同様にC13に「 =中級!B2 」をD3に「 =中級!C2 」を入れてそれらを15行まで複写、同様にC16に「 =上級!B2 」をD3に「 =上級!C2 」を入れてそれらを17行まで複写、これで問題作成は完成です。 採点に関しては条件付き書式が楽そうなので、あらかじめE3からE17の文字色を赤色にしておき、セル値と回答のセルの値が一致したら青色に変える指定を行えばできあがりです。(画像を比べると私のとはエクセルのバージョンが違うようなので、条件付き書式の扱い方がわからないようなら聞いて下さい) もし、問題を初級から並べるのではなくバラバラにということであれば、並べ替え後に初級~上級から問題シートに正解もコピーしておき、ソートでのシャッフルと同様にここで混ぜてあげれば可能です。 目の前で説明すれば10分程度の話なんですが、意味は伝わりましたでしょうか。 うまく動くことをお祈りいたします。

hideyuki-man
質問者

お礼

お答えありがとう御座いましたっ! 試してみたのですが、不明点が多く出来ませんでした。 No2さんのコードで上手くできました!ありがとう御座います。