データを色々弄っているうちに、セルとセルの間に歯抜けができてしまったとします。これを削除する方法のご紹介です。
基本的なやりかた

マクロなどで色々やってると、こういうデータができることが往々にしてあります。このデータ間の空白を削除するには、どのようにすればいいでしょう?

とりあえずFor Next文で上から順番に判定していくものとします。
セルが空白かどうかの判定はIf Range(“A” & ii).Value = “” Thenで可能です。
セルが空白かどうかの判定はIf Range(“A” & ii).Value = “” Thenで可能です。

さて、Aセル+iの数字で、該当セルをDelete(セルを削除して上に詰める)するとどうなるかというと……。

実はこのコードだと、空白がふたつ以上空いた場合に歯抜けが残ります。

なんでかというと、iが2の時にはA2セルを削除して上に詰めるということで、A2セルがあった場所にはA3セルのデータが移動し、iが3になった時チェックするのは元々A4セルにあったデータということになります。A3セルがチェックされません。

要するに空白のデータがあったセルを削除すると、

その下のセルがチェックされないという現象が起こります。なので歯抜けが残ります。
同じマクロを何回か実行すれば一応歯抜けは解消できますが、一回で処理したいところです。
同じマクロを何回か実行すれば一応歯抜けは解消できますが、一回で処理したいところです。

そこで、別にiiという変数を作ります。
iiは何もなければ変数iと同様に1ずつ増加しますが、
iiは何もなければ変数iと同様に1ずつ増加しますが、

もし空白のセルがあった場合は数字を増やしません。
Rangeがこのiiの行番号を参照すれば、上に移動してきたセルもチェックすることができます。
Rangeがこのiiの行番号を参照すれば、上に移動してきたセルもチェックすることができます。

ちなみに、iとiiの数字差はそのまま削除した空白セルの数になるので、

最後にi – iiを求めれば、いくつ空白のセルがあったかを表示することもできます。

コード的にはこうなります。elseの場合にのみ、iiの数字を1増やすようにしています。
' vba
Dim ii: ii = 1
For i = 1 To 12
' セルが空白か判定
If Range("A" & ii).Value = "" Then
Range("A" & ii).Delete
Else ' データがあったらiiの数字を増やす
ii = ii + 1
End If
Next

実行結果はこんな感じです。
もし連動して横のセルも削除したければ、Range(“A” & ii & “: C” & ii).Deleteのように範囲を広げます。
もし連動して横のセルも削除したければ、Range(“A” & ii & “: C” & ii).Deleteのように範囲を広げます。
空白が式かどうかを判定する
セルが空白かを判定
IsEmpty(引数)
IsEmpty(引数)

先ほどの式は、次のように書くこともできます。
' vba
Dim ii: ii = 1
For i = 1 To 12
' セルが空白か判定
If IsEmpty(Range("A" & ii).Value) Then
Range("A" & ii).Delete
Else
ii = ii + 1
End If
Next
IsEmpty(引数)
IsEmpty関数では、引数が何もないデータの時にTrue、そうでない時にFalseを返します。If文に使う時はIsEmpty(引数)Thenだけで、空白の場合の処理が記述できます。

上の式を実行すると、ちゃんと隙間が埋まりました。
一見””で判定する方法と同じものに見えますが……。
一見””で判定する方法と同じものに見えますが……。

式で空白を表示している場合にどうするか、という点が違います。
図ではA列に=If(C2=””,””,C2)と入力し、C列にある文字列をそのまま表示しています。
図ではA列に=If(C2=””,””,C2)と入力し、C列にある文字列をそのまま表示しています。

If Range(“A” & ii).Value = “” Thenの場合は、式が入力されていても、現時点で空白が表示されていれば「空白」と判定されます。
したがって数式も削除されます。
したがって数式も削除されます。

これに対しIsEmpty関数を使うと、式が入力されている場合は、現在空白が表示されていても「空白ではない」と判定します。
したがって数式は削除されません。
したがって数式は削除されません。
以上です。その他VBAで使える判定用の関数としては、IsDate(日付)、IsNumeric(数値)、Typename(データ型の判定)が用意されています。

Excel(エクセル):空白セル、行列
空白セル等にまつわる諸々の操作、関数まとめです。
空白セル、行列の操作
空白のセル、行、列、範囲を挿入する方法です。
行・列ごとに空白の行・列を挿入する方法です。
選択範囲中の空白行・セルを削除す...

関数・演算子・メソッド・プロパティ名から探すExcel/VBA(マクロ)使い方・組み合わせ方まとめ
こちらはExcelやメソッドの諸機能を、機能の名称から探せるまとめ記事です。
コメント