「エクセルで一行おきに行を削除するにはどうしたらいいのでしょうか?」
実務でExcelを使っている方からよくいただくご質問の一つです。
[Ctrl]キーを使って削除したい行を選択したり、データベース機能を使って一行おきに行を削除することもできますが、一行おきの行削除が頻繁に必要な場合、これらの操作では手間がかかって仕方ないということもあります。
こんなときにはVBA(Visual Basic for Applications)で、マクロを作ってしまいましょう。
いろんな仕様が考えられますが、実務で一行おきに行を削除したいという場合、セル範囲を選択しておいて実行したら、その選択範囲内で一行おきに削除するのが便利に感じます。
Dim i As Long
Dim col_a As Long
Dim col_z As Long
col_a = Selection(1).Column
col_z = Selection(Selection.Count).Column
For i = Selection(Selection.Count).Row _
To Selection(1).Row Step -2
Range(Cells(i, col_a), Cells(i, col_z)) _
.Delete xlShiftUp
Next i
上記のマクロは、選択範囲の一番下の行から、順番に一行おきに削除を行っていくマクロです。
例えば、
1:5行を選択した状態で実行すれば、5・3・1行目が削除されます。
1:6行を選択した状態で実行すれば、6・4・2行目が削除されます。
まず、
col_a = Selection(1).Column
で選択範囲の左端の列番号を変数・col_aに格納し
col_z = Selection(Selection.Count).Column
で選択範囲の右端の列番号を変数・col_zに格納しています。
ループ処理
For i = Selection(Selection.Count).Row _
To Selection(1).Row Step -2
の中で行を削除します。
ポイントは
Selection(Selection.Count).Row
と選択範囲の一番下の行から
To Selection(1).Row Step -2
と選択範囲の一番上の行に向かって-2ステップで処理していることです。
この手のループ処理を考えるときに、上から処理していくとロジックが複雑になってしまいがちですが、下から処理していくとシンプルなコードで済ませられるはずです。
Rangeプロパティは引数を2つとも指定したときに、そのセル範囲を返してきますから、変数・col_aとcol_zに格納した列番号と、カウンタ変数・iを行番号にしてRangeオブジェクトを取得し、
Range(Cells(i, col_a), Cells(i, col_z)) _
削除を行い、削除後は定数・xlShiftUpで上方向にシフトするよう指定しています。
.Delete xlShiftUp
一行おきに行を削除する作業がよくあるという方は、ご自身でしっかりとテストしてからお試しください。
Home » Excel VBA Rangeオブジェクト » 一行おきに行削除するExcelマクロ