ネットで総務省などから CSV 形式の住所データをダウンロードすると、次のようになっていることがあります(必要であれば、この表をコピーして使ってくださいな)。
市区 | 町村 | 丁 |
---|---|---|
栃木県佐野市 | 本町 | |
栃木県佐野市 | 本町 | 1丁目 |
栃木県佐野市 | 本町 | 2丁目 |
栃木県佐野市 | 大蔵町 | |
栃木県栃木市 | 万町 | |
栃木県栃木市 | 万町 | 1丁目 |
栃木県栃木市 | 万町 | 2丁目 |
「栃木県佐野市」という小見出しの右に、同市の町村がいくつか並ぶという形式になっています。そのあと「栃木県栃木市」の小見出しがあって、また同市の町村が続くという形です(実際にはもっと多くの町村が並びますが、練習用の表なので簡略化しています)。小見出しの横は空白になっていますね。この小見出しを行ごと消してしまう VBA マクロを作ってみました。
【VBA】ブロック崩し
下の図をよく見てくださいな。
小見出しのあるセル 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() をぽちっと実行してみましょう。
無用なデータがいっぺんに消えてすっきりしましたね。たった数行の簡単なマクロでもデータのお掃除ができてしまうのです。それではまた次回お会いしましょう。
コメント