【Excel VBA】シートの存在チェック②

記事
IT・テクノロジー
前回、シートの存在チェックを実装する2つの方法を取り上げました。シートの存在を確認するだけならば、これら2つの方法で十分ですが、実務をこなしていくと、以下のような機能が欲しいと感じることがあります。
① 別ブックにおいて、シートが存在するか調べたい。
② シートが存在する場合は、戻り値でシート番号を返してほしい。
③ シート名を完全一致、部分一致で調べたい。

これらを実現するためには、前回の関数を修正する必要があります。以下に修正したコードを載せます。

【コード】
-------------------------------------------------------------------------------
Function ExistSheet(ByVal key As String, ByRef wb As Workbook, ByVal match As String) As Long
    Dim i As Long
    For i = 1 To wb.Sheets.Count Step 1
        Select Case match
            Case "完全"
                If wb.Sheets(i).Name = key Then
                    ExistSheet = i
                    Exit Function
                End If
            Case "部分"
                If InStr(wb.Sheets(i).Name, key) <> 0 Then
                    ExistSheet = i
                    Exit Function
                End If
            Case Else
                If wb.Sheets(i).Name = key Then
                    ExistSheet = i
                    Exit Function
                End If
        End Select
    Next i
    ExistSheet = 0
End Function
-------------------------------------------------------------------------------

今回はfor eachを使用した関数を載せております。前回からの修正点を列挙します。

〇 引数の追加
wb:他ブックでもシートの存在チェックができるように、Workbook型の変数を追加しました。呼び出し側で、検索したいブックを渡すことで他ブックのシートも確認できます。現在のブックを検索したい場合は、ThisWorkbookを設定してください。
match:シート名とキーワード(key)の一致方法を選択できるように、String型の変数を追加しました。呼び出し側で、"完全"または"部分"という値を設定することで完全一致、部分一致による検索ができます。

〇 戻り値の変更
・戻り値をBoolean型からLong型に変更しました。これにより、シートが存在した場合はシート番号(正の整数)、存在しない場合は0、エラーが発生した場合は負の整数を返すことができます。

〇 Select Caseの導入
・完全一致、部分一致を実装するために、Select Caseを導入しました。こちらは、If文でも実装できますが、場合分けの条件が単純であるため、今回はSelect Caseを採用しました。

以上で希望の機能を持つ関数を実装できたわけですが、今回機能を追加したことで1つ利便性が低下した点があります。それは引数です。
当初、実装した関数は引数が1つしかありませんでしたが、今回の機能追加により3つに増えています。
この関数は、Excel VBAの中で繰り返し使用することを想定しています。
そのなかで、引数が増えるということは、単純にタイピングの量が増えるのはもちろん、ミスが発生する可能性がある箇所が増えるということです。

次回では、この課題を解決するためにコードを改良していきます。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す