« Excel でワークシートのヘッダーやフッターを一括で置換する。 | トップページ | コハダ、覚えてる? »

Excel で2つのシートでセルの値を比較して検算する。

この記事は自分用の覚書です。
(Windows 10 Pro 64ビット + Excel2016 Office365 Business サブスクリプション  バージョン1805(ビルド9330.2087)

N.T さん。

2つのシートでセルの値を比較して検算するプロシージャです。

■課題

  • 1つのブックのなかで隣り合っている2つのシートにそれぞれ表が1つ載っている。それら2つの表の値が全く同じであるかを比較して検算する作業を楽にしたい。
  • ブックのなかのシートは3枚以上になることもある。
  • G列3行目のセルから比較していく。
  • 表の行数・列数はそのときどきで変わる。
  • どのセルの値が違っているかを、ぱっと見てわかるようにしたい。

隣り合っている2枚のシートということでしたので、右側のシートのさらに右に検算用のシートを挿入して処理するようにしました。
(このコードでは、離れたシート同士を比較することはできません)

2つの表で値が異なっているセルがあったら、検算用のシートで該当するセルを赤く塗るようにしました。

最後に、できあがった検算用シートの表示倍率を20%にしてあります。
もらったサンプルがけっこう大きな表だったので、20%で全体を眺めることができたもので。そこに赤いセルがなかったら、2つのシートにある表は全く同じということです。
(表示倍率を変えたいときは、最後の ActiveWindow.Zoom = 20 の行で 20 を変えてください。)

検算用のシートのシート名は、「検算用_左端のシートから数えた枚数」といった書式になります。
シートが2枚だったら、「検算用_3」というシートが右端にできます。

シートが3枚以上になることもあるということですが、比較したいシートをどうやって扱えば比較できるか、私のスキルではわかりませんでした。

幸い、ブックが出来上がった時点では、比較したいシート同士は隣り合って並んでいるということだったので、「比較するシートを左右に並べて、右側のシートを開いていることを確認してからこのプロシージャーを実行する。」ということにさせてください。

スキル不足ですみません。

G列3行目のセルから比較していくとのことでしたので、FOR...NEXTステートメントの繰り返しの初期値は、7 と 3 になっています。
コメントの中にも書いていますが、比較を始めたいセルの位置が変わったら、その部分を合わせて変えてください。

また、表の列数と行数がその都度変わってくるということで、表の最大列数と、最大行数を、それぞれ Cells(5, Columns.Count).End(xlToLeft).Column と Cells(Rows.Count, "G").End(xlUp).Row の部分で取得しています。

Cells(5, Columns.Count) としたのは、値の抜けがないセルが行の右端まで続いているのは5行目以降だったからです。
5 を選んだ理由は特にありません。一番上の行なので 5 としたまでです。

同じ理由で、Cells(Rows.Count, "G").End(xlUp).Row としたのは、空欄でないセルが並んでいるG列を基準にしたかったからです。
空欄でないセルが並んでいれば、どの列でもよいのですが、G列のセルから比較を始めるので、G列を基準にしておくのが自然な書き方かと思います。


Sub 二つシートでセルの値を比較して検算する()
'
'比較する二つのシートが左右に並んでいて、
'右側のシートを開いていることを確認してからこのプロシージャーを実行する。
'
    Dim i As Long
    Dim j As Long
    Dim 検算用シートの位置 As Long

    ActiveSheet.Copy After:=ActiveSheet
    検算用シートの位置 = ActiveSheet.Index '■1

    '■2
    For i = 7 To Worksheets(検算用シートの位置 - 2).Cells(5, Columns.Count).End(xlToLeft).Column
        For j = 3 To Worksheets(検算用シートの位置 - 2).Cells(Rows.Count, "G").End(xlUp).Row
            If Worksheets(検算用シートの位置 - 2).Cells(j, i).Value <> Worksheets(検算用シートの位置 - 1).Cells(j, i).Value Then
                Worksheets(検算用シートの位置).Cells(j, i).Interior.Color = 255
            End If
        Next j
    Next i

    '■3
    With Worksheets(検算用シートの位置)
        .Name = "検算用シート_" & 検算用シートの位置
        .Range("A1").Select
    End With

    ActiveWindow.Zoom = 20
'
'比較する二つのシートが左右に並んでいて、
'右側のシートを開いている状態からこのプロシージャーを実行しているので、
'右側のシートをさらに右にコピーして、検算用のシートとして挿入する。
'この状態で、二つのシートと検算用シートは、セルの値がまったく同じであるはず。
'それを確認するために表の値を比較していく。
'
'■1
'挿入された検算用シートが、一番左端のシートから何枚目にあるかを、整数で取得し、変数 検算用シートの位置 に代入。
'取得した値は、検算用シートの左にある二つのシートの位置を指定するのに使う。
'
'■2
'検算用シートの位置から 2 を引くと、左に2枚目のシートを指定できる。
'1 を引くと左に1枚目(すぐ左となり)のシートを指定できる。
'
'Columnプロパティで、検算用シートから左に2枚目のシート上にある表が何列あるかを取得して、変数 i に代入する値の最終値として使っている。
'表が何列あっても対応できるようにしている。
'G列のセルから値の比較を始めたいので、変数 i の初期値は 7 にしてある。比較を始めたい列が変わったら、7 の部分をそれに合わせる。(G列は7列目)
'列数を数える基準となるセルの行が変わったら、Cells(5, Columns.Count) の 5 の部分をそれに合わせる。
'
'Rowプロパティで、検算用シートから左に2枚目のシート上にある表が何行あるかを取得して、変数 j に代入する値の最終値として使っている。
'表が何行あっても対応できるようにしている。
'3行目のセルから比較を始めたいので、変数 j の初期値を 3 にしてある。比較を始めたい行が変わったら、3 の部分をそれに合わせる。
'行数を数える基準となるセルの列が変わったら、 Cells(Rows.Count, "G") の "G" の部分をそれに合わせる。
'
'検算用シートから左に2枚目のシートと1枚目のシートのセルの値を比較して、同じでなければ、検算用シートの該当セルを赤く塗る。
'セルを赤くすることで、二つのシートの同じセルで値が異なっている(どちらかのシートでセルの値が間違っている)ことがわかるようにしている。
'
'■3
'二つのシートのセルを比較する検算の繰り返しが終わったら、
'検算用シートのシート名を「検算用シート_検算用シートの位置」に変える。
'「検算用シート_3」というようなシート名になる。
'
'検算用シートの全体が見えるように表示倍率を 20% にする。
'シート全体を見渡せるようになるので、赤いセルがあったらわかる。
'
End Sub

|

« Excel でワークシートのヘッダーやフッターを一括で置換する。 | トップページ | コハダ、覚えてる? »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: Excel で2つのシートでセルの値を比較して検算する。:

« Excel でワークシートのヘッダーやフッターを一括で置換する。 | トップページ | コハダ、覚えてる? »