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

Private Sub Clear()
With Worksheets("abc")
With .Range("A2", .Range("A" & Rows.Count).End(xlUp))
If .Row = 2 Then
.EntireRow.Resize(, 7).ClearContents
End If
End With
End With
End Sub

シートabcの、A2から最終行まで取得。
A2からA15までデータがあれば、それらの行のG列までクリア。
というコードですが、 If .Row = 2 Thenというのは、2行ならという意味ではないのですか?
1行でもデータがあればクリアにしてもらいたいのですが、 If .Row > 0 Thenみたいな感じにならないのでしょうか?

教えていただいたコードですが、この部分がわからないです。
ご教授くださいませ。

A 回答 (3件)

> With .Range("A2", .Range("A" & Rows.Count).End(xlUp))


データなしの場合の結果:RANGE("A2:A1")となり.Row =1
データ1行の場合の結果:RANGE("A2:A2")となり.Row =2
データ2行の場合の結果:RANGE("A2:A3")となり.Row =2
つまり1件でもデータがあれば.Rowは2,データなしで1となります。

この回答への補足

データが3行あれば.Row =3になりますか?
そうすれば、If .Row >1 Thenの気がするのですが、どうなんでしょうか?

補足日時:2010/12/20 23:45
    • good
    • 0

>If .Row = 2 Thenというのは、2行ならという意味ではないのですか?



ご質問のそのコードでは,一つ上の行のWithで指定されているセル範囲の『一番左上に位置するセル』の『行番号』を求めています。
つまり「何が」2行なら?という理解が抜けている様子ですね。(また言葉を丁寧にすれば「2行目なら」です)


例えばA65536からEnd(xlup)したセル(キーボード操作ではCtrl+↑でジャンプしたセル)が
1)A1だったら .rowは1 なので何もしない
2)A2だったら .rowは2 なのでその2行目をclearcontents
3)A3以下だったら .rowはやはり2 なので2行目以下をclearcontents
のように作動します。



>修正点はありますか?

修正すべき問題点があるようには見えませんでしたが,実際にあなたが使ってみて修正したい動作上不都合な点が何かあったのでしょうか。

敢えてご質問の不明瞭な点を含めて指摘するならば
>1行でもデータがあればクリアにしてもらいたい

「どこに」1行でもデータがあったらですか?
実は1行目にデータがあるだけでも,その1行目もクリアしたかったのでしたら,掲示されたマクロは確かにそのようには作動しませんので直すべきとなりますね。
    • good
    • 0

こういう中途半端なコードはいじりにくいのですが、いくつか問題点を指摘させていただきます。


・なぜ、Private キーワードを入れているか?
・なぜ、メソッド名をプロシージャ名にしているか?(クラスにするなら別)
Private Sub Clear()
基本的には、コーディング・ルールとして、してはいけません。
(コーディング・ルールを質問しておいて、自分で質問したコーディングルールなどないと、私に反論したヘンな人もいましたが、それを破ったところで、ただちにエラーになるわけではありません。ただ、エラーや不具合を誘発する可能性があるというだけです。もともと、VBAは素人の人が使うものだから、ないと言えばないのですが、やはり、常識的なものはあってよいと思います。ここの掲示板では、ルール無用で、エラーも出ます、というコードのほうがベストアンサーのようです。本は出ていましたが絶版になってしまいました。)

>1行でもデータがあればクリアにしてもらいたいのですが、 If .Row > 0 Thenみたいな感じにならないのでしょうか?

そう考えるのは当然ですし自然です。そういう人は、きちんとマクロが書けるようになります。
1行でもが、2行目からという意味だとは思いますが、先頭行が、A1の1行目になる時は除外というのは、変則的だから、コードからではすぐに読めません。

ロジックとしては、以下のほうが自然なはずです。

Sub ClearPr1()
'「タイトル行を除いて、データ行が1つでもあれば、データを削除する。」
 With Worksheets("abc")
  If .Cells(Rows.Count, 1).End(xlUp).Row > 1 Then
   .Range("A2", .Cells(Rows.Count, 1).End(xlUp)).Resize(, 7).ClearContents
  End If
 End With
End Sub

もし、タイトル行を5行目においておて、その下の6行目にデータがある場合に削除する場合にも同様に応用出来ます。

.Cells(Rows.Count, 1).End(xlUp).Row > 5 Then
.Range("A6", .Cells(Rows.Count, 1).End(xlUp)).Resize(, 7).ClearContents

1行目からデータがある場合は削除する、という条件なら、以下のようにするのも良いと思います。
なぜなら、.Cells(Rows.Count, 1).End(xlUp).Row > 0 というのがありませんから。

Sub ClearPr2()
'1行目からデータがある場合
 With Worksheets("abc")
  On Error Resume Next
  Intersect(.UsedRange, .Columns("A").Resize(, 7)).ClearContents
  On Error GoTo 0
 End With
End Sub
    • good
    • 0

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