指定セル以下の行を全て削除する

指定セル以下の行全てを削除するコード、見出しを除外した範囲全てを消去する際に使用します

'2行目以降を削除
Range(Range("A2"), Range("A" & Cells.Rows.Count)).EntireRow.Delete

データ集計を行ったり、フィルタデータの貼り付けなどで元々あるデータは削除してデータを貼り付けする処理はよくあります
この際に見出し行は削除したくない場合があります
そんな場合に使用するコードです

このコードを使用すると2行目以降のすべてのセルを削除しますが、1行目はそのままなので見出しを再度作成したりする必要が無くなります

データ範囲のみを選択する場合は以下の記事で解説しています

ですがこの選択範囲はデータ行のみになるので、もし未保存の削除セルがあった場合LastCellなどでうまく最終セルが取得できない場合があったり、コピー元のセル範囲がそういったセルを作成してしまっていたりすることがあるので、なるべく例コードの様にデータ範囲を初期化する場合は全てのセル範囲を指定する方が無難です

コード解説

Range(Range("A2"), Range("A" & Cells.Rows.Count)).EntireRow.Delete

このコードは1行ステートメントですが、複数のプロパティを使用しているのでプロパティごとに分割して解説を行います

Range(Range("A2"), Range("A" & Cells.Rows.Count)).~~.~~

まず最初にRangeオブジェクトを指定しています
Rangeオブジェクトでは引数に2つのセル範囲を指定することが出来ます
引数を2つ指定した場合は、1つ目と2つ目のセル範囲を始点と終点として範囲取得します

~~(Range("A2"), ~~).~~.~~

1つ目のセル範囲がA2セルとなります
このセルが指定範囲の始点セルとなります

つまり、このセルの行数を変更することで見出しの行数に対応することが出来ます
A2をA3とすれば3行目以降のすべてを削除するコードになります

ちなみに、この後のプロパティで行自体を取得しているため、A2をB2などの別の列を指定しても問題はありませんが意味はありません
可読性が低下するだけです

~~(~~, Range("A" & Cells.Rows.Count)).~~.~~

2つめの引数にはワークシートの最下行のセルを指定しています
「Cells.Rows.Count」により最終行数値が取得されます
現在のExcelのシートであれば104万弱ですね
その数値にAを結合することで、A列の最下行セルが指定できます

結果としてこのRangeオブジェクトではA2~A1048576までの範囲選択をしていることになります

~~(~~, ~~).EntireRow.~~

ここでは上記で取得したセル範囲の行を範囲として取得しています
EntireRowプロパティを使用すると、指定されたセル範囲の行を取得します
なので、ここでA列といった制限が無くなり、すべての列を対象とする形になります

A2~A1048576というセル範囲が2~1048576という行数の範囲になります

~~(~~, ~~).~~.Delete

最後にDeleteメソッドを使用して、その範囲を削除します
上記までで指定行範囲を取得できているので、そこに対して削除を実行します

もし、この範囲を別のシートで参照している場合、関数やピボットテーブルなどの利用になりますが、その場合はセル参照がエラー値になってしまいます

その場合はDeleteメソッドではなくClearメソッドを使用することでセルの初期化を行うことが出来ます

なおブックのサイズにもよりますが、こういった削除処理を行った際は処理最後にでもブックの上書き保存を行っておいた方が良いです

なぜなら、削除したセル範囲のLastCellなどはそこでしか更新されないためです
またこれを行うことで、スクロールバーの可動域も新しいデータ範囲に調整されますので、あまりにも削除前とのデータ範囲に差がある場合にはユーザーにとっても意味のある保存と言えます

ただ保存はサーバー上であったり、ブックサイズが大きいと時間がかかってしまい
待ち時間がユーザーにとってのストレスになることもあることは認識しておきましょう