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

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

記事
IT・テクノロジー
前回に続き、シートの存在を確認する関数の話です。これまで、関数を2回修正してきて、機能としては向上しているものの、引数が増えたことで利便性が低下した話をしました。
今回は、その問題を解消していきます。以下にコードを示します。

【コード】
-------------------------------------------------------------------------------
Function GetShtIndex(ByVal key As String, Optional ByRef wb As Variant, Optional ByVal match As String = "完全") As Long
    Dim i As Long
    '====参照判定===='
    If IsMissing(wb) Then
        Set wb = ThisWorkbook
    End If
    '====エラー判定===='
    'キーワードが空白
    If key = "" Then
        GetShtIndex = -1
        Exit Function
    End If
    '引数がWorkbook型でない
    If TypeName(wb) <> "Workbook" Then
        GetShtIndex = -1
        Exit Function
    End If
    '====シート番号取得===='
    For i = 1 To wb.Sheets.Count Step 1
        Select Case match
            Case "完全"
                If wb.Sheets(i).Name = key Then
                    GetShtIndex = i
                    Exit Function
                End If
            Case "部分"
                If InStr(wb.Sheets(i).Name, key) <> 0 Then
                    GetShtIndex = i
                    Exit Function
                End If
            Case Else
                If wb.Sheets(i).Name = key Then
                    GetShtIndex = i
                    Exit Function
                End If
        End Select
    Next i
    GetShtIndex = 0
End Function
-------------------------------------------------------------------------------

まず初めに、関数名を変更しました。前回までは「ExistSheet 」でしたが、関数の役割が「シートが存在するか否か」ではなく、「シートがブックの何番目に存在するか」というものに代わっているため、「GetShtIndex」としています。
次に、2番目以降の引数にOptional を付けています。Optional を付けると、引数を省略できるようになります。このとき、値型の引数であれば、引数が省略された場合の初期値を設定できます。逆に、参照型の引数は初期値を設定できません。
例、Optional ByVal match As String = "完全"
 matchという引数が省略された場合は、「完全」を初期値として設定する。

ここで、例えば2番目の引数にOptional を付けた場合は、3番目以降の引数にもOptional を付ける必要があります。
参照型の引数に初期値を設定する場合は、IsMissing()関数を使用します。
今回のコードでは、引数が省略された場合の初期値としてThisWorkbook を設定しています。このとき、参照型の引数の型はWorkbook型ではなく、Variant型であることに注意してください。IsMissing()関数を使用するためには、Variant型を指定する必要があります。
そのためコード内で、引数で渡されたwbがWorkbook型であるかの判定を行っています。

今回、作成した関数の使用例を載せます。
1.現在のブックに、"あいう"というシートが存在するか
    If GetShtIndex("あいう") > 0 Then
        MsgBox "存在します"
    End If

2.家計簿というブックに、"10月"を含むシートが何番目に存在するか
    If GetShtIndex(key:="10月", wb:=家計簿, match:="部分") > 0 Then
        MsgBox "存在します"
    End If
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す