• ベストアンサー

Excelマクロ)フィルタをかけたコピーでエラー

Excelのマクロで、フィルタをかけた列のデータ値を別シートへコピー(貼付け)する マクロを作りました。 フィルタをかけて、データ値があれば問題ないのですが、 データ値がない場合、エラーがでます。(=マクロがストップします) どうしたら回避できるでしょうか?

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

たとえば、On Error GoTo line のような感じでエラーハンドラーに飛ばす。 Sub test01() On Error GoTo line 'フィルタをかけるコード On Error GoTo 0 '転記のコード Exit Sub line: MsgBox "データがありません。" End Sub あるいは On Error Resume Next でエラーを無視する。

nakamei
質問者

お礼

なるほどです! On Error Resume Nextで回避しました。 ありがとうございます!

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 >Sheets("メンバー").Select >Selection.AutoFilter Field:=10, Criteria1:="5"   ↑ これは、エラーが出ませんか? >データ数をカウントしたいのですが、 以下のように、SubTotal 関数を使うのが分かりやすいです。ただし、タイトル行(最上部)を含んでしまいますので、△1 引いてあげます。Subtotal(3,....), Subtotal(2, ....) かは、状況にもよりますが、今回は、3 のほうにしました。 '--------------------------------- Worksheets("メンバー").Select Range("A1").CurrentRegion.AutoFilter _     Field:=10, _     Criteria1:="5" Range("L2:L100").Copy 'AutoFilter で抽出したデータ行数を数える i = WorksheetFunction.Subtotal(3, ActiveSheet.AutoFilter.Range.Columns(1)) - 1 If i < =11 Then 'Else 側がデータ数が多いなら、i < 11 になると思います。   Sheets("カルテ").Range("J71").PasteSpecial Else   MsgBox "データ数が多い。" End If Application.CutCopyMode = False '-------------------------------- なお、 Criteria1:="5" の5 が変わっていく場合は、リストを作っておいて、それを、ループの中で、変数で代入していきます。

nakamei
質問者

お礼

ご回答、ありがとうございます。 できました☆

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 コードを見せられていないのでなんともいえませんから、回答はいろんな内容になるとは思います。実際に、"フィルタ"とは何を指しているのか分かりません。オートフィルタもあれば、フィルタオプションもあると思います。SubTotal 関数を使って判定する方法もあります。 例えば、AutoFilter なら、以下のようなコードを使います。 Sub Test1() Dim i Range("A1").AutoFilter Field:=1, Criteria1:="z"  With ActiveSheet.AutoFilter.Range   i = .Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count   If i > 1 Then    .Copy Worksheets("Sheet2").Range("A1")   End If  End With End Sub

nakamei
質問者

補足

コードを記載せず、すみません・・・ エラー処理はできたのですが、1つ教えていただいてよろしいでしょうか。 マクロを記録して作りました。 「メンバー」シートの該当項目にオートフィルタを順にかけ、 値をコピーし、「カルテ」シートに貼付けます。 その際、データ数をカウントしたいのですが、 どうすればよいでしょうか??? Sheets("メンバー").Select Selection.AutoFilter Field:=10, Criteria1:="5" Range("L2:L100").Select Application.CutCopyMode = False Selection.Copy If ???? > 11 Then   Sheets("カルテ").Select   Range("J71").Select  ActiveSheet.Paste Else   MsgBox "データ数が多い。" End If

  • FEX2053
  • ベストアンサー率37% (7991/21371)
回答No.1

プログラムコードの実物が無い以上、「回避できるコードを埋め込め」 としか言いようがありません。 よくやる手は、フィルタの処理が始まる前に、フィルタを掛けるテーブル の先頭レコードを見に行って、セルが空欄の時に処理を止めるというコード を書く、という方法ですが、VBA上のIF文などの使い方を知ってることが 前提になります。 逆に言えば、キー記録だけでマクロを作る場合、回避する手段はありません。 必ずダミーのデータを埋め込むように運用するか、エラーが出ても気にしない で使うかのどちらかになります。

関連するQ&A