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のチェックは不要になります)
シートの存在チェックは汎用関数化しています。
かなり使い勝手がいい関数ですので、
ライブラリ内にしっかり用意しておきましょう。