• 締切済み

csvのデータを複数条件で値を抽出したい

A列~E列のようなCSVのデータがあり、行に回答者氏名、列に質問番号(Q1~Q3)としてH列~K列のようにそれぞれの質問の回答が表示されるような表を作りたいと思っています。 回答者は500名くらいあるためコピペでは時間がかかりすぎるので関数で出来ないかと試してみているのですが上手くいきません。 どのような関数を使用すれば良いでしょうか?

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

質問者は、どれぐらいの勉強し・経験者なのか書かないと、回答者が答えにくいのでは。 抜き出した後、そのデータをどう使う予定なのかも書かないと。 小生は回答を具体的に書く気はないが、視野を広げてもらう為に書いてみた。 表題(csvのデータを複数条件で値を抽出したい)だけからすると下記の方法がある。 しかしエクセルのシートを質問に掲示しているから、その旨を表題にもはっきり書くこと。 「エクセルのデータを条件をかけて抜き出す」という質問表現でよいのでは。 ・エクセルに読ませてエクセルで抽出する方法 エクセルを少しやれる程度なら、エクセルのシートにこのCSVファイルを読みこんで、、 そのエクセルのシートデータに対し条件を付けて抽出する方法 それには (1)操作のフィルタを使う方法 (2)関数だけでやる    (あ)作業列を使う方法    (い)作業列を使わない方法 この類の質問の回答には(2)の(あ)の回答がよく出るが、結構式が長く、その式の意味もわかりにくい。初心者なら(1)などの方法でどうか。 その中の(1)の(あ)の方法は、やややさしい。 (3)VBAを使う方法 考え方はすぐ思い付く簡単なこと。各行の特定の複数列の中身を、IF文で聞くことを全データ行で繰り返しするだけ。OR条件かAND条件か、がある。 フィルタの機能をVBAで使う手もある。 ・アクセスにこのCSVファイルをインポートして、アクセスの機能で抜き出す方法。 ・VBA、VBScriptの利用などになるが、直接CSV[ファイルをオ読んで  このデータ1レコードの中に、条件を満たすデータがあるかプログラムを組んで、街頭分を書き出すこともむつかしくはない。 上記はみなGoogleででも照会すれば具体的な方法は判る。 検索語 エクセル フィルタ 複数条件 エクセル 関数 抜出 複数条件 CSV VBA 抜出 もっとGoogleなどを検索して、読んで、やってみてそれから質問すべきです。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.3

「VBScript」でプログラムを組みましたので、「Windows」限定です。 以下のプログラムをメモ帳かテキストエディタに貼り付けて、「~.vbs」という名前で保存します(「~」の部分は何でもかまいませんが、「.vbs」は必ず半角でなければなりません)。 できた「~.vbs」ファイル(のアイコン)に目的の「~.csv」ファイルを1つだけドラッグ&ドロップすると、結果のエクセルファイルが表示されます。 あとは、そのエクセルファイルを「F12」(「名前を付けて保存」)で、保存するなり、処理を続けるなりしてください。 なお、注意事項としては、まず、ドラッグ&ドロップするファイルは1つだけ。 次に、必ず「csv」ファイルでなければなりません。 最後に行数はいくらあっても構いませんが、構造が質問者のサンプルと全く同じでなければなりません。 すなわち、1行目が項目行で、2行目以降は、3行ごとにおひとりのデータが書き込まれている、ということです。 必ず、おひとり3行なければなりません。 Option Explicit Dim a, b, c, d, i, u, v, w, x, y, z Set u = WScript.Arguments If u.Count = 0 then End If If u.Count <> 1 Then MsgBox("ファイルは1つだけです") WScript.Quit 10 End If If LCase(Right(u(0), 3)) <> "csv" Then MsgBox("csvファイルだけです") WScript.Quit 10 End If Set v = CreateObject("Scripting.FileSystemObject") Set w = CreateObject("Excel.Application") w.Visible = True Set x = w.Workbooks.Add() Set y = x.Worksheets(1) Set z = v.OpenTextFile(u(0), 1) a = 1 b = Split(z.ReadLine, ",") y.Cells(a, 1).Value = "氏名" y.Cells(a, 2).Value = "Q1" y.Cells(a, 3).Value = "Q2" y.Cells(a, 4).Value = "Q3" Do Until z.AtEndOfStream b = Split(z.ReadLine, ",") c = Split(z.ReadLine, ",") d = Split(z.ReadLine, ",") a = a + 1 y.Cells(a, 1).Value = b(0) y.Cells(a, 2).Value = b(4) y.Cells(a, 3).Value = c(4) y.Cells(a, 4).Value = d(4) Loop z.Close Set z = Nothing Set y = Nothing Set x = Nothing Set w = Nothing Set v = Nothing 簡単なプログラムの説明です。 Set u = WScript.Arguments If u.Count = 0 then End If この部分は、ある意味、ドラッグ&ドロップされるのを待っています。 If u.Count <> 1 Then MsgBox("ファイルは1つだけです") WScript.Quit 10 End If ファイルが複数あれば終了。 If LCase(Right(u(0), 3)) <> "csv" Then MsgBox("csvファイルだけです") WScript.Quit 10 End If 「csv」ファイル以外なら終了。 Set v = CreateObject("Scripting.FileSystemObject") ファイルやフォルダを扱えるようにしています。 Set w = CreateObject("Excel.Application") エクセルを扱えるようにしています。 w.Visible = True エクセルを表示しています。 Set x = w.Workbooks.Add() Set y = x.Worksheets(1) エクセルのファイルを新規作成し、1番左端のシートを「y」にセット。 Set z = v.OpenTextFile(u(0), 1) ドラッグ&ドロップされた「csv」ファイルを開いています。 a = 1 b = Split(z.ReadLine, ",") 1行目は項目行として読み飛ばしています。 y.Cells(a, 1).Value = "氏名" y.Cells(a, 2).Value = "Q1" y.Cells(a, 3).Value = "Q2" y.Cells(a, 4).Value = "Q3" 項目名をエクセルに記入しています。 Do Until z.AtEndOfStream b = Split(z.ReadLine, ",") c = Split(z.ReadLine, ",") d = Split(z.ReadLine, ",") a = a + 1 y.Cells(a, 1).Value = b(0) y.Cells(a, 2).Value = b(4) y.Cells(a, 3).Value = c(4) y.Cells(a, 4).Value = d(4) Loop 「csv」ファイルを3行ずつ読み込んで処理しています。 z.Close 「csv」ファイルを閉じ、あとは、終了処理です。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.2

こんにちは セルH2に、 =A2 セルH3に、 =IF(ROW(A1)>SUMPRODUCT(($A$2:$A$2000<>"")/COUNTIF($A$2:$A$2000,$A$2:$A$2000&""))-1,"",INDEX($A$2:$A$2000,MATCH(0,INDEX(0/ISERROR(MATCH($A$2:$A$2000,$H$2:H2,0)),),0))) で、セルH500位までフィルコピー セルI2に、 =IFERROR(INDEX($E:$E,MATCH(1,INDEX(($A:$A=$H2)*($D:$D=I$1),0),0)),"") で、セルI2をK2までフィルコピー セルI2:K2のフィルハンドルをダブルクリックし500行位までコピー CSVを開くExcelのバージョンは2007以降としています。

回答No.1

MATCH関数とINDEX関数を組み合わせて使うのがベターだと思われます。 関数の詳細は別途お調べください。 作業列を二つ使います。当方の図でいうとD列とE列。 まずD列には「氏名&質問」の列を作ります。 例えば、D2セルに   D2:=A2&B2 これを必要な範囲にコピー(フィル)しておきます。 E列の作業列は今回のご質問の本題とは外れますが、 元の表から「氏名が重複しないリスト」を表外に作るための作業列です。   E2:=IF(COUNTIF($A$2:A2,A2)=1,ROW(),"") として、これもまた必要な範囲にコピー(フィル)しておきます。 氏名が初めて出現する行に、行番号が入ります。 氏名が重複しないリストを作成します。 どうやら「氏名コード表」的なものがあるようですので、 ここはサラリと流しますので、読み飛ばしてくださってもOKです。   G2:=IF(COUNT(E:E)<ROW(A1),"",INDEX(A:A,SMALL(E:E,ROW(A1)))) として、下方少し多めにコピー・フィルしておきましょう。 作業列2(E列)が空白以外の行の氏名を抜き取ってリスト化されてきます。 さて、本題。 結論から言うと、   H2:INDEX($C$2:$C$10,MATCH($G2&H$1,$D$2:$D$10,0)) として、必要範囲にコピーしてやります。 MATCH関数で「作業列1(D列)から氏名&回答が合致する行」を取り、 INDEX関数で「行番号が合致する行のA列」を抜き取ってくる、 という仕組みです。 軽くややこしいのですが、覚えると便利な関数です。

関連するQ&A

  • 複数CSVファイルからデータ抽出

    CSVファイルのA列(行は問いません)の文字が転記シートのA列(行は問いません)と一致していたら、転記シートのA列が一致した行の空白に、左から順にCSVファイルのA列が一致した行のF列の値を書き込む。CSVファイルの1行A列を転記シートのF列の値を書き込んだ列の1行目に書き込む。 できれば、書き込んだ値はCSVファイルから消したいです。 コピペでやっていたのですが、ずれていてどうしようもなくなりました。 CSVファイル一つ当たり、4000行ほどあり、ファイルは200弱あります。 プログラムを組んでくださると、ありがたいのですが。 質問というよりお願いになってしまいますが、よろしくお願いします。

  • Powershellでcsvから列を抽出しcsv

    Windows10のPowershellについて教えてください。 コマンドライン上の1行で、CSVを入力して指定する複数の列を抽出し、CSVを作成したいです。行頭に列名はありません。 出力の際に、コンマ(,)は必要です。 例: 5列あるCSVから、2列目と4列目を抽出する 入力    ー>  出力 A,B,C,D,E     B,D F,G,H,J,K     G,J L,M,N,P,Q     M,P よろしくお願いします。

  • アクセス2003 複数の列に分かれたデータを1列にまとめたい

    例えば (A列)氏名/(B列)電話番号/(C列)携帯電話番号 というcsvデータがあり、これをアクセスに取り込んだときに (A列)氏名/(B列)電話番号or携帯電話番号 というように、2列のデータを1列にしたいのですが うまいやり方はないでしょうか? 元のデータをエクセル上でコピペすれば済むのですが 余計な手間はかけたくないので、よろしく御願いします。

  • エクセル 複数条件での抽出

    自社名簿(sheet1)と、系列会社の名簿(sheet2) A列:ID番号 B列:氏名 C列:所属グループ D列:支店 共に、同じ表です。  sheet1とsheet2を照らし合わせ、A~Dまでの情報が全て一致する(sheet2に重複してる)該当者のみに  sheet2のE列に★印が反映されるようにしたいのです。 条件が一つですと、沢山の簡易的な関数でわかりやすのですが、 複数の条件での方法が、他の質問者様の回答の説明をみてもしっくりきませんでした。 ご教授宜しくお願いします。

  • 複数個のcsvファイルから一気にデータを統合?

    初めて質問させていただきます。 毎日一定の書式が決まった形でデータを管理しております。(出勤簿).出勤者のみの氏名が表記される。 1.ファイル名(2005_1_1.csv)日付 2.シート1 3.列Aに通し番号(1.2・・・・)、列Bに氏名 社員名簿が一応あります。 1.A列に通し番号、B列に氏名(meibo.csv) この形で毎日記録をしておりましたので、データ(csv)ファイルがたくさんたまってしまいました。 そこで、このような複数のデ-タファイルを、社員名簿を元に、出勤日に●をつけるといったことをしたいと思っています。 一気に複数のファイルからデータを吸出し、統計を取ることは可能でしょうか? ちょっとデータの管理で困ってしまっていて、悩んでいます。 具体的な事例などをもしお教えいただけたら幸いです。

  • エクセルで、データのある行だけを抽出したい。

    エクセルのSheet1にデータが入っており、セルが空白でない行のデータのみを、Sheet2に抽出したいと思っています。 Sheet2にあらかじめ関数を入れておく方法にしたいため、関数について教えてください。 タイムテーブルで予定を管理するような表で、A~Hまでにデータが入っています。 予定を入れる際にはE列には必ず入力をするため、E列が空白でない行のみを抽出したいです。 A|B|C|D|E|F|G|H 月|日|時間|… 11|22|10:00|… 11|22|10:30|… 時間枠は10:00~17:00の30分刻みで、1日15行使用するので、1年で5475行まで使用します。 1行目はタイトル行なので、データは2行目から入力しています。 フィルタオプションで抽出する方法や、それをマクロで登録しておく方法は分かったのですが、あとから予定を追加することがあるため、マクロを実行する度にデータが置き換わると困ってしまいます。 また、抽出したSheet2のI列以降には備考などを入力したいため、やはり後から列がずれると困るため、A~H列に関数を入れておく方法で実行したいと思います。 よろしくお願いいたします。

  • <Excel>複数列を条件に別表から値を拾う方法

    教えてください。 図G-K列(下の表)のような標準値を与える表があります。 (実際は150行程度、順番は完全にランダムです) 別表で、図A-C列(上の表)のような「地質」「樹種」「年齢」が、 実測値で手入力されたデータがあります。 (1000行程度) この上表の各行に既存の3つの条件(「地質」「樹種」「年齢」)に対応した「生長量」「糖度」を、 標準値の表から拾ってきたい場合、どのような関数を指定すればよいでしょうか。 (たとえば、図だとD9には850、E9には4が入るようにしたい) VLOOKUP関数を試しましたが、複数の参照列がある場合は適当でないようでした。 やはりデータベース関数でしょうか? 浅学な質問で申し訳ありませんが、よろしくご教授ください。

  • EXCEL、複数の条件からデータを抽出

    EXCELを使って複数の条件からデータを抽出したいです。 条件は 利用した施設、開始時間、終了時間の3つから条件にあう金額を抽出したいです。 VLOOKUPでは一つの条件からでしか抽出が出来ないので困っています。 A列に利用した施設、G列に開始時間、H列に終了時間が並んでいます。K列に金額を抽出したいです。 それぞれの時間、施設ごとの料金表をつくってそこから抽出しようと思っています。使用出来る関数やそれ以外にもやり方などあればご教授頂ければと思います。宜しくお願い致します。

  • エクセル 複数条件で重複しないデータのカウント

    こんにちは。 EXCEL2013を使用して以下の関数をご教授ください。 データはデイリーで7000行(日により違います) ★1 A列(番号)は重複しないデータをカウントしたいです。 添付画像で重複しないものを1として数えると、18件です。 そこに条件で、E列(区分)が「1」でF列(支店)が「大阪」をカウントしたいです。 ★2 上記★1のK列(金額)の平均金額を出したいです。 それを別の表に抽出するので、関数をご教授頂けたらと思います。 ★3 C列(顧客)またはD列(顧客名)の総金額(K列(金額)を足した総合計)も 出したいです。これは重複するものも含みます。上位10件ほどを知りたい為。 ★4 ★3に一つ条件を追加でE列(区分)が「0」の時の金額(K列(金額)を足した総合計)も出したいです。これは重複するものも含みます。上位10件ほどを知りたい為。 ★5 ★4のC列(顧客CD)またはD列(顧客名)の全体の注文割合(注文率)も知りたいです。 お早めに回答頂けたら幸いです。 説明不足でありましたら、補足致します。 宜しくお願い致します。

  • EXCEL 複数条件で重複しないデータのカウント

    こんにちは。 EXCEL2013を使用して以下の関数をご教授ください。 データはデイリーで7000行(日により違います) ★1 A列(番号)は重複しないデータをカウントしたいです。 添付画像で重複しないものを1として数えると、18件です。 そこに条件で、E列(区分)が「1」でF列(支店)が「大阪」をカウントしたいです。 ★2 上記★1のK列(金額)の平均金額を出したいです。 それを別の表に抽出するので、関数をご教授頂けたらと思います。 ★3 C列(顧客)またはD列(顧客名)の総金額(K列(金額)を足した総合計)も 出したいです。これは重複するものも含みます。上位10件ほどを知りたい為。 ★4 ★3に一つ条件を追加でE列(区分)が「0」の時の金額(K列(金額)を足した総合計)も出したいです。これは重複するものも含みます。上位10件ほどを知りたい為。 ★5 ★4のC列(顧客CD)またはD列(顧客名)の全体の注文割合(注文率)も知りたいです。 明日の午前中までに資料を提出しないといけない為、 お早めに回答頂けたら幸いです。 説明不足でありましたら、補足致します。 宜しくお願い致します。

専門家に質問してみよう