- ベストアンサー
Excel VBAで空白行を削除して上に詰める方法
- Excel VBAを使用して、指定の条件で空白行を削除し、上に詰める方法について教えてください。
- 具体的には、1行目から10行目までの範囲で、1列目から256列目のすべての列に値が入っていない行を削除し、上に詰める処理を行いたいです。
- 自分で試したコードでは、無限ループになってしまうため、正しい方法を教えていただきたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは! 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
その他の回答 (2)
- toshi_2010
- ベストアンサー率43% (25/57)
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
お礼
ご回答ありがとうございます。 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)
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
お礼
>test1()は、削除対象行が見つかった場合、削除後gyou-1をしていますが、forによって+1されます。 これが、10行以内に何もない行を見つけてしまうと、gyou-1、forで+1、 となりおなじ行のチェックを無限に行います。 これが原因で無限ループに陥ってしまうのですね。 このような方法があるのですか。 全然思いつきませんでした。斬新なアイディアです。ありがとうございました。
お礼
下から上に行った方が簡単だしわかりやすいですね。 うまく出来ました。ありがとうございました。