- ベストアンサー
Excelマクロ)フィルタをかけたコピーでエラー
Excelのマクロで、フィルタをかけた列のデータ値を別シートへコピー(貼付け)する マクロを作りました。 フィルタをかけて、データ値があれば問題ないのですが、 データ値がない場合、エラーがでます。(=マクロがストップします) どうしたら回避できるでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
たとえば、On Error GoTo line のような感じでエラーハンドラーに飛ばす。 Sub test01() On Error GoTo line 'フィルタをかけるコード On Error GoTo 0 '転記のコード Exit Sub line: MsgBox "データがありません。" End Sub あるいは On Error Resume Next でエラーを無視する。
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >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 が変わっていく場合は、リストを作っておいて、それを、ループの中で、変数で代入していきます。
お礼
ご回答、ありがとうございます。 できました☆
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 コードを見せられていないのでなんともいえませんから、回答はいろんな内容になるとは思います。実際に、"フィルタ"とは何を指しているのか分かりません。オートフィルタもあれば、フィルタオプションもあると思います。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
補足
コードを記載せず、すみません・・・ エラー処理はできたのですが、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)
プログラムコードの実物が無い以上、「回避できるコードを埋め込め」 としか言いようがありません。 よくやる手は、フィルタの処理が始まる前に、フィルタを掛けるテーブル の先頭レコードを見に行って、セルが空欄の時に処理を止めるというコード を書く、という方法ですが、VBA上のIF文などの使い方を知ってることが 前提になります。 逆に言えば、キー記録だけでマクロを作る場合、回避する手段はありません。 必ずダミーのデータを埋め込むように運用するか、エラーが出ても気にしない で使うかのどちらかになります。
お礼
なるほどです! On Error Resume Nextで回避しました。 ありがとうございます!