- ベストアンサー
シートabcのデータをクリアするコードの修正点
- シートabcのデータをクリアするコードについて修正点を教えてください。
- 私は、シートabcのデータをクリアするコードを使っていますが、修正点があるか知りたいです。
- シートabcのデータをクリアするコードについて、修正点を教えていただけないでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こういう中途半端なコードはいじりにくいのですが、いくつか問題点を指摘させていただきます。 ・なぜ、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
その他の回答 (2)
- keithin
- ベストアンサー率66% (5278/7941)
>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行目もクリアしたかったのでしたら,掲示されたマクロは確かにそのようには作動しませんので直すべきとなりますね。
- mshr1962
- ベストアンサー率39% (7417/18945)
> 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の気がするのですが、どうなんでしょうか?