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

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

▲特定のセルからランダムに抽出しテストを作成▲

いつもお世話になっております。 エクセルのVBAについて教えて頂きたく書き込みいたします。 日本語が意味不明であれば、より詳しく記載しますのでご教授願います。 1つのエクセルの中に4つのシートがあります。 【Top(sheet1)、問題(sheet2)、初級(sheet3)、中級(sheet4)、上級(sheet5)】 Topにはスタートボタンがあり、クリックすることにより問題シートへと移動し、別シートより問題を抽出したいです。 問題シート内のC3~C17に問題が、D3~D17に(問題に付随した)ヒントが ランダムに抽出されるようにマクロを作成したいです。 また問題、ヒント、答えは初級、中級、上級、それぞれのシートに(20問ずつぐらい)記載をしています。 初級から10問、中級から3問、上級から2問と抽出をしたいです。 答えに回答を入力することにより正解であればセルが青く、間違えであればセルが赤くなるようにしたいです。 簡易ではありますが、エクセルの画像も添付させてもらいます。 恐れ入りますがご教授願います。

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

  • ベストアンサー
  • 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さんのコードで上手くできました!ありがとう御座います。

関連するQ&A

  • 複数のExcelブックから特定シートの特定セル抽出

    同一フォルダ内にある複数のExcelブックから特定シートの特定セル値を抽出して一覧表にまとめるExcel マクロ(VBA)を教えてください。 よく似ている質問、回答を読んだのですが、私のレベルではとても応用できず質問させていただきます。 全く同じものがあれば、そのアドレスを回答いただくだけでも助かります。 【前提】 ・実行する端末のOSはWindows XP(SP3)、Excelは2003 ・対象フォルダはネットワーク接続フォルダ「\\share\target」  この中に、複数のExcelブックがあります。 ・抽出したい対象は、各ブック内の「概要」シートの「C3」セルで統一されています。 【抽出一覧作成イメージ】 ・「集約.xls」ブックの「Sheet1」の2行目から抽出した結果を一覧表示する。 ・表示はA列に抽出元ブック名(=ファイル名)、B列に抽出元C3セルの値。 ・C3セル値を「集約.xls」ブックの「Sheet1」に貼り付ける際には「値で貼り付ける」が望ましい。 というようなイメージです。 とても勝手なお願いではありますが、宜しくお願いいたします。

  • Excelにおけるデーター抽出

    Excelのシートに記載されている内容は次の通りです。 (1) セルA5~A60の間に1~56の昇順の番号 (2) セルB5~B60には氏名 (3) セルC5~C60には○、×、△の記号 このシートからC列が ○ の記号が付与されている者だけの氏名を別のシートのB7~B**の間に抽出するのですが、抽出したシートの行に空白ができないようにするには式をExcel関数で作成することは可能でしょうか? 若し、不可能でしたらマクロで行う場合のプログラムを教えて下さい。

  • エクセルで赤い字のセルを抽出

    表題どおりなのですが、エクセルでA行に5千個の項目があり、その中に赤い字で書かれたセルがあります。この赤い字で書かれたセルのみを別のシートに抽出したいのですが、VBAでも関数でも結構ですのでやり方のわかる方がいらっしゃいましたら、ご教授よろしくお願いいたします。

  • Excelで特定のセルを自動で抽出するには

    Excel2003を使用しており、マクロの知識は皆無です。 特定のセルを定期的に抽出し、別シートに貼り付けていくという動作を、マクロなどの方法で自動で行うことは可能でしょうか。 また、それが可能な場合、外部データを取り込んだセルでも可能でしょうか。 抽出したいセル100列以上あります。 それを、例えば1時間に1回の間隔でコピーし、別シートに貼り付け、時間ごとに次の行に追加されるようにしたいと考えております。 ソースコードを記載して頂けたら幸いですが、可否だけの回答でも構いません。 宜しくお願いします。

  • 異なるファイルのセル値を抽出する

    excel2010 異なるファイルのセル値を抽出する方法を教えてください。 下記に例を示します。 ファイル名:001.xlsm(ファイル名は、任意に変わります。どんなファイル名になるかは分かりません) シート名称:sheet1、sheet2…(複数あり不定です) 抽出したいセルには名前がついています。 sheet1のA4セルのセル名称が _nameAAA の様に。 ファイルによりセルの位置は変わるかもしれませんがセル名称は固定です。 001.xlsmのファイルに新規シート作成し、 あるセルに =_nameAAA とすると、sheet1のA4セルの値を表示してくれます。 抽出したいファイルが下記の様に複数あります。 001.xlsm,002.xlsm,003xlsm… 抽出したいセルの名前は固定で、下記の様にあります。 どのファイルにどのセル名称があるかは分かりません。 _nameAAA _nameAAB _nameAAC というセル名称があった時、 それぞれのファイルに新規シート作成して、セル名参照するのは手間なので、 以下の様にしたいです。 参照.xlsmというファイルを作成し、c:\workに登録します。 中身は sheet1の A1セルに=_nameAAA A2セルに=_nameAAB A3セルに=_nameAAC としておきます。 抽出したいファイルをc:\workにコピーし、参照.xlsmからマクロで セルの値を抽出して表示する様にしたいのです。 マクロ初心者なのでベタを教えていただきたく、よろしくお願いします。

  • 複数セルから特定の文字を検索して、その対象セルを抽出したい

    エクセルで関数、VBAを使用して、下記のようなDATA抽出を行ないたいのですが、どなたか、ご指導いただけないでしょうか。 たとえば、2種のシートが、各々、 <シート1>   列A   列B 行1 A1 ABCD-123 行2 B23 EFGH-456 行3 C456 あいうえお <シート2> 列A 列B 列C  列D  列E 行1 A1 A2 A3 行2 B23 C5 A4 行3 A5 B2 C456 ・・・・・・・となっている場合、 <シート2> の列D  行1 へ "A1"と入力(記載)がある場合、列Eに   ”ABCD-123”と表示(抽出)を行ないたい。 セルには、文字、数字、記号が入ります。 よろしくお願い致します。

  • 複数のエクセルブックから特定シートの特定セル抽出

    同一フォルダ内にある複数のExcelブックから特定シートの特定セル値を抽出して一覧表にまとめるExcel マクロ(VBA)を教えてください。 よく似ている質問、回答を読んだのですが、私のレベルではとても応用できず質問させていただきます。 【前提】 ・実行する端末のOSはWindows XP(SP3)、Excelは2003 ・対象フォルダはネットワーク接続フォルダ「\データ解析\データ」  この中に、複数のExcelブックがあります。 ・抽出したい対象は、各ブック内のシート(シート名はファイル名と同じ)の「BO6からBW16までの□の範囲」で統一されています。 【抽出一覧作成イメージ】 ・「集計.xls」ブックの「Sheet1」の2行目から抽出した結果を一覧表示する。 ・表示はA列に抽出元ブック名(=ファイル名)、B列に抽出元BO6セルの値。以降,C列・D列と 順に値を入れていきたい。 ・BO6~BW16までのセル値を「集計.xls」ブックの「Sheet1」に貼り付ける際には「値で貼り付ける」が望ましい。 というようなイメージです。 とても勝手なお願いではありますが、宜しくお願いいたします。

  • 複数ファイルから特定セルの抽出の仕方

    エクセル:マクロの初心者で自分なりに勉強しましたがなかなかうまくいきません。 今、しようとしている事は、1つフォルダがありその中に複数のファイルがあります。このそれぞれのファイルのシートの特定のセルのデータを抜き出して、別に新しくシートを作り、表にまとめたいと思っています。 条件は 1,フォルダ名「risuto」、そのフォルダの中の複数あるシート(300程あります)のタ  イトルはそれぞれ違いますがシートの様式は同じです。 2,そのファイルの「sheet1」のセルM5からO5を抽出したいです。ファイルは閉じたまま  でお願いします。 3,その抽出したデータを別のシートに表にしたいです。書き出しはどこでもOKです。 いろいろ調べた結果、一度名前がバラバラのファイルを何か読み取りやすい形に変えてから それぞれのファイルを見に行きセルを抽出する方法がいいのでは、と考えているのですが、 初心者なので本に載っているような基本のコードしか解らずそれをどの順番にどのように加工したらいいか解らず困っています。 それぞれのファイル、シートをアクティブにしてシート開きそのセルのデータを拾いにいき 新しいシートに貼り付けるという順番でいいでしょうか? かなり頭を悩ましています。 よろしくおねがいします。

  • EXCELで複数ファイルのセル抽出マクロ

    EXCELで複数ファイルのセル抽出マクロ いつもお世話になっております。 首題の件ですが、複数のEXCELファイル約100個があるフォルダに入っています。 フォーマットは統一されていますが、記載してあることは別です。 特定のセルの内容を抽出し、別のEXCELブックに保存したいと考えております。 例) パス-D:\集計\ ファイル名-統一されていません シート名-アンケート(統一している) 抽出したいセル-A1:A10とC10:C20(結合されているセルもあります) できれば保存するEXCELブックに抽出したA1の全集計結果をA1に、 抽出したC10の全集計結果をC10に保存したいのです。(1ファイルずつ改行を入れて) マクロを検索して調べてみたのですが、自分の環境に合わせてみるとうまく動かなく、 (単に私の勉強不足ですが・・・)お手上げ状態です。 皆様、宜しくお願いします。 また、厚かましく下記にも別件で質問をしております。 お力添え頂ければ幸いです。 http://okwave.jp/qa/q6170791.html

  • 複数のExcelブックから特定シートのセル範囲抽出

    同一フォルダ内にある複数のExcelブックから特定シートの特定セル範囲を抽出して一覧表にまとめるExcel マクロ(VBA)を教えてください。 このサイトで殆どよく似た回答を読んだのですがうまくいきません。VBA初心者です。 よろしくお願いします。 【前提】 ・実行する端末のOSはWindows 10 ExcelはOffice365 ProPlus ・対象フォルダはネットワーク接続フォルダ  この中に、複数のExcelブック(xlsx、xlsm)があります。 ・抽出したい対象は、各ブック内の「台帳」シートの「A3:Cの最終行」で  複数のブックの中には「台帳」シートが含まれていないブックも混在しています。 【抽出一覧作成イメージ】 ・「集約.xlsm」ブックの「集計」シートの2行目から抽出した結果を一覧表示する。 ・「集約.xlsm」ブックにマクロは登録する ・表示はA列に抽出元ブック名(=ファイル名)、B列からD列に抽出元「A3:Cの最終行」セルの値。 ・「A3:Cの最終行」セルの値を「集約.xlsm」ブックの「集計」に貼り付ける際には「値で貼り付ける」が望ましい。

専門家に質問してみよう