エクセルマクロ・VBA達人養成塾 小川です。
キューバ旅行記、その79です。
キューバ屈指の外人向けリゾート地、バラデロにて。
バラデロ3日目の朝。「Delfinario (デルフィナリオ)」という、イルカと遊べるテーマパークに行ってきました。
そのときの写真を、いろいろ。
中国製とおぼしきバスに乗っていきます。
道中、いろいろなホテルで観光客をピックアップ。
この施設は、イルカと握手したり、イルカに乗って海を泳いだり、イルカに鼻で押し上げてもらって空にジャンプしたり、等々。
イルカと遊べる、というのが名物。
観光客が3組くらいに分けられて、各自、ライフジャケットを着けた状態で海に入りました。
僕は、ロシア人母子と3人のチームでした。
なんですが…。写真が手元に(パソコン内に)ないので、一気に割愛。
そのあと、イルカショーがありました。
イルカショー開始前、集まる人たち。
あとでご活躍のイルカちゃん達。人がいい(イルカがいい?)ので、愛嬌たっぷりに、開演前のファンサービス。
空がすっげえキレイ!
塾長のキューバ旅行記、最初から読みたい方はこちらから
今日は、簡単なネタをひとつ。
二つのシートにある、よく似たデータを比較したい、というとき。
簡単なマクロの書き方はありますか、ということで。
ちょうど、さいきんそんなニーズがあって僕が書いたマクロをご紹介。
どういう事情だったのかというと。
という状況でした。
で、もらったファイルをそのまま使ってよいものか、判断がつかなかったんですね。
EmEditor等のDiffを使えるテキストエディタで比較すれば一発で解決しそうなものですが(僕も最初はそうした)、どういうわけか、Diffでは、「すべての行が一致しない」という評価になってしまいまして。
(あとで分かったのだが、実は、手元のテキストファイルはEuc-JPでエンコーディングされていたのだが、新たに受け取ったものは、Shift-Jisだった…)
それで、とりあえず簡単に比較をしたい!と思って書いたのが以下のコード。
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に戻ってコードを修正しなくてらならなくなるよりも、エクセル上の操作で指定できるようにしたほうが簡単。
End If
↑別シート上の同じアドレスにあるセルを指定するとき、こういう書き方もアリ。
.Addressプロパティを使うと、あられもない形に仕上がる(笑
あとは、Debug.Print で出力されるデータを見つつ、どこが違うのか?とちまちま比較していく。
こういうやり方を知っておくと、たとえば、毎月やってくる定型的な資料の所定の部分が同じ内容になっているかを比較するとき等々、何かと応用例がある。
もっとも、今回の「cssファイルの内容比較」のような事例では、比較のためのツールとしては不完全。
不一致が行の挿入、削除等によって起こっていた場合とかね。
そうい
うときには、場合によっては、シート上のデータを行ごと追加、削除するなんてこともしつつテストをくり返す、という感じで。
で、やっているうちに
「うーん、本格的に、やっかいな案件の雰囲気がするな…」
と感じ始めたら、その段階で、For Each構文でコレクションを指定する部分を以下のように書き換えます。
(そうすると、エクセル上での範囲選択しなおしの必要がなくなります)
For Each r In Range(Range(“A1”), Range(“A1”).SpecialCells(xlCellTypeLastCell))
Next
というわけで。
今日は、複数シート上の同じ番地にあるデータを簡単に比較したい。
というお話でした。
お知らせが2つ。
人気のセミナー2つを、久しぶりに開催します。
「親指シフト達人養成塾」
受講受付開始しました。ふるってご参加ください☆
ではでは (^^)/~