Excel VBAでの検索と抽出方法の教えてください

このQ&Aのポイント
  • Excel VBAを使用して、シート1の生徒番号を元にシート2から成績を抽出する方法を教えてください。
  • シート1には生徒の生徒番号と氏名があり、シート2には生徒の成績があります。シート1の生徒番号とシート2の生徒番号を照合し、該当する成績をシート1にコピーしたいです。
  • お手数ですが、Excel VBAでの生徒の成績抽出方法を教えていただけませんか?
回答を見る
  • ベストアンサー

Excel VBA 検索して該当行を抽出

はじめまして、下記のように、Excelでマクロを組みたいのですが 組み方がわかりません。 ご教授願えませんでしょうか。 MS Ofiice2010 生徒数500名ほど シート1には生徒の生徒番号、氏名などがあります。      A     B     C     D 1 生徒番号   氏名   備考 2 120001     田中 3 120002     山田  試験時休み 4 T120009    相田   転入 シート2には生徒の成績表:生徒番号、氏名、国語、算数、理科、社会 生徒番号でソートされていません。      A     B     C     D     E     F    1 生徒番号   氏名   国語   算数   理科   社会   2 120001     田中   80    65     65     75 3 T120009    相田   90    85     80     80 シート1の生徒番号でシート2生徒番号を検索して、該当したら成績を シート1の検索した生徒番号のD列以降にコピーしたいのですが      A     B     C     D     E     F     G 1 生徒番号   氏名   備考   国語   算数   理科   社会 2 120001     田中         80    65     65     75 3 120002     山田  試験時休み 4 5 10 T120009    相田   転入    90    85     80     80 お手数ですが、ご教授願えますでしょうか。 よろしくお願いいたします。

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

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

こんばんは! 関数ではダメですか? Sheet1のD2セルに =IF(COUNTIF(Sheet2!$A:$A,$A2),VLOOKUP($A2,Sheet2!$A:$F,COLUMN(C1),0),"") という数式を入れオートフィルで列方向・行方向にコピー! これで大丈夫だと思いますが・・・ ※ どうしてもVBAでやりたい場合は、一例です。 Alt+F11キー → メニュー → 挿入 → 「標準モジュール」を選択 → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample1() 'この行から Dim i As Long, n As Long, c As Range, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") For i = 2 To wS1.Cells(Rows.Count, 1).End(xlUp).Row Set c = wS2.Columns(1).Find(what:=wS1.Cells(i, 1), LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then n = c.Row wS2.Cells(n, 3).Resize(1, 4).Copy wS1.Cells(i, 4) End If Next i End Sub 'この行まで こんな感じではどうでしょうか?m(_ _)m

yama0919
質問者

お礼

ありがとうございました。 参考にさせていただきました。

その他の回答 (4)

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.5

「教授する」などと言う程の大それた内容では決してないのですが、 せめて「教示」にくらいはなるかと思いますので、数点を。 参考)http://blogs.wankuma.com/jeanne/archive/2005/11/24/19566.aspx > Excelでマクロを組みたいのですが組み方がわかりません。 質問の主文はコレですね。 Alt+F11 でVBEが起動しますので、 やりたいこと(質問文中の処理)をコードに落として書いていけば組めます。 「EXCEL マクロ」で検索すると、 この辺りを解説したサイトがジャンジャン見つかります。 「やり忘れていた冬休みの宿題」と思って、勉強なさるとよろしいのでは?と思います。 子供たちは今日あたり必死になっていることでしょうしね。 ま、「この程度」で良ければ、VLOOKUP関数で十分です。 例えば、田中くんの国語(シート1のD2セル)には   =VLOOKUP(A2,シート2!$A:$F,3,FALSE) 田中くんの算数(シート1のE2セル)には   =VLOOKUP(A2,シート2!$A:$F,4,FALSE) 理科社会も同様に作って、下までコピーしてやると出来上がり。 シート2に該当生徒番号が無かったらエラーを返すので、 その考慮はIF関数でも使えばOKです。 どうしてもマクロを使いたい・・ と言うか、「マクロで作れ」とおっしゃるのであれば Sub Test() On Error Resume Next Sheets("シート1").Activate     For i = 2 To Sheets("シート1").Cells(Rows.Count, 1).End(xlUp).Row         For j = 1 To 4             Cells(j + 3, i) = WorksheetFunction.VLookup(Cells(1, i), Sheets("シート2").Range("A1").CurrentRegion, j + 2, False)         Next     Next End Sub こんな感じで提示しておきます。 ここから発展させるのも然程難しくはありません。 どちらにしても、VLOOKUP関数が便利ですよ。 解説は、みなさんが親切に教示くださっている通りです。

yama0919
質問者

お礼

ありがとうございました。 参考にさせていただきました。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

 確認したいのですが、御質問文中のコピー後の例において、A4:C5の範囲が空欄となっていますが、これは、元々その範囲内には何も入力されていなかっただけであり、 「Sheet2に存在しない行のデータは消去しなければならない」という訳ではないと考えても宜しいのでしょうか?  もし、そうであるのならば、次の様なマクロは如何でしょうか? Sub Macro () Dim lr As Long lr = Application.WorksheetFunction.Match("*?", Sheets("Sheet1").Columns("B:B"), -1) Sheets.Add After:=Sheets(Sheets.Count) With Sheets("Sheet1").Range("D1:G" & lr) .FormulaR1C1 = _ "=IF(ISERROR(1/(VLOOKUP(RC1,Sheet2!C1:C6,COLUMNS(Sheet2!C1:C[-1]),FALSE)<>"""")),"""",VLOOKUP(RC1,Sheet2!C1:C6,COLUMNS(Sheet2!C1:C[-1]),FALSE))" .Value = .Value End With End Sub

yama0919
質問者

お礼

ありがとうございました。 参考にさせていただきました。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

ちなみにまぁ私もわざわざマクロとか使わずとも、ふつーに関数だけでやっつけた方が遥かに簡単だと思います。 ただしご相談では説明が不十分ですが、「0点を取った」のと「一部科目を休んだので点数が記入されていない」のでは全然意味が違いますので、 シート1のD2: =IFERROR(IF(VLOOKUP($A2,Sheet2!$A:$F,COLUMN(C2),FALSE)="","",VLOOKUP($A2,Sheet2!$A:$F,COLUMN(C2),FALSE)),"") 右にコピー、下にコピー のように細かく計算してやる必要があります。 #逆に 例えば数学の試験の日に休んだので点数が無いのを単に0点としてしまっているのなら =IFERROR(VLOOKUP($A2,Sheet2!$A:$F,COLUMN(C2),FALSE),"") だけでいいです。

yama0919
質問者

お礼

ありがとうございました。 参考にさせていただきました。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

データタブの統合という機能で寄せ集めさせる事ができますが、敢えてマクロでやりたいなら sub macro1()  worksheets("Sheet1").select  range("D:G").clearcontents  range("A:A").copy range("D1")  range("D:D").consolidate sources:="Sheet2!C1:C6", function:=xlsum, toprow:=true,  leftcolumn:=true, createlinks:=false  range("D:E").delete shift:=xlshifttoleft end sub といった具合になります。 マクロを参考に(=マクロでやらせている通りに手を動かして)、統合の機能も手で操作して練習してみて下さい。

yama0919
質問者

お礼

ありがとうございました。 参考にさせていただきました。

関連するQ&A

  • エクセルでの集計・・・再度です

    お世話になります。 エクセルでの集計につきまして 思っていたよりも複雑でわからないため、 再度質問させていただきました。 内容 名前 教科名 順位  田中 国語  8 佐藤 算数  5 鈴木 理科  1 山田 国語  2 田中 算数  3 佐藤 算数  4 田中 国語  1 佐藤 理科  2 鈴木 算数  8 田中 理科  11 という感じで、名前・教科・順位の羅列が並んでいます。 同じ生徒がどの教科で、順位がどうであったかを集計したいのです。 ちなみに、もし可能ならば集計時に 1番、2番、3番、4番以下 という風にできればいいなと思っています。 ピポットテーブルを使用すると良いと お伺いしたのですが、この場合でも可能でしょうか? どうぞよろしくお願いします。

  • エクセル関数について

    エクセルで重複に関する質問です。 [元データ] A      B       C        会員番号 氏名     選択コース 1111   山田一郎  英語 1212   鈴木恵子  英語 1323   佐藤次郎  算数 1111   山田一郎  国語 1212   鈴木恵子  算数 1212   鈴木恵子  国語 という表があるとします。(実際のデータはもっとある) 山田さんは英語と国語の2コースを選択。 鈴木さんは英語と国語と算数の3コースを選択。 佐藤さんは算数だけを選択。 というわけです。 ここで、D列に、 A      B       C          D     会員番号 氏名      選択コース   総選択内容 1111   山田一郎   英語       英語・国語 1212   鈴木恵子   英語       英語・国語・算数 1323   佐藤次郎   算数       算数のみ 1111   山田一郎   国語       英語・国語 1212   鈴木恵子   算数       英語・算数・国語 1212   鈴木恵子   国語       英語・算数・国語 という表示をさせたいのですが、 どうすればいいでしょう? いろいろあると思うのですが、 作業させる人がPC操作が苦手なので、 元データを貼り付けただけで、 自動的にD列が表示されるようにしなければならないのです。 ピポットやマクロなどは使えないのです。 毎回私がやってあげられないので、 関数のみで、(勿論、隠しシートで関数を組み合わせることになると思いますが)、 あるいは、とにかく作業させる人が何もしないのに元データを貼り付けただけで、 D列が自動的に表示される、という状態にする方法があれば、どうか教えてください。 よろしく御願いします。

  • Excel 二つの表を用いたデータ整理

    かなり困っています。 (1)二つのエクセル表が存在 (2)ファイル1には↓のようにデータが並んでいます    A列  B列  C列  D列    生徒A 生徒B 生徒C 生徒D 行1 国語27 国語34 国語54 算数34 行2 数学36 家庭25 算数23 理科23 行3 理科55 理科44 理科21 英語44 行4 社会87 社会33 社会32 行5 英語54  (3)ファイル2は以下のようになっています    A列  B列  C列  D列  E列        国語  算数  理科  社会 行1 生徒A 27   36   55   87 行2 生徒B  (4)要するに、ファイル1のデータから必要な数値を抽出して ファイル2のデータに移し変えたいのですが、ファイルAの中の名称とデータ数が異なる場合があることもあり、整理はコピペしかないのかと半ばあきらめています。 とはいえデータの数は4000…正直なきたいです…何かいい方法はありませんか?

  • [vba]任意の順位でセルを抽出したい

    下記のデータがあるとします。これを理科の点数順位で上位x位まで新たに書き直したい。        (sheet1) A  B  C  D   E   F   G 1 ___  国語 算数 理科 社会 英語 2 たかし 75 67 47 96 77  3 ひろし 46 78 65 67 87 4 やすし 78 98 33 95 90 5 しおり 65 78 67 89 98 6 まなみ 88 56 78 98 76          ↓    (異なるシート:sheet2へ) A  B  C  D   E   F   G 1 ___  国語 算数 理科 社会 英語  2 まなみ 88 56 78 98 76   3 しおり 65 78 67 89 98 4 ひろし 46 78 65 67 87 'この場合、理科の点数上位3位までを抽出 Sub test11 () Dim a As Worksheet, b As Worksheet Dim c As Range Set a = Sheets("sheet1") Set b = Sheets("sheet2") Set c = a.Range("E2", "E6")  '理科の点数範囲 For x = 1 To 3  '上位3位まで WorksheetFunction.Large(r, x) この先、large関数やrank関数を使って組んでみようと試みましたが うまくいきませんでした。いい方法がありましたら教えてください。よろしくお願いします。

  • エクセル関数を使い、2つの条件にあった値を2つの条件にあったセルに返す。

    こんばんは。 いろいろとWEBで調べたのですが、よい方法が見当たりませんでしたのでとぴにより質問をさせて頂きます。 {シート1} A B C D 生徒ID 算数 国語 社会 A001 A002 A003 ... {シート2} A B C D 生徒ID 教科 点数 A001 算数 10 A001 国語 15 A001 社会 20 A002 算数 12 A002 国語 18 A002 社会 22 ... やりたいこと。 {シート1}の生徒A001の算数のセルに{シート2}の2つの条件(A001,算数)にあう点数を返したい。 できれば関数または関数の組合せで行いたい。 難しい場合、達成できる方法をお教え頂きたく存じます。 どうぞ宜しくお願い致します。

  • Excel VBA 検索してその合計数を抽出

    はじめまして、業務用で下記の用にExcel VBABasicでマクロを 組みたいのですが、組み方の方がわかりません。 是非、ご教授願えませんでしょうか。 Ms Oficeは2010です。 検索したいsheet1には ユーザの名前とGrp番号などがあります。      A        B     C     D     E     F     G 1 Username   Grp番号    2 yamada10x   Grp1             3 yamada4x    Grp1    4 yamada10x   Grp1 5 yamada10x   Grp1 6 yamada4x    Grp2 7 yamada10x   Grp2 8 yamada4x    Grp2 9 yamada10x   Grp3 . . 50 yamada4x    grp40 Sheet2にはyamada10xやyamada4xの合計数とGrp番号などがあります       A              B       C             D       E     F      1  yamada10xの合計数 Grp番号  yamada4xの合計数  Grp番号   2                  3  4 5 sheet1で検索したGrp番号などの合計数を下記の用にGrp番号にはGrp1などを抽出 そのGrp番号に合ったyamada10xやyamada4xの合計数などをsheet2に抽出させたいのですが       A              B       C             D       E     F      1  yamada10xの合計数 Grp番号  yamada4xの合計数  Grp番号   2     3             Grp1     1            Grp1 3     1             Grp2     2            Grp2 4     1             Grp3 . . 10                           1            Grp40 わかりにくい図で申し訳ございません。 お手数をおかけしますが、ご教授の方をお願いできますでしょうか。 よろしくお願い致します。

  • エクセルでこんな抽出は可能ですか?

    関数を使用して抽出したいと思います。 まずシート1とシート2を使います。 シート2には住所録などの内容が5000件くらいあるものとします。 その住所録には「〒」「住所」「電話番号」「氏名」などのフィールドを作っておきます。 そして、シート1には 例えば「氏名」という欄をA1に書き、B1の空白のセルに「山田」と入力をすると、「山田」が含まれるものをすべて表示したいと思います。 このすべて表示とういうのは「山田」を含む「氏名」だけ表示されるのではなく、「〒」「住所」「電話番号」「氏名」を表示したいのです。 オートフィルタやフィルタオプションは極力使用したくないので、関数で出来ないものかと考え中です。 また、抽出結果を表示する欄はシート1のA3あたりからお願いします。 こんな文書で意味が分かった方、よろしくお願いします

  • Excel 該当しない行を削りたい (関数)

    以下票の場合、Fを除いて一覧にしたいんですが、 どの様な関数にしたらいいでしょうか? 国語 A+ 数学 A 理科 F 社会 B ↓ 国語 A+ 数学 A 社会 B 以下関数までは探し当てたんですが、これだとA1に指定した科目のみになってしまいます。 =IF(COUNTIF(Sheet1!$C:$C,$A$1)>=ROW(B1),INDEX(Sheet1!B:B,LARGE(INDEX((Sheet1!$C$1:$C$500=$A$1)*ROW(Sheet1!$C$1:$C$500),),COUNTIF(Sheet1!$C:$C,$A$1)-ROW(B1)+1)),"")

  • アクセス クエリーの作成

    OS:98 Access Version:97 下記のようなレコードの抽出をしたいのですが、どのようにすれば できるのか教えてください。 <テーブル1> 顧客番号 氏名   学年 曜日 時間 科目 111111 田中一郎 中1 月  A1 国語 222222 鈴木太郎 中2 水  B3 算数 111111 田中一郎 中1 月  A2 理科 222222 鈴木太郎 中2 金  B3 社会 <クエリ1> 顧客番号 氏名   学年 曜日1 時間1 科目1 曜日2 時間2 科目2 111111 田中一郎   中1 月  A1  国語  月   A2 理科 222222 鈴木太郎   中2 水  B3  算数  金   B3 社会 このようにしたいのですが、お知恵をお貸し下さい

  • エクセルで該当者データを抽出してリスト化できず・・・悩んでいます

    いつもエクセルテクニックを学ぶために活用させていただいております。 今回はみなさまの過去の質問を見ても解決できなかったので、質問させていただきました。 ■使用しているデータ  営業スタッフ向けに顧客リストを作成しています。  私のほうで、全営業スタッフの担当する顧客名、業種、購入額の一覧を作りました。  【EXCELのシート1】  A列   B列   C列  D列   営業  顧客名  業種  購入額 1 山田  A社   食品   10万 2 山田  B社   食品   20万 3 山田  C社   医療   10万 4 田中  D社   食品   30万 5 田中  E社   小売   15万 ■作りたいもの  各営業スタッフが自分の名前を入力すると、自分の顧客の名前、業種、購入金額を検索でき、リスト化できる機能です。  具体的にいうと・・・  1)シート2のA1に自分の名前(例:山田)を入力  2)シート2のA3以下に担当顧客が表示される 【EXCEL シート2】   A列   B列   C列  D列 1 山田 2 3 山田  A社   食品   10万 4 山田  B社   食品   20万 5 山田  C社   医療   10万 私自身マクロに詳しくなく・・・大変困っております。 オートフィルタを使えばいいのですが、営業スタッフが エクセルに精通しておらず恐らく使いこなせないのです。 「A1に自分の名前を入力してください」と言うだけで リスト化できる機能についてどなたかご教授いただければ幸いです。  

専門家に質問してみよう