[0]はじめに
Zitanです。
実務でマクロを書く時に、「インデックスが有効範囲にありません」というエラーに出会ったことはないでしょうか。
今回は指定したワークシートが存在するか事前にチェックするマクロ(自作関数)です。
エラーハンドリング的な用途に使える部品なので必要に応じてご利用下さい。
プログラムは一から全部作るより誰かが作った便利な部品を組み合わせたほうが開発効率が上がります。
[1]コード
必要に応じてカスタマイズは必要ですが、このまま使うことができます。
Sub シートの存在チェック()
If flgSheetExsist("Sheet4") = True Then
MsgBox "存在します"
Else
MsgBox "存在しません"
End If
End Sub
Function flgExsistSheet(ByVal WorkSheetName As String) As Boolean
Dim sht As Worksheet
For Each sht In ActiveWorkbook.Worksheets
If sht.Name = WorkSheetName Then
flgExsistSheet = True
Exit Function
End If
Next sht
flgExsistSheet = False
End Function
Subプロシージャは動作確認のために書いているコードなので用途に応じてカスタマイズして下さい。
流用できる部品としての部分は、Function以下です。
関数名が「flgSheetExsist」です。戻り値がBoolean型(True/False)なので関数名の頭にflg(フラグ)という名称をつけています。
使い方ですが、Subプロシージャ内でflgSheetExsist("シート名")と入力します。
"シート名"が引数です。文字列なので”(ダブルクォーテーション)で囲む必要があります。
※「y=x+1」であれば、xが引数でyが戻り値という関係性になります。
[2]コードの解説
Function flgExsistSheet(ByVal WorkSheetName As String) As Boolean
Dim sht As Worksheet
For Each sht In ActiveWorkbook.Worksheets
If sht.Name = WorkSheetName Then
flgExsistSheet = True
Exit Function
End If
Next sht
flgExsistSheet = False
End Function
関数は、 Function 関数名(引数名 As 引数の型) As 戻り値の型 という書き方をします。
※引数の前に「Byval(値渡し)」を書かないと、デフォルトでは「ByRef(参照渡し)」になります。
今回は特に影響ないのですが、関数実行後に、事前に宣言した変数が上書きされたくない場合、特別な理由がない場合は、「Byval(値渡し)」にします。
引数名ですが、検索するワークシート名を文字列型で渡します。
戻り値は、検索したワークシート名が存在するか真偽値で返します。
シート名の検索方法は、For Each文(コレクション処理)を使っています。
アクティブなワークブック内のすべてのワークシートに対して、引数で指定したワークシート名が存在するか探します。
※For文で、「Sheets.Count」で調べてもOKです。
見つかったらフラグをTrueにして関数から抜け出します。
見つからなければフラグをFalseにして関数が終わります。
[3]まとめ
いかがでしょうか。
エラーハンドリングの部品として意外と使用します。