【VBA】空白を含む行を削除する

VBA_空白を含む行を削除する_1
表の所々に空白があります

上の画像で、

「空白が含まれる行は丸ごと削除したい」

そうした場合には
[ .SpecialCells(xlCellTypeBlanks) ] を使用してみましょう。
以下がサンプルコードになります。
 

広告

★サンプルコード★

Dim myRng As Range
  Set myRng = Range("A1").CurrentRegion
  myRng.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
VBA_空白を含む行を削除する_2
上のサンプルコードを実行すると、空白を含む行は削除されました。

 

[For Each]のループコードはうまく機能しない

[For Each]のループコードは
今回の場合ですと、うまく機能しません。

例えば、↓のサンプルコードは一見良さそうに見えますが、
実行してみると、空白を含む行が残ってしまいます。

Dim myRng As Range
For Each myRng In Range("A1").CurrentRegion
  If myRng.Value = "" Then
    myRng.EntireRow.Delete
  End If
Next

 

VBA_空白を含む行を削除する_3
サンプルコードを実行するも、空白を含む行が残ってしまう

 
これは以下の理由からです。

1.行を削除した後は、↑方向に詰められる事
2.[For Each]の構文で、Rangeを使用すると縦方向に処理を進める事

この2つ理由が重なり、
例えば、同じ列に2つ続けて空白があると、
下段の1行は削除されずに残ってしまうからです。

(※↑の例題で言えば、セル【C7~C8】・【D10~11】は続けて空白になっていて、[For Each]でRangeオブジェクトを使用すると処理される順番としては「A1→A2→A3→…B1→B2→B3→…C1→C2→C3…」と縦方向に進み、まずはC7を1行削除すると、元々のC8の空白は1行繰上になり、C7に移動し、「C7は既に処理済み」とみなされている為、空白が残ってしまう)

なので、この処理の場合は相性が悪く、
他の方法で行ごと削除すべきなのです。 

以上になります。

抱えている問題が解決出来たなら幸いです。

広告