シートの存在チェック方法
VBAでシート関係の処理を行うことがあります。その際に、そのシートが存在しているのかチェックが必要な場合があります。チェック方法ですが、対象シート名のシートオブジェクトが取得できるかどうかで判定するようにします。
WorkBooksオブジェクトやWorkSheetsオブジェクトをループして対象シート名と一致するかチェックする方法もありますが、関係ないシートの処理を行うのはやはり無駄ですから避けた方がいいでしょうね。
ソースコード
非表示シートを存在するとみなすかどうか判定用
シートの表示状態には3種類あり、xlSheetVisible(表示)、xlSheetHidden(非表示)、xlSheetVeryHidden(再表示不可の非表示)があります。
シートが非表示の場合に、存在する、とするのか、存在しない、とするのかを決めるために3番目の引数を用意しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
'// 引数 '// sSheetName:チェック対象シート名 '// oWorkBook:チェック対象シートの存在チェック対象のワークブック '// iVisibleTarget:存在しないと判定するシート表示状態を指定する '// xlSheetVisible:表示状態は存在チェックに影響しない '// xlSheetHidden:非表示シートの場合は存在しないとみなす '// xlSheetVeryHidden:再表示不可の非表示シートの場合は存在しないとみなす Function IsExistSheet(sSheetName As String, Optional oWorkBook As Workbook = Nothing, Optional iVisibleTarget As Integer = xlSheetVisible) As Boolean '// シートが存在しない場合のエラー発生時も処理を継続する On Error Resume Next Dim sht As Worksheet '// シート Dim bSheetExist As Boolean '// シート存在(True:シートが存在する、False:存在しない) Dim ret As Boolean '// 関数戻り値(True:シートが存在する、False:存在しない) '// 引数ブックが未指定の場合は現在のブックを判定に利用する If (oWorkBook Is Nothing) Then Set oWorkBook = ActiveWorkbook End If '// シートオブジェクトを取得(エラー時も処理継続) Set sht = oWorkBook.Sheets(sSheetName) '// シート名未取得時(対象シートが存在しない場合) If (sht Is Nothing) Then bSheetExist = False Else bSheetExist = True End If '// 暫定として関数戻り値を設定 ret = bSheetExist '// シート表示状態が非表示は対象外とする場合 If (iVisibleTarget = xlSheetHidden) Then '// シート表示状態が非表示または再表示できない非表示の場合 If (sht.Visible = xlSheetHidden) Or (sht.Visible = xlSheetVeryHidden) Then '// 非表示シートのため存在しないものとみなす ret = False End If '// シート表示状態が再表示できない非表示を対象外とする場合 ElseIf (iVisibleTarget = xlSheetVeryHidden) Then '// シート表示状態が再表示できない非表示の場合 If (sht.Visible = xlSheetVeryHidden) Then '// 再表示できない非表示シートのため存在しないものとみなす ret = False End If End If IsExistSheet = ret End Function |
シートの表示状態の判定無し版
シートの状態に関係なく存在チェックを行うコードです。
上記の処理からシートの表示状態判定処理をはずしたものになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Function IsExistSheet2(sSheetName As String, Optional oWorkBook As Workbook = Nothing) As Boolean '// シートが存在しない場合のエラー発生時も処理を継続する On Error Resume Next Dim sht As Worksheet '// シート Dim ret As Boolean '// 関数戻り値(True:シートが存在する、False:存在しない) '// 引数ブックが未指定の場合は現在のブックを判定に利用する If (oWorkBook Is Nothing) Then Set oWorkBook = ActiveWorkbook End If '// シートオブジェクトを取得(エラー時も処理継続) Set sht = oWorkBook.Sheets(sSheetName) '// シート名未取得時(対象シートが存在しない場合) If (sht Is Nothing) Then ret = False Else ret = True End If IsExistSheet2 = ret End Function |
ソースコードの説明
処理の概要ですが、引数シート名のシートオブジェクトを取得できるかどうかで存在かどうかを判定しています。また、シートの表示状態が非表示の場合に存在すると判定するのかどうかに第3引数を利用します。
処理の先頭でOn Error Resume Nextを行っていますが、これは22行目のシートオブジェクトの取得でエラーが発生した場合も処理を継続するための措置です。エラーが発生した場合はそのシートが存在しないことを意味します。
25行目から29行目でシートの存在を判定しています。以降の処理で、第3引数(存在するとみなすシートの表示状態)の判定を行っています。
利用例
3種類の利用方法で上記関数を呼び出しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Sub IsExistSheetTest() Dim oWorkBook As Workbook '// ブック Dim sSheetName As String '// シート名 Dim ret '// 関数戻り値 '// ブック指定なし ret = IsExistSheet("Sheet2") Debug.Print ret '// ブック指定あり、表示状態指定なし Set oWorkBook = Workbooks("test.xlsm") ret = IsExistSheet("Sheet2", oWorkBook) Debug.Print ret '// ブック指定あり(Nothing)、表示状態は非表示は存在しないものとみなす ret = IsExistSheet("Sheet2", Nothing, xlSheetHidden) Debug.Print ret '// ブック指定なし ret = IsExistSheet2("Sheet2") Debug.Print ret '// ブック指定あり、表示状態指定なし Set oWorkBook = Workbooks("test.xlsm") ret = IsExistSheet2("Sheet2", oWorkBook) Debug.Print ret '// ブック指定あり(Nothing) ret = IsExistSheet2("Sheet2", Nothing) Debug.Print ret End Sub |