こんにちは。
キャスレーコンサルティング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帳票の書式比較を効率的に実施することができました。
今回は、書式比較という内容で紹介しましたが、
応用すれば書式設定のプロパティを一括出力、一括設定することも可能です。
※設定の際は、各プロパティの設定値(定数)を確認してください。
また、今回比較した書式設定の項目は
一般的によく使用されると思われる項目を抜粋したため、
他に比較したい項目があれば追加するなど、
必要に応じてカスタマイズしてみてください。
ご一読いただき、ありがとうございました。