和風スパゲティのレシピ

日本語でコーディングするExcelVBA

23本目:シート構成の一致確認

Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
VBA100本ノック」に対する私の回答と解説のページです。

100本ノックの出題リストはこちらから
excel-ubara.com

出題:シート構成の一致確認

#VBA100本ノック 23本目
ThisWorkbookと同一フォルダに"Book_20201101.xlsx"と"Book_20201102.xlsx"の2ファイルがあります。
シート構成(シート名のみ、位置は不問)が一致しているか確認してください。
「一致」または「不一致」の結果をメッセージボックスで表示。
※不一致の詳細は不要。

ブックサンプル

◇ 出題ページはこちら

ソースコード

メインモジュール

' 100本ノック023:シート構成の一致確認
Sub シート構成一致チェックテスト()
    
    Dim ファイルパス1 As String: ファイルパス1 = ThisWorkbook.Path & "\Book_20201101.xlsx"
    Dim ファイルパス2 As String: ファイルパス2 = ThisWorkbook.Path & "\Book_20201102.xlsx"
    
    Dim wb1 As Workbook: Set wb1 = Workbooks.Open(ファイルパス1, ReadOnly:=True)
    Dim wb2 As Workbook: Set wb2 = Workbooks.Open(ファイルパス2, ReadOnly:=True)
    
    If Isシート構成が一致(wb1, wb2) Then
        MsgBox "一致"
    Else
        MsgBox "不一致"
    End If
    
End Sub

' シート構成のチェック
Function Isシート構成が一致(wb1 As Workbook, wb2 As Workbook) As Boolean
    Isシート構成が一致 = False
    
    If wb1.Worksheets.Count <> wb2.Worksheets.Count Then Exit Function
    
    Dim ブック1のシート As Worksheet
    For Each ブック1のシート In wb1.Worksheets
        If Isシートが存在する(ブック1のシート.Name, wb2) = False Then Exit Function
    Next
    
    Isシート構成が一致 = True
End Function

汎用関数モジュール

Option Explicit

' シートの存在判定
' 参考:https://www.limecode.jp/entry/utility/existsworksheet
Function Isシートが存在する(判定シート名 As String, 指定ブック As Workbook) As Boolean

    ' ブック内の全シートを走査
    Dim ws As Worksheet
    For Each ws In 指定ブック.Worksheets

        ' シート名が一致したらTrueを返してExit
        If ws.Name = 判定シート名 Then
            Isシートが存在する = True
            Exit Function
        End If

    Next

End Function

解説

ブック内のシート構成の一致をチェックする問題です。

不一致シート名を列挙する必要があるならDictionaryなどが良さそうですが、
今回は一致/不一致をTrue/Falseで返せばいいだけでした。


この場合、まず最初に数の一致さえとってしまえば、
あとはブック1⇒ブック2の一方向チェックで十分
になります。
(ブック2⇒ブック1のチェックは不要になります)


シートの存在チェックは汎用関数化しています。

かなり使い勝手がいい関数ですので、
ライブラリ内にしっかり用意しておきましょう。