dポイントプレゼントキャンペーン実施中!

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

A 回答 (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
でエラーを無視する。
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/05/21 16:30

こんばんは。



>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 が変わっていく場合は、リストを作っておいて、それを、ループの中で、変数で代入していきます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/05/22 18:19

こんにちは。



コードを見せられていないのでなんともいえませんから、回答はいろんな内容になるとは思います。実際に、"フィルタ"とは何を指しているのか分かりません。オートフィルタもあれば、フィルタオプションもあると思います。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

補足日時:2008/05/21 17:19
    • good
    • 0

プログラムコードの実物が無い以上、「回避できるコードを埋め込め」


としか言いようがありません。

よくやる手は、フィルタの処理が始まる前に、フィルタを掛けるテーブル
の先頭レコードを見に行って、セルが空欄の時に処理を止めるというコード
を書く、という方法ですが、VBA上のIF文などの使い方を知ってることが
前提になります。

逆に言えば、キー記録だけでマクロを作る場合、回避する手段はありません。
必ずダミーのデータを埋め込むように運用するか、エラーが出ても気にしない
で使うかのどちらかになります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!