プロが教えるわが家の防犯対策術!

マクロの記録から下記のマクロを作成しました。R列に該当データがある場合は正常に処理されますが、なかった場合、E2:M407、E448:M1035 の全データが削除されてしまいます。
R列にAC2のデータがなかった場合に処理を中止する方法を教えてください。

Sub Macro1()

Application.ScreenUpdating = False
  a = Range("AC2")
Range("E2:M407").Select
ActiveSheet.Range("$A$1:$Y$1666").AutoFilter Field:=18, Operator:= _
xlFilterValues, Criteria2:=Array(1, a)
Selection.ClearContents

ActiveSheet.Range("$A$1:$Y$1666").AutoFilter Field:=18

Range("E448:M1035").Select
ActiveSheet.Range("$A$1:$Y$1666").AutoFilter Field:=18, Operator:= _
xlFilterValues, Criteria2:=Array(1, a)
Selection.ClearContents

ActiveSheet.Range("$A$1:$Y$1666").AutoFilter Field:=18

Application.ScreenUpdating = True
End Sub

質問者からの補足コメント

  • tom04 様 回答ありがとうございます。
    A列には有効なデータがないためAをEに変えて試しましたが、やはり該当データがない場合は範囲内のすべてのデータが消えてしまいます。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/03/07 17:01

A 回答 (3件)

最初に、



Selection.SpecialCells(xlCellTypeVisible).ClearContents
で消えてしまうというのは、Excelのバージョンはいくつですか?

Excelのバージョンによって変わってしまうのかもしれません。

私には、どうもよく分からない点があります。
Criteria2:=Array(1, a)
Criteira の中は、基本的に、String 型だったと思うのです。今の状態だと、ヒットしないように思います。もしくは、最初から、文字列で入れるかどちらかだと思います。
たぶん、aも、数値ではないかと思います。

行を数えるのは、このように、Subtotal 関数を使うのが、手っ取り早いと思います。

----------------
Dim a As Variant
Application.ScreenUpdating = False
With ActiveSheet
 .AutoFilterMode = False
 a = Range("AC2").Value 'aが数字だったら、CStr関数を使う
 .Range("$A$1:$Y$1666").AutoFilter Field:=18, _
 Criteria1:=Array(CStr(1), CStr(a)), _
 Operator:=xlFilterValues

 If WorksheetFunction.Subtotal(3, .AutoFilter.Range.Columns(1)) > 1 Then
 '1 はタイトル行のことです。
  .Range("E2:M407").ClearContents
 End If
 .AutoFilterMode = False
 '----同じパターン----
 
 End With
 
'//
それと、私のところのExcel 2013では、Criteria1 がない場合も、エラーになります。

ヘルプにはこう書かれています。(Excel2013にはヘルプがありませんので、下位バージョンで調べました)
----------------------------
2 番目の抽出条件となる文字列を指定します。引数 Criteria1 および引数 Operator と組み合わせて使い、複合抽出条件を指定します。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
動作環境はWindows10,Excel2010です。
試させていただきましたが、R408~R447に処理されないデータがあるためか正常に処理されないようです。

お礼日時:2017/03/08 08:08

No.1です。



お手元の配置が判らないのですが・・・

>Selection.ClearContents


On Error Resume Next
Selection.SpecialCells(xlCellTypeVisible).ClearContents

としたらどうなりますか?m(_ _)m
    • good
    • 1
この回答へのお礼

頂きました回答通り修正したところ思い通りの動作を得ることができました。
有難うございました。

お礼日時:2017/03/08 08:10

こんにちは!



1行目が項目行でデータは2行目以降にあるのですね?

>Selection.ClearContents

If Cells(Rows.Count, "A").End(xlUp).Row > 1 Then
Selection.ClearContents
End If

としてみてはどうでしょうか?m(_ _)m
この回答への補足あり
    • good
    • 1

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A