データを色々弄っているうちに、セルとセルの間に歯抜けができてしまったとします。これを削除する方法のご紹介です。
基本的なやりかた
![isempty1](https://sunagitsune.com/wp-content/uploads/2020/05/isempty1.jpg)
マクロなどで色々やってると、こういうデータができることが往々にしてあります。このデータ間の空白を削除するには、どのようにすればいいでしょう?
![isempty2](https://sunagitsune.com/wp-content/uploads/2020/05/isempty2.jpg)
とりあえずFor Next文で上から順番に判定していくものとします。
セルが空白かどうかの判定はIf Range(“A” & ii).Value = “” Thenで可能です。
セルが空白かどうかの判定はIf Range(“A” & ii).Value = “” Thenで可能です。
![isempty3](https://sunagitsune.com/wp-content/uploads/2020/05/isempty3.jpg)
さて、Aセル+iの数字で、該当セルをDelete(セルを削除して上に詰める)するとどうなるかというと……。
![isempty4](https://sunagitsune.com/wp-content/uploads/2020/05/isempty4.jpg)
実はこのコードだと、空白がふたつ以上空いた場合に歯抜けが残ります。
![isempty5](https://sunagitsune.com/wp-content/uploads/2020/05/isempty5.jpg)
なんでかというと、iが2の時にはA2セルを削除して上に詰めるということで、A2セルがあった場所にはA3セルのデータが移動し、iが3になった時チェックするのは元々A4セルにあったデータということになります。A3セルがチェックされません。
![isempty6](https://sunagitsune.com/wp-content/uploads/2020/05/isempty6.jpg)
要するに空白のデータがあったセルを削除すると、
![isempty7](https://sunagitsune.com/wp-content/uploads/2020/05/isempty7.jpg)
その下のセルがチェックされないという現象が起こります。なので歯抜けが残ります。
同じマクロを何回か実行すれば一応歯抜けは解消できますが、一回で処理したいところです。
同じマクロを何回か実行すれば一応歯抜けは解消できますが、一回で処理したいところです。
![isempty10](https://sunagitsune.com/wp-content/uploads/2020/05/isempty10.jpg)
そこで、別にiiという変数を作ります。
iiは何もなければ変数iと同様に1ずつ増加しますが、
iiは何もなければ変数iと同様に1ずつ増加しますが、
![isempty11](https://sunagitsune.com/wp-content/uploads/2020/05/isempty11.jpg)
もし空白のセルがあった場合は数字を増やしません。
Rangeがこのiiの行番号を参照すれば、上に移動してきたセルもチェックすることができます。
Rangeがこのiiの行番号を参照すれば、上に移動してきたセルもチェックすることができます。
![isempty12](https://sunagitsune.com/wp-content/uploads/2020/05/isempty12.jpg)
ちなみに、iとiiの数字差はそのまま削除した空白セルの数になるので、
![isempty13](https://sunagitsune.com/wp-content/uploads/2020/05/isempty13.jpg)
最後にi – iiを求めれば、いくつ空白のセルがあったかを表示することもできます。
![isempty14](https://sunagitsune.com/wp-content/uploads/2020/05/isempty14.jpg)
コード的にはこうなります。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
![isempty15](https://sunagitsune.com/wp-content/uploads/2020/05/isempty15.jpg)
実行結果はこんな感じです。
もし連動して横のセルも削除したければ、Range(“A” & ii & “: C” & ii).Deleteのように範囲を広げます。
もし連動して横のセルも削除したければ、Range(“A” & ii & “: C” & ii).Deleteのように範囲を広げます。
空白が式かどうかを判定する
セルが空白かを判定
IsEmpty(引数)
IsEmpty(引数)
![isempty18](https://sunagitsune.com/wp-content/uploads/2020/05/isempty18.jpg)
先ほどの式は、次のように書くこともできます。
' 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だけで、空白の場合の処理が記述できます。
![isempty20](https://sunagitsune.com/wp-content/uploads/2020/05/isempty20.jpg)
上の式を実行すると、ちゃんと隙間が埋まりました。
一見””で判定する方法と同じものに見えますが……。
一見””で判定する方法と同じものに見えますが……。
![isempty16](https://sunagitsune.com/wp-content/uploads/2020/05/isempty16.jpg)
式で空白を表示している場合にどうするか、という点が違います。
図ではA列に=If(C2=””,””,C2)と入力し、C列にある文字列をそのまま表示しています。
図ではA列に=If(C2=””,””,C2)と入力し、C列にある文字列をそのまま表示しています。
![isempty17](https://sunagitsune.com/wp-content/uploads/2020/05/isempty17.jpg)
If Range(“A” & ii).Value = “” Thenの場合は、式が入力されていても、現時点で空白が表示されていれば「空白」と判定されます。
したがって数式も削除されます。
したがって数式も削除されます。
![isempty19](https://sunagitsune.com/wp-content/uploads/2020/05/isempty19.jpg)
これに対しIsEmpty関数を使うと、式が入力されている場合は、現在空白が表示されていても「空白ではない」と判定します。
したがって数式は削除されません。
したがって数式は削除されません。
以上です。その他VBAで使える判定用の関数としては、IsDate(日付)、IsNumeric(数値)、Typename(データ型の判定)が用意されています。
![](https://sunagitsune.com/wp-content/uploads/2021/03/chalkboard-2281205_1280-160x90.jpg)
Excel(エクセル):空白セル、行列
空白セル等にまつわる諸々の操作、関数まとめです。
空白セル、行列の操作
空白のセル、行、列、範囲を挿入する方法です。
行・列ごとに空白の行・列を挿入する方法です。
選択範囲中の空白行・セルを削除す...
![](https://sunagitsune.com/wp-content/uploads/2018/12/mathematics-1509559_1280-160x90.jpg)
関数・演算子・メソッド・プロパティ名から探すExcel/VBA(マクロ)使い方・組み合わせ方まとめ
こちらはExcelやメソッドの諸機能を、機能の名称から探せるまとめ記事です。
コメント