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

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

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

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

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

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

そのときの写真を、いろいろ。
エクセルマクロ達人養成塾塾長ブログ-奥のいけすが、イルカと水遊びできるエリア。

奥のいけすが、イルカと水遊びできるエリアでした。

エクセルマクロ達人養成塾塾長ブログ

イルカショーの前。イルカちゃん、また登場。

エクセルマクロ達人養成塾塾長ブログ-前座の楽団。キューバではおなじみの風景。

前座の楽団。キューバではおなじみの風景。

エクセルマクロ達人養成塾塾長ブログ-マッチョとスレンダー美女が登場。

マッチョとスレンダー美女が入場。

エクセルマクロ達人養成塾塾長ブログ-水鳥も、緊張した面持ちで臨戦態勢。

水鳥も、緊張した面持ちで臨戦態勢。

エクセルマクロ達人養成塾塾長ブログ-てことで、イルカショー開始。

てことで、イルカショー開始。

エクセルマクロ達人養成塾塾長ブログ

すごい跳躍力 (@_@;
塾長のキューバ旅行記、最初から読みたい方はこちらから


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

昨日のブログ「複数シート上の同じ番地にあるデータを簡単に比較したい – Excelマクロ・VBA」で、別シート上の同じセル番地にあるセル同士の比較をしたい、というときに使えるサンプルを紹介しました。

ちょっと、その補足を。

昨日の最終形は、以下のものになるのですが。

Sub nantoka()

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にあるデータが逆の場合は、何も出力されません。

Range(“A1”).SpecialCells(xlCellTypeLastCell)

が、指すのが、最初の例ではセルE11ですが、「Sheet1とSheet2にあるデータが逆の場合」は、セルD11になってしまうからです。
そういう比較もしたいということであれば、さらに、以下の処置を追加するんですかね。

昨日紹介した .Address プロパティと、さらに、 Union メソッドを絡めてみました。

Sub nantoka_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つの上級技」
受講受付開始しました。ふるってご参加ください☆
ではでは (^^)/~

キーワード

コメント

コメントを残す

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

最新の記事

人気記事

最新記事

カテゴリ

最新コメント

タグクラウド