『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【Excel VBA】ブロック崩し

ネットで総務省などから CSV 形式の住所データをダウンロードすると、次のようになっていることがあります(必要であれば、この表をコピーして使ってくださいな)。

市区 町村
栃木県佐野市 本町
栃木県佐野市 本町 1丁目
栃木県佐野市 本町 2丁目
栃木県佐野市 大蔵町
栃木県栃木市 万町
栃木県栃木市 万町 1丁目
栃木県栃木市 万町 2丁目

「栃木県佐野市」という小見出しの右に、同市の町村がいくつか並ぶという形式になっています。そのあと「栃木県栃木市」の小見出しがあって、また同市の町村が続くという形です(実際にはもっと多くの町村が並びますが、練習用の表なので簡略化しています)。小見出しの横は空白になっていますね。この小見出しを行ごと消してしまう VBA マクロを作ってみました。

【VBA】ブロック崩し

下の図をよく見てくださいな。
 
ExcelVBA行を消去するマクロ
 
小見出しのあるセル A2 に着目するとすぐ下の A3 には同じ文字列が入っていますね。あと右隣の B2 は空白セルになってます。この2点を使ってこんなコードを書いてみました。名づけて「ブロック崩しマクロ」です。

'[VBA] ブロック崩し
Sub Breakout()
  Dim y As Integer
  For y = 1 To 1000
    If Cells(y, 2) = "" And Cells(y, 1) = Cells(y + 1, 1) Then
      Rows(y).Delete Shift:=xlUp
    End If
  Next y
End Sub

変数 y には行番号を入れるようにしています。
こばとは Cells(y,x) という書き方をよくします。これだと数学でよく見慣れた「縦軸は y で横軸は x 」という感覚と合うので読みやすいのです。For によるループは 1000 行までとってありますけど、もっとたくさんのデータがある場合はこの数字を増やしておきます。さて、核となる記述は If 文です。

1.Cells(y, 2) 、つまり B 列のセルが空白であること
2.Cells(y, 1) と Cells(y + 1, 1) が同じであること

この2つの条件を And で結んで「両方とも満たすなら」、「行を丸ごと消去してくださいな」というコードになっています。
消去命令にはよく使われる ClearContents メソッドではなく、Delete メソッドを使っています。ClearContents はセルを空白にしてそのまま残します。一方、Delete メソッドは引数に Shift:=xlUp を指定することで、その行を消去してその下にある残り全部のデータを上に持ち上げることができます。それでは Breakout() をぽちっと実行してみましょう。
 
VBAデータが消えました

無用なデータがいっぺんに消えてすっきりしましたね。たった数行の簡単なマクロでもデータのお掃除ができてしまうのです。それではまた次回お会いしましょう。

コメント