エクセルマクロ・VBA達人養成塾 小川です。
キューバ旅行記、その80です。
キューバ屈指の外人向けリゾート地、バラデロにて。
バラデロ3日目の朝。「Delfinario (デルフィナリオ)」という、イルカと遊べるテーマパークに行ってきました。
そのときの写真を、いろいろ。
奥のいけすが、イルカと水遊びできるエリアでした。
イルカショーの前。イルカちゃん、また登場。
前座の楽団。キューバではおなじみの風景。
マッチョとスレンダー美女が入場。
水鳥も、緊張した面持ちで臨戦態勢。
てことで、イルカショー開始。
すごい跳躍力 (@_@;
塾長のキューバ旅行記、最初から読みたい方はこちらから
昨日のブログ「複数シート上の同じ番地にあるデータを簡単に比較したい – Excelマクロ・VBA」で、別シート上の同じセル番地にあるセル同士の比較をしたい、というときに使えるサンプルを紹介しました。
ちょっと、その補足を。
昨日の最終形は、以下のものになるのですが。
Dim r As Range
For Each r In Range(Range(“A1”), Range(“A1”).SpecialCells(xlCellTypeLastCell))
If r.Value <> Worksheets(“Sheet2”).Range(r.Address).Value Then ‘[2]
Debug.Print r.Address & vbTab & r.Value
End If
Next
End Sub
これ、根本的な問題として、比較対象のシート(この場合なら、Sheet2)で、Sheet1より縦または横に広い範囲にデータが記入されていないことが前提です。
(そうでない場合は、あらかじめ、エクセル上での手作業が必要でしょう)
どういうことかというと。
例えば、以下の例であれば、問題ありません。
Sheet1に以下のデータがあり。
|A列 |B列 |C列 |D列 |E列 | ------------------------------------------------------------------------------- 1 行目 |id |name1 |name2 |score |qualification | ------------------------------------------------------------------------------- 2 行目 |1 |香川 |めぐみ |53 |failure | ------------------------------------------------------------------------------- 3 行目 |2 |愛媛 |紀章 |90 |success | ------------------------------------------------------------------------------- 4 行目 |3 |三重 |侑 |92 |success | ------------------------------------------------------------------------------- 5 行目 |4 |松本 |学 |55 |failure | ------------------------------------------------------------------------------- 6 行目 |5 |東京 |貴 |90 |success | ------------------------------------------------------------------------------- 7 行目 |6 |横浜 |留美 |59 |failure | ------------------------------------------------------------------------------- 8 行目 |7 |広島 |奈穂 |72 |failure | ------------------------------------------------------------------------------- 9 行目 |8 |市川 |真之介 |93 |success | ------------------------------------------------------------------------------- 10行目 |9 |佐賀 |尚広 |79 |failure | ------------------------------------------------------------------------------- 11行目 |10 |桜井 |奈津子 |74 |failure | -------------------------------------------------------------------------------
Sheet2に以下のデータがある。
|A列 |B列 |C列 |D列 | --------------------------------------------------- 1 行目 |id |name1 |name2 |score | --------------------------------------------------- 2 行目 |1 |香川 |めぐみ |53 | --------------------------------------------------- 3 行目 |2 |愛媛 |紀章 |90 | --------------------------------------------------- 4 行目 |3 |三重 |侑 |92 | --------------------------------------------------- 5 行目 |4 |松本 |学 |55 | --------------------------------------------------- 6 行目 |5 |東京 |貴 |90 | --------------------------------------------------- 7 行目 |6 |横浜 |留美 |59 | --------------------------------------------------- 8 行目 |7 |広島 |奈穂 |72 | --------------------------------------------------- 9 行目 |8 |市川 |真之介 |93 | --------------------------------------------------- 10行目 |9 |佐賀 |尚広 |79 | --------------------------------------------------- 11行目 |10 |桜井 |奈津子 |74 | ---------------------------------------------------
注: Sheet1とSheet2の違いは、Sheet1は、A列~E列にデータがある。Sheet2は、D列までしかデータはない。という点。
そして、Sheet1を選んだ状態で、マクロを実行する。
上記の例であれば、以下の出力結果を得るでしょう。
$E$1 qualification
$E$2 failure
$E$3 success
$E$4 success
$E$5 failure
$E$6 success
$E$7 failure
$E$8 failure
$E$9 success
$E$10 failure
$E$11 failure
ところが。
Sheet1とSheet2にあるデータが逆の場合は、何も出力されません。
が、指すのが、最初の例ではセルE11ですが、「Sheet1とSheet2にあるデータが逆の場合」は、セルD11になってしまうからです。
そういう比較もしたいということであれば、さらに、以下の処置を追加するんですかね。
昨日紹介した .Address プロパティと、さらに、 Union メソッドを絡めてみました。
Dim w As Worksheet
Dim rAll As Range
For Each w In Worksheets
With w
If rAll Is Nothing Then ‘[A]
Set rAll = Range(Range(.Range(“A1”), .Range(“A1”).SpecialCells(xlCellTypeLastCell)).Address)
Else
Set rAll = Union(rAll, Range(Range(.Range(“A1”), .Range(“A1”).SpecialCells(xlCellTypeLastCell)).Address))
End If
End With
Next
Dim r As Range
For Each r In rAll
If r.Value <> Worksheets(“Sheet2”).Range(r.Address).Value Then ‘[2]
Debug.Print r.Address & vbTab & r.Value
End If
Next
End Sub
サブプロシージャの名前「nantoka_address_union」って、組合みたいだ。。
それはともかく。
上記のサンプルでは、For Each 構文で複数シートについて調べ、その各々の使われているセル範囲を調べる。そしてさらに、その直前までに調べてきたものとUnionメソッドを使って比較しています。
(なお、Uuionメソッドを使ううえで、別シート上にあるセルを含むコレクションはは作れないので要注意)
まあでも、簡易なデータチェックのためにここまでする意味があるのか?という気はします。
エクセル VBAのオブジェクトとかプロパティとかコレクションとか With 句とか For Each 構文とか、そこそこの知識がそれなりに揃わないとこんなのスラスラ書けないですし(そこそこの知識がそれなりに揃えたい人はこちらへ)、
こんなの作ることでヒーコラ言っているくらいなら、作業範囲を確認するには、目視でよいと思います。
「いったんマクロを使うと決めたら、すべてマクロで解決しなくてはならない!」
とか、
「マクロを使っているのに、エクセルでの手作業も加えるとキモチ悪い」
とか、
「自分の技術のなさに罪悪感を感じる」
とか、
そんなこと、考えなくていいですよ。Excel マクロなんて、あくまで、道具のひとつにしかすぎないですから。
実際、僕はそこまでやりません。キリがないんで ヾ(´ー`)ノ
そうそう、「道具のひとつ」といえば、
お知らせが2つ。
人気のセミナー2つを、久しぶりに開催します。
「親指シフト達人養成塾」
「エクセルデータ分析7つの上級技」
受講受付開始しました。ふるってご参加ください☆
ではでは (^^)/~