- ベストアンサー
ExcelのVBAでの抽出
初心者です。よろしくお願いいたします。 sheet1の"A2"~"C6"に簡単な表を作りました。 A列に人の名前が入力されています。 そこで、A列の名前が"花子"のデータだけを抽出 してSheet2へコピーしたいのです。 そこで試行錯誤の上、下のような記述をしました。 Sub 抽出() Application.ScreenUpdating = False Sheets("sheet2").Activate Sheets("sheet2").Columns("A:C").Clear With Sheets("Sheet1") .Range("A2").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:="花子", CopyToRange:=Sheets("sheet1").Range("A2"), Unique:=False End With Application.ScreenUpdating = True End Sub しかし、うまくいきません(TT) エラー:400 とかでるんですけど なにがいけなんでしょうか・・。 他にもAdvancedFilterを使うさいに気をつけること がありましたらご指導ください。 (項目行の中のセルが統合されていたりすると うまくいかない・・・とかあるんでしょうか。) よろしくご指導ください。お願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
下のような表を想定しました。 フィルターを使うためにF1:F2に検索する項目名と検索する名前をセットします。 A B C D E F 1 名前 項目1 項目2 名前 2 太郎 100 150 花子 3 花子 200 250 4 次郎 300 350 5 花子 400 450 6 三郎 500 550 マクロを少し修正します。これで動くでしょう。 Sub 抽出() Application.ScreenUpdating = False Sheets("sheet2").Activate Sheets("sheet2").Columns("A:C").Clear With Sheets("Sheet1") '//+++++++++++++++++++++++++++++++++++++++++++++++++++++++ 'CriteriaRange:=.Range("F1:F2") に修正 'CopyToRange:=Sheets("sheet2").Range("A1") に修正 '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .Range("A2").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=.Range("F1:F2"), _ CopyToRange:=Sheets("sheet2").Range("A1"), Unique:=False End With Application.ScreenUpdating = True End Sub >他にもAdvancedFilterを使うさいに気をつけることがありましたらご指導ください。 オブジェクトブラウザのHELPなどをよく読むことが大事でしょう。 >(項目行の中のセルが統合されていたりするとうまくいかない・・・とかあるんでしょうか。) AdvancedFilter はデータベース的な使い方をするメソッドと思っているので、結合セルがあるデータで使ったことはありません。 動いたとしても、データの欠落がなく抽出ができたかは保証されないと思います。多分、2セルを結合した状態で行えば、片方はデータ無しとかになるでしょう。 結合については、列単位で結合したか、個別のセル単位で結合したかで結果が異なってくるでしょう。 ご参考に。
その他の回答 (2)
- ja7awu
- ベストアンサー率62% (292/464)
> 項目行の中のセルが統合されていたりするとうまくいかない・・・ 解決しましたでしょうか。 結合状態のままで別シートに行抽出するのであって、マクロで処理する場合は、 フィルタを使わない方が、いいのではないかと思います。 下記のマクロを実行すると結合状態は、そのままで書式ごと行抽出します。 宜しかったらテストしてみてください。 必要により、コードの「指定事項」を変更してください。 Sub 行結合対応データ抽出() '------- 指定事項 ---------------- Const 抽出元シート名 = "Sheet1" Const 抽出先シート名 = "Sheet2" Const 見出し行数 = 1 ' データより上部の行数指定 Const 検索列 = "A" Const 検索データ = "花子" '--------------------------------- Dim Rng As Range Dim Rw As Long Dim N As Long Application.ScreenUpdating = False Sheets(抽出先シート名).UsedRange.EntireRow.Delete Sheets(抽出元シート名).Select Set Rng = Range(検索列 & "1", Range(検索列 & "65536").End(xlUp)) Rw = 1 Range(検索列 & "1").Select Do Until Intersect(Selection, Rng) Is Nothing If ActiveCell.Row <= 見出し行数 Or ActiveCell.Value = 検索データ Then Selection.EntireRow.Copy _ Destination:=Sheets(抽出先シート名).Rows(Rw) Rw = Rw + Selection.Count End If ActiveCell.Offset(1).Select Loop Application.ScreenUpdating = True Set Rng = Nothing End Sub
お礼
ありがとうございます! とりあえずコピーさせていただいて 分析して理解していきます!ありがとう ございました!
- imogasi
- ベストアンサー率27% (4737/17069)
>CriteriaRange:="花子", ここがおかしいのではないでしょうか。 Rangeは「セル範囲」を指定する、であるはず。範囲に名前をつけたならともかく。 (テストデータ) A1:A6 氏名 太郎 花子 次郎 素直 五郎 (条件) D1:D2 氏名 花子 (VBA) Sub Macro2() Range("A1:A6").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "D1:D2"), CopyToRange:=Range("A9:A15"), Unique:=False End Sub でうまく行きましたが。 (結果) A9:A10 氏名 花子 (セル結合) A3:A4をセル結合して、値を花子として実行しましたがうまく行くようです。
お礼
ありがとうございます。 なぜか統合されている箇所がありそこを はずしたらうまくいきました! もう少し調べてみます、ありがとうございました!
お礼
なるほど、詳しく説明いただきありがとうございました!助かりました。