プロが教える店舗&オフィスのセキュリティ対策術

希望動作
 範囲(行12~1299)内の列Aに空白(””)がある行を削除(行ごと削除し上に詰める)する。

作成したコード
 Sub 行の削除()
 Dim i As Integer
 For i = 12 To 1299
 If Sheets("sheet1").Cells(1,i).Value = "" Then
 Sheets("sheet1").Rows(i).Delete
 End If
 Next i
 End Sub

質問内容
 以上のコードで動作確認をしたところ、一部は削除出来ましたが列Aが空白の行が何行か残ってしまいました。
どうすれば列Aが空白の行全てを削除できるでしょうか?
また、行1299以降の行はいじりたくないデータなので一括削除ができればと思います。

教えて!goo グレード

A 回答 (6件)

すでに回答がある通り、ループして順次行を削除していく場合、削除が行われる度に行がズレていきますから、For i = 1299 To 12 Step -1 によって、最終行から順に削除する必要があります。



ただし、上記方法論では、行を1行ずつ削除する動作は大変オーバーヘッドがかかり、パフォーマンスが悪いです。

そこで、下記のように、削除対象となった行を認識後に一括して削除した方が速いです。
視覚的な操作として、Ctrlを押しながら行を複数選択してから一括して削除したものと同じになります。

あとは、処理中はScreenUpdatingを無効にして画面再描画を止めることでパフォーマンス改善が図れます。

Sub 行の削除()
Application.ScreenUpdating = False

Dim ws As Worksheet
Set ws = Sheets("sheet1")

Dim i As Integer
Dim DeleteRows As Range
For i = 12 To 1299
If ws.Cells(i, 1).Value = "" Then
If DeleteRows Is Nothing Then
Set DeleteRows = ws.Rows(i)
Else
Set DeleteRows = Union(DeleteRows, ws.Rows(i))
End If
End If
Next i

Call DeleteRows.Delete
Set ws = Nothing

Application.ScreenUpdating = True
End Sub
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご丁寧にコードまで書いていただいてありがとうございます。
参考にさせて頂きます。

お礼日時:2022/01/24 18:47

行削除すると、1行上に詰められる。


が、iはカウントアップしてるから、1行無視されている。

Sheets("sheet1").Rows(i).Deleteの後に
i=i-1
を追加する。

または、i=1299 to 2 step -1
とする。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
参考にさせて頂きます。

お礼日時:2022/01/24 18:46

No.2の者です。



Excel操作は、間違えですね。 すみません、無視して下さい。

あと、下記、多分間違えだと思います。 1とIが逆かと
If Sheets("sheet1").Cells(1,i).Value = "" Then

If Sheets("sheet1").Cells(i,1).Value = "" Then
    • good
    • 0
この回答へのお礼

ご丁寧に訂正をご指摘ありがとうございます。

お礼日時:2022/01/24 12:58

ええと


  A  B
1  〇 〇
2    〇
3    〇
4  〇 〇
5    〇
6  〇 〇
こんなのを上から順番に削除したとすると、
3行目の空白のセルは、2行目を削除したときに2行目に移動するので、削除の検査から外れることになる。
その結果、削除されずに残るという話。
    • good
    • 1
この回答へのお礼

分かりやすいご説明ありがとうございます。
コードだけだと理解しずらかったので助かります。

お礼日時:2022/01/24 12:33

おはようございます。



行を削除する際は、下から消すのが基本になります。
何故なら、行を削除すると、全体的に上に詰まるから。

For i = 12 To 1299

For i = 1299 To 12 Step -1


Excelですと、範囲選択して、Ctrl + G → セルを選択 → 空白セル → OK
右クリックで、削除でも、一括で削除可能だと思います。
    • good
    • 0

>For i = 12 To 1299



逆順で削除しないと。

For i = 1299 To 12 Step -1
    • good
    • 0
この回答へのお礼

そうなんですね
ご回答ありがとうございます。
これで修正いたします。

お礼日時:2022/01/24 12:31

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

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

教えて!goo グレード

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

人気Q&Aランキング