• ベストアンサー

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を使うさいに気をつけること がありましたらご指導ください。 (項目行の中のセルが統合されていたりすると うまくいかない・・・とかあるんでしょうか。) よろしくご指導ください。お願いいたします。

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

下のような表を想定しました。 フィルターを使うために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セルを結合した状態で行えば、片方はデータ無しとかになるでしょう。 結合については、列単位で結合したか、個別のセル単位で結合したかで結果が異なってくるでしょう。 ご参考に。

nekocya
質問者

お礼

なるほど、詳しく説明いただきありがとうございました!助かりました。

その他の回答 (2)

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.3

> 項目行の中のセルが統合されていたりするとうまくいかない・・・ 解決しましたでしょうか。 結合状態のままで別シートに行抽出するのであって、マクロで処理する場合は、 フィルタを使わない方が、いいのではないかと思います。 下記のマクロを実行すると結合状態は、そのままで書式ごと行抽出します。 宜しかったらテストしてみてください。 必要により、コードの「指定事項」を変更してください。 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

nekocya
質問者

お礼

ありがとうございます! とりあえずコピーさせていただいて 分析して理解していきます!ありがとう ございました!

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

>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をセル結合して、値を花子として実行しましたがうまく行くようです。

nekocya
質問者

お礼

ありがとうございます。 なぜか統合されている箇所がありそこを はずしたらうまくいきました! もう少し調べてみます、ありがとうございました!

関連するQ&A