キャスレーコンサルティング 技術ブログ

VBAでExcelのセルの書式比較を行う

Posted on 10月 11, 2017

こんにちは。
キャスレーコンサルティングSI(システム・インテグレーション)部の中田です。

今回は、Excelのセルの書式比較をVBAで機械的に行う方法をご紹介します。

1.はじめに

Excelでは、セルの値はExact関数や=記号などを使用して比較することができますが、
セルの書式設定は、比較することができません。(比較する関数がありません)

比較対象のセルが数件程度であれば、セルの書式設定ウィンドウから
各項目のプロパティ値を目視で確認し、比較することも難しくはありません。

しかし、対象件数が数十、数百件以上存在する場合は、目視による確認は難しく、
確認漏れやミスが発生する可能性が高くなります。

そこで、セルに保持している書式設定のプロパティ値をプログラム(VBA)で
機械的に突き合せることで、正確かつ効率的に比較を行うことができます。

2.概要

セルの書式設定は、Rangeオブジェクトのプロパティとして内包されています。

例えば、フォントサイズは

ThisWorkbook.Sheets(1).Range("A1").Font.Size

で取得することが可能です。

また、セルの背景色は

ThisWorkbook.Sheets(1).Range("A1").Interior.Color

で取得することが可能です。

このように、Rangeオブジェクトのプロパティの中から
比較したい項目のプロパティ値を取得し、それぞれを単純に突き合せていきます。

3.実装

以下は、異なるワークシートのセルの書式設定を
A1セルから走査して比較するサンプルコードです。

比較した後の処理については、記述していないため、
対象のセルに目印を設定する、差異をファイルに出力するなど自由に記述してください。

Sub FormatDiff()

    Dim i, j As Long

    For i = 1 To 100
        For j = 1 To 100

            ''文字関連プロパティ

            'フォント名/色/サイズ
            If Worksheets("比較元").Cells(i, j).Font.Name <> Worksheets("比較先").Cells(i, j).Font.Name Then
                '差異あり時の処理(以降省略)
            Else
                '差異なし時の処理(以降省略)
            End If
            If Worksheets("比較元").Cells(i, j).Font.Color <> Worksheets("比較先").Cells(i, j).Font.Color Then
            End If
            If Worksheets("比較元").Cells(i, j).Font.Size <> Worksheets("比較先").Cells(i, j).Font.Size Then
            End If

            '太字/斜体/下線/取消線
            If Worksheets("比較元").Cells(i, j).Font.Bold <> Worksheets("比較先").Cells(i, j).Font.Bold Then
            End If
            If Worksheets("比較元").Cells(i, j).Font.Italic <> Worksheets("比較先").Cells(i, j).Font.Italic Then
            End If
            If Worksheets("比較元").Cells(i, j).Font.Underline <> Worksheets("比較先").Cells(i, j).Font.Underline Then
            End If
            If Worksheets("比較元").Cells(i, j).Font.Strikethrough <> Worksheets("比較先").Cells(i, j).Font.Strikethrough Then
            End If

            '上付き文字/下付き文字
            If Worksheets("比較元").Cells(i, j).Font.Superscript <> Worksheets("比較先").Cells(i, j).Font.Superscript Then
            End If
            If Worksheets("比較元").Cells(i, j).Font.Subscript <> Worksheets("比較先").Cells(i, j).Font.Subscript Then
            End If

            ''セル関連プロパティ

            '文字の配置 縦位置/横位置/角度
            If Worksheets("比較元").Cells(i, j).VerticalAlignment <> Worksheets("比較先").Cells(i, j).VerticalAlignment Then
            End If
            If Worksheets("比較元").Cells(i, j).HorizontalAlignment <> Worksheets("比較先").Cells(i, j).HorizontalAlignment Then
            End If
            If Worksheets("比較元").Cells(i, j).Orientation <> Worksheets("比較先").Cells(i, j).Orientation Then
            End If

            '文字の制御 折り返し/縮小表示/セル結合
            If Worksheets("比較元").Cells(i, j).WrapText <> Worksheets("比較先").Cells(i, j).WrapText Then
            End If
            If Worksheets("比較元").Cells(i, j).ShrinkToFit <> Worksheets("比較先").Cells(i, j).ShrinkToFit Then
            End If
            If Worksheets("比較元").Cells(i, j).MergeCells <> Worksheets("比較先").Cells(i, j).MergeCells Then
            End If

            'セルの書式設定
            If Worksheets("比較元").Cells(i, j).NumberFormatLocal <> Worksheets("比較先").Cells(i, j).NumberFormatLocal Then
            End If

            'セル背景 色/パターン/パターンの色
            If Worksheets("比較元").Cells(i, j).Interior.Color <> Worksheets("比較先").Cells(i, j).Interior.Color Then
            End If
            If Worksheets("比較元").Cells(i, j).Interior.Pattern <> Worksheets("比較先").Cells(i, j).Interior.Pattern Then
            End If
            If Worksheets("比較元").Cells(i, j).Interior.PatternColor <> Worksheets("比較先").Cells(i, j).Interior.PatternColor Then
            End If

            'セルのロック
            If Worksheets("比較元").Cells(i, j).Locked <> Worksheets("比較先").Cells(i, j).Locked Then
            End If

            ''罫線関連プロパティ

            '罫線位置 上/下/左/右/右下がり/右上がり(各罫線位置ごとに線種/太さ/色を比較)
            If Worksheets("比較元").Cells(i, j).Borders(xlEdgeTop).LineStyle <> Worksheets("比較先").Cells(i, j).Borders(xlEdgeTop).LineStyle Then
            End If
            If Worksheets("比較元").Cells(i, j).Borders(xlEdgeTop).Weight <> Worksheets("比較先").Cells(i, j).Borders(xlEdgeTop).Weight Then
            End If
            If Worksheets("比較元").Cells(i, j).Borders(xlEdgeTop).Color <> Worksheets("比較先").Cells(i, j).Borders(xlEdgeTop).Color Then
            End If

            If Worksheets("比較元").Cells(i, j).Borders(xlEdgeBottom).LineStyle <> Worksheets("比較先").Cells(i, j).Borders(xlEdgeBottom).LineStyle Then
            End If
            If Worksheets("比較元").Cells(i, j).Borders(xlEdgeBottom).Weight <> Worksheets("比較先").Cells(i, j).Borders(xlEdgeBottom).Weight Then
            End If
            If Worksheets("比較元").Cells(i, j).Borders(xlEdgeBottom).Color <> Worksheets("比較先").Cells(i, j).Borders(xlEdgeBottom).Color Then
            End If

            If Worksheets("比較元").Cells(i, j).Borders(xlEdgeLeft).LineStyle <> Worksheets("比較先").Cells(i, j).Borders(xlEdgeLeft).LineStyle Then
            End If
            If Worksheets("比較元").Cells(i, j).Borders(xlEdgeLeft).Weight <> Worksheets("比較先").Cells(i, j).Borders(xlEdgeLeft).Weight Then
            End If
            If Worksheets("比較元").Cells(i, j).Borders(xlEdgeLeft).Color <> Worksheets("比較先").Cells(i, j).Borders(xlEdgeLeft).Color Then
            End If

            If Worksheets("比較元").Cells(i, j).Borders(xlEdgeRight).LineStyle <> Worksheets("比較先").Cells(i, j).Borders(xlEdgeRight).LineStyle Then
            End If
            If Worksheets("比較元").Cells(i, j).Borders(xlEdgeRight).Weight <> Worksheets("比較先").Cells(i, j).Borders(xlEdgeRight).Weight Then
            End If
            If Worksheets("比較元").Cells(i, j).Borders(xlEdgeRight).Color <> Worksheets("比較先").Cells(i, j).Borders(xlEdgeRight).Color Then
            End If

            If Worksheets("比較元").Cells(i, j).Borders(xlDiagonalDown).LineStyle <> Worksheets("比較先").Cells(i, j).Borders(xlDiagonalDown).LineStyle Then
            End If
            If Worksheets("比較元").Cells(i, j).Borders(xlDiagonalDown).Weight <> Worksheets("比較先").Cells(i, j).Borders(xlDiagonalDown).Weight Then
            End If
            If Worksheets("比較元").Cells(i, j).Borders(xlDiagonalDown).Color <> Worksheets("比較先").Cells(i, j).Borders(xlDiagonalDown).Color Then
            End If

            If Worksheets("比較元").Cells(i, j).Borders(xlDiagonalUp).LineStyle <> Worksheets("比較先").Cells(i, j).Borders(xlDiagonalUp).LineStyle Then
            End If
            If Worksheets("比較元").Cells(i, j).Borders(xlDiagonalUp).Weight <> Worksheets("比較先").Cells(i, j).Borders(xlDiagonalUp).Weight Then
            End If
            If Worksheets("比較元").Cells(i, j).Borders(xlDiagonalUp).Color <> Worksheets("比較先").Cells(i, j).Borders(xlDiagonalUp).Color Then
            End If

        Next
    Next
End Sub

4.おわりに

私は過去に、上記のサンプルコードをブラッシュアップしてツール化し、
大量のExcel帳票の書式比較を効率的に実施することができました。

今回は、書式比較という内容で紹介しましたが、
応用すれば書式設定のプロパティを一括出力、一括設定することも可能です。
※設定の際は、各プロパティの設定値(定数)を確認してください。

また、今回比較した書式設定の項目は
一般的によく使用されると思われる項目を抜粋したため、
他に比較したい項目があれば追加するなど、
必要に応じてカスタマイズしてみてください。

ご一読いただき、ありがとうございました。


採用情報

  • Profile
    キャスレーコンサルティングの技術ブログです。
    当社エンジニアが技術面でのTips、技術系イベント等についてご紹介いたします。
  • CSV社長ブログ
  • チーム・キャスレーブログ