• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:空白行を削除して上へ詰めたい)

Excel VBAで空白行を削除して上に詰める方法

このQ&Aのポイント
  • Excel VBAを使用して、指定の条件で空白行を削除し、上に詰める方法について教えてください。
  • 具体的には、1行目から10行目までの範囲で、1列目から256列目のすべての列に値が入っていない行を削除し、上に詰める処理を行いたいです。
  • 自分で試したコードでは、無限ループになってしまうため、正しい方法を教えていただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! Sub test3() Dim i As Long For i = 10 To 1 Step -1 If WorksheetFunction.CountA(Rows(i)) = 0 Then Rows(i).Delete End If Next i End Sub こんな感じではどうでしょうか? ※ 一般的に挿入・削除の場合は最終行(最終列)からLoopさせた方が良いと思います。m(_ _)m

weuari3
質問者

お礼

下から上に行った方が簡単だしわかりやすいですね。 うまく出来ました。ありがとうございました。

その他の回答 (2)

回答No.3

Sub test1() Dim i, gyou As Long For gyou = 1 To 10 '最終行 i = WorksheetFunction.CountA(Rows(gyou)) If i = 0 Then Rows(gyou).Delete gyou = gyou - 1 '削除すると行がずれる End If Next End Sub gyou = gyou - 1・・・これが原因です。 絶対に10になりません。Forループ抜けられなくなります。 以下で出来ます。 Sub test1() Dim i, gyou As Long For gyou = 1 To 10 '最終行 i = WorksheetFunction.CountA(Rows(gyou)) If i = 0 Then Rows(gyou).Delete End If Next End Sub

weuari3
質問者

お礼

ご回答ありがとうございます。 Sub test1() Dim i, gyou As Long For gyou = 1 To 10 '最終行 i = WorksheetFunction.CountA(Rows(gyou)) If i = 0 Then Rows(gyou).Delete End If Next End Sub だと、 例えば8行目と9行目が連続して空白の場合、9行目は削除されなくなってしまわないでしょうか?

  • unacyo
  • ベストアンサー率51% (35/68)
回答No.2

test1()は、削除対象行が見つかった場合、削除後gyou-1をしていますが、forによって+1されます。 これが、10行以内に何もない行を見つけてしまうと、gyou-1、forで+1、となりおなじ行のチェックを無限に行います。 test2()は、削除対象行が見つかった場合、削除のみ行ってgyouを更新しません。 10行以内にこれが見つかると、削除のみ行うことになり、さらにすべて削除してしまった場合、以降何もデータが入っていませんから、 ずっと削除(i=0)が動き、gyouが更新されず、gyou<>10が永遠に満たされません。 削除することで行がずれて困る、というのであれば、別の方法として、先に調べるだけ調べてから、 まとめて削除するという手もありますよ。 Sub Macro1() Dim strRange As String, i, gyou As Long For gyou = 1 To 10 '最終行 i = WorksheetFunction.CountA(Rows(gyou)) If i = 0 Then 'ここで、削除対象の行を文字列に入れていく If strRange <> "" Then strRange = strRange + "," '行を区切るのはカンマで。 strRange = strRange + CStr(gyou) + ":" + CStr(gyou) '1つの行は、"行番号:行番号"で指定 End If Next gyou If strRange <> "" Then '削除対象がある(文字列が空でない)場合、まとめて選択して削除 Debug.Print strRange Range(strRange).Select Selection.Delete Shift:=xlUp '上方向につめる End If End Sub

weuari3
質問者

お礼

>test1()は、削除対象行が見つかった場合、削除後gyou-1をしていますが、forによって+1されます。 これが、10行以内に何もない行を見つけてしまうと、gyou-1、forで+1、 となりおなじ行のチェックを無限に行います。 これが原因で無限ループに陥ってしまうのですね。 このような方法があるのですか。 全然思いつきませんでした。斬新なアイディアです。ありがとうございました。

関連するQ&A