- ベストアンサー
Excelで行の抽出方法
- Excelの特定の条件に基づいて行を抽出する方法を紹介します。
- 具体的には、指定したコードと一致する行を別のシートに表示する方法です。
- この方法は計算式やマクロを使用して実現することができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
マクロでの回答が出ている様ですので、関数のみで行う方法を紹介します 【考え方】 1)Sheet1の最左端に作業用の列を1つ設けます 2)作業用列に、Sheet2のA1と同じ値がE列(質問例示のD列:コード)が 同じであれば、E列にその行まで出てきたコードの数をセットします ==>Sheet2A1と同じコードのデータのみ 1・2・3・4・・と連番がセットされます 3)あとは、Sheet1上で連番を元にVLOOKUP関数で参照します 【設定手順】 1)Sheet1のA列名を右クリックして"挿入"を選択し、作業列を挿入 2)Sheet1のA2セルに以下の式を入力してA3~Anにコピーします =IF(E2="","",IF(E2=Sheet2!$A$1,COUNTIF($E$2:E2,E2),"")) ・E2(コード)が空白の時は空白をセット ・E2がSheet1のA1と同じであれば、E2から現在行のE列までの E2と同じコードの数をセットします ・コードが異なる場合は空白をセットします 3)Sheet2のA3セルに以下の式を入力してA3~Dnにコピーします =IF(ISNA(VLOOKUP(ROW()-2,Sheet1!$A:$E,COLUMN()+1,FALSE)),"",VLOOKUP(ROW()-2,Sheet1!$A:$E,COLUMN()+1,FALSE)) ・VLOOKUPで検索がエラーになった場合空白をセットする為に ISNA関数でVLOOKUPを試行してチェックします ・エラーでない時改めてVLOOKUPで検索し値をセットします VLOOKUP(検索値,検索範囲,参照列,検索の型) ●検索値:ROW()-2 現在行番号から表示行まで行数を減算し 1・2・3・・・と変化させます ●検索範囲:Sheet1!$A:$E (絶対参照でA~E列とします) ●参照列:COLUMN()+1 Sheet2のA列に検索範囲の2列目 Sheet2のB列に検索範囲の3列目・・と表示するので 現在列番号-1とする事で列に対応した値を参照します ●検索の型:FALSE 同一検索値のみとします *****以上でご質問の表示が可能になります****** AnやDnとあるセルは、入力が予想される行数より多めにセットしても 式内でデータの有無を判断していますので、問題有りません。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
エクセルのシートに下記Aのデータをテスト的に作りました。 そして下記VBAをModule1に入力し、実行しました。 するとBのように抽出できました。 ------------ Sub Test01() Range("A1:C10").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= Range("A12:C13"), Unique:=False, copytorange:=Range("a15") End Sub (1行の文字数制限で、改行が無理に行われている部分が 発生すると思いますが、ご注意下さい。) 見だしのコード1 コード2 コード3も含めてRange 指定してください。CriteriaRangeも同じように、 見だしのコード1 コード2 コード3も含めてRange 指定してください。 -----A----- コード1 コード2 コード3 a cc 1 s vv 2 d bb 3 g gg 1 h hh 1 j ee 4 u rr 5 I t 4 o uu 1 コード1 コード2 コード3 1 -----B------ コード1 コード2 コード3 a cc 1 g gg 1 h hh 1 o uu 1
お礼
ご回答ありがとうございました。 同じ結果を得るにも色々な方法があるんですね。とても勉強になります。
- nishi6
- ベストアンサー率67% (869/1280)
Sheet2のA1に数値を入力してマクロ『抽出』を実行します。 ツール→マクロ→Visual Basic Editor でVBE画面に移り、挿入→標準モジュールで標準モジュールを挿入し下記コードを貼り付けます。 シートは、Sheet1、Sheet2として、転記する範囲も質問通りです。 また、マクロを実行する前に、シート2は初期化しています。(前の出力を消去) ご参考に。 Sub 抽出() Dim ws1 As Worksheet 'シート1 Dim ws2 As Worksheet 'シート2 Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") Dim kijyun As Long 'シート2のA1の値 kijyun = ws2.Range("A1").Value 'シート2をきれいにする With ws2 .Cells.ClearContents 'シート2をクリアする .Range("A1") = kijyun 'A1を書き直し .Range("A2:D2").Value = ws1.Range("A1:D1").Value '表題を転記 End With Dim rw1 As Long 'シート1の行カウンタ Dim rw2 As Long 'シート2の行カウンタ rw1 = 2: rw2 = 3 With ws1 '照合しながら転記する While .Cells(rw1, 4) <> "" If .Cells(rw1, 4).Value = kijyun Then ws2.Range("A" & rw2 & ":D" & rw2).Value = .Range("A" & rw1 & ":D" & rw1).Value '値を転記 rw2 = rw2 + 1 End If rw1 = rw1 + 1 Wend End With End Sub
お礼
ご回答ありがとうございました。 とても勉強になりました。マクロが使いこなせるとエクセルでもいろんなことができそうですね。
お礼
ご回答ありがとうございました。 マクロを使わなくてもできるんですね!(正直なところマクロを使わないと無理かな・・・と思っていましたので) わたしにはこのような方法は思いもつきませんでした。 この方法を採用させて頂こうと思います。本当にありがとうございました。