3日がかりのその仕事、3分で終わらせる方法教えます!
パソコンスキルの心技体

複数シート上の同じ番地にあるデータを簡単に比較したい – Excelマクロ・VBA

2012年1月10日
  • このエントリーをはてなブックマークに追加
  • follow us in feedly

エクセルマクロ・VBA達人養成塾 小川です。

キューバ旅行記、その79です。

キューバ屈指の外人向けリゾート地、バラデロにて。
バラデロ3日目の朝。「Delfinario (デルフィナリオ)」という、イルカと遊べるテーマパークに行ってきました。

そのときの写真を、いろいろ。
エクセルマクロ達人養成塾塾長ブログ-中国製とおぼしきバスに乗っていきます。

中国製とおぼしきバスに乗っていきます。

エクセルマクロ達人養成塾塾長ブログ-道中、いろいろなホテルで観光客をピックアップ。

道中、いろいろなホテルで観光客をピックアップ。
この施設は、イルカと握手したり、イルカに乗って海を泳いだり、イルカに鼻で押し上げてもらって空にジャンプしたり、等々。

イルカと遊べる、というのが名物。

観光客が3組くらいに分けられて、各自、ライフジャケットを着けた状態で海に入りました。

僕は、ロシア人母子と3人のチームでした。

なんですが…。写真が手元に(パソコン内に)ないので、一気に割愛。
そのあと、イルカショーがありました。

エクセルマクロ達人養成塾塾長ブログ-イルカショー開始前、集まる人たち。

イルカショー開始前、集まる人たち。

エクセルマクロ達人養成塾塾長ブログ-あとでご活躍のイルカちゃん達。

あとでご活躍のイルカちゃん達。人がいい(イルカがいい?)ので、愛嬌たっぷりに、開演前のファンサービス。

エクセルマクロ達人養成塾塾長ブログ-空がすっげえキレイ!

空がすっげえキレイ!
塾長のキューバ旅行記、最初から読みたい方はこちらから


複数シート上の同じ番地にあるデータを簡単に比較したい – Excelマクロ・VBA

今日は、簡単なネタをひとつ。

二つのシートにある、よく似たデータを比較したい、というとき。

簡単なマクロの書き方はありますか、ということで。
ちょうど、さいきんそんなニーズがあって僕が書いたマクロをご紹介。
どういう事情だったのかというと。

    • 人に書いてもらったhtmlページがあった
    • 付随して、cssファイルもついていた
    • そのcssファイルが、もともとサイトにあったものと同じ内容なのか判断がつかなかった

 

という状況でした。

で、もらったファイルをそのまま使ってよいものか、判断がつかなかったんですね。
EmEditor等のDiffを使えるテキストエディタで比較すれば一発で解決しそうなものですが(僕も最初はそうした)、どういうわけか、Diffでは、「すべての行が一致しない」という評価になってしまいまして。

(あとで分かったのだが、実は、手元のテキストファイルはEuc-JPでエンコーディングされていたのだが、新たに受け取ったものは、Shift-Jisだった…)

それで、とりあえず簡単に比較をしたい!と思って書いたのが以下のコード。

Sub nantoka()

Dim r As Range

For Each r In Selection ‘[1]

If r.Value <> Worksheets(“Sheet2”).Range(r.Address).Value Then ‘[2]

Debug.Print r.Address & vbTab & r.Value

End If

Next

End Sub

そして、シート「Sheet1」、「Sheet2」に、二つのテキストファイルから文字列をすべて選択し、セルA1を選択した状態で貼りつけ。

マクロを実行した。

貼りつけした直後は、「Selection」がそのまま、セルA1から、「使われたセル範囲内の最後のセル」までを選択できていることに注意。

もしそうでない状態になったら、前々回のエントリー「テストに役立つショートカットキー [Ctrl] + [End] – Excelマクロ・VBA」 で書いたとおり、[Ctrl] + [Home] でセルA1を選択しなおしてから、[Ctrl] + [Shift] + [End] してください。
で。

たぶん、上記のサンプルのミソは2つ。

For Each r In Selection

Next

↑こういうところでコレクションを指定するとき、律儀に、Range(“A1:B133”) とか、書かないで、「Selection」で済ませる。

なぜかというと、あとあと指定するコレクションが変わる可能性が高いから。

だったら、都度VBEに戻ってコードを修正しなくてらならなくなるよりも、エクセル上の操作で指定できるようにしたほうが簡単。

        If r.Value <> Worksheets(“Sheet2”).Range(r.Address).Value Then ‘[2]

End If

↑別シート上の同じアドレスにあるセルを指定するとき、こういう書き方もアリ。

.Addressプロパティを使うと、あられもない形に仕上がる(笑
あとは、Debug.Print で出力されるデータを見つつ、どこが違うのか?とちまちま比較していく。

こういうやり方を知っておくと、たとえば、毎月やってくる定型的な資料の所定の部分が同じ内容になっているかを比較するとき等々、何かと応用例がある。
もっとも、今回の「cssファイルの内容比較」のような事例では、比較のためのツールとしては不完全。

不一致が行の挿入、削除等によって起こっていた場合とかね。

そうい
うときには、場合によっては、シート上のデータを行ごと追加、削除するなんてこともしつつテストをくり返す、という感じで。
で、やっているうちに

「うーん、本格的に、やっかいな案件の雰囲気がするな…」

と感じ始めたら、その段階で、For Each構文でコレクションを指定する部分を以下のように書き換えます。

(そうすると、エクセル上での範囲選択しなおしの必要がなくなります)

For Each r In Range(Range(“A1”), Range(“A1”).SpecialCells(xlCellTypeLastCell))

Next

というわけで。

今日は、複数シート上の同じ番地にあるデータを簡単に比較したい。

というお話でした。

お知らせが2つ。
人気のセミナー2つを、久しぶりに開催します。

「エクセルデータ分析7つの上級技」

「親指シフト達人養成塾」
受講受付開始しました。ふるってご参加ください☆
ではでは (^^)/~

キーワード

コメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

最新の記事

人気記事

最新記事

カテゴリ

最新コメント

タグクラウド