VBA でブロック崩し? 重複データを削ります

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

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

 「栃木県佐野市」という小見出しの下に、同市の町村がいくつか並ぶという形式になっています。そのあと「栃木県栃木市」の小見出しがあって、また同市の町村が続くという形です(実際にはもっと多くの町村が並びますが、練習用の表なので簡略化しています)。
 小見出しの横は空白になっていますね。こばと的には
「この部分はちょーいらないって感じー。少しでも重複データ削って動作を軽くしたいしー。だから消しちゃえー、みたいなー」
と思ったわけですよ。というわけで、この小見出しを行ごと消してしまうマクロを作ってみました。

ブロック崩しのマクロ

 下の図をよく見てくださいな。

 ExcelVBA行を消去するマクロ

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

 Sub ブロック崩し()
  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 を指定することで、その行を消去してその下にある残り全部のデータを上に持ち上げることができます。
 それではマクロをぽちっと実行してみましょー。

 VBAデータが消えました

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

スポンサードリンク
末尾大型広告
末尾大型広告

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)