web-dev-qa-db-ja.com

シートが存在するかどうかをテストまたは確認する

Dim wkbkdestination As Workbook
Dim destsheet As Worksheet

For Each ThisWorkSheet In wkbkorigin.Worksheets 
    'this throws subscript out of range if there is not a sheet in the destination 
    'workbook that has the same name as the current sheet in the Origin workbook.
    Set destsheet = wkbkdestination.Worksheets(ThisWorkSheet.Name) 
Next

基本的に私はOriginのワークブックの全てのシートをループしてから、Originのワークブックで現在繰り返されているものと同じ名前のコピー先のワークブックのdestsheetを設定します。

そのシートが存在するかどうかどうすればテストできますか?何かのようなもの:

If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then 
96
yse

エラー処理の「不適切な」使用のためにこのアプローチを嫌う人もいますが、VBAでは許容できると考えています...代わりのアプローチは、一致するものが見つかるまですべてのシートをループ処理することです。

Function WorksheetExists(shtName As String, Optional wb As Workbook) As Boolean
    Dim sht As Worksheet

    If wb Is Nothing Then Set wb = ThisWorkbook
    On Error Resume Next
    Set sht = wb.Sheets(shtName)
    On Error GoTo 0
    WorksheetExists = Not sht Is Nothing
End Function
146
Tim Williams

ワークシートのみに特に興味がある場合は、単純なEvaluate呼び出しを使用できます。

Function WorksheetExists(sName As String) As Boolean
    WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function
90
Rory

これを実現するためにエラー処理は必要ありません。あなたがしなければならないのは、すべてのワークシートを反復処理し、指定された名前が存在するかどうかを確認することです。

For i = 1 To Worksheets.Count
    If Worksheets(i).Name = "MySheet" Then
        exists = True
    End If
Next i

If Not exists Then
    Worksheets.Add.Name = "MySheet"
End If
39
fbonetti

コレクションのメンバーをチェックすることは一般的な問題なので、Timの答えを抽象化したものがここにあります。

関数には、(ObjectとしてのobjCollection、StringとしてのstrName)が含まれます。
オブジェクトとしてのdim o [Error]再開次へ
 =(Err.Number = 0)
 Err.Clear 
終了関数

この関数はオブジェクト(ShapesRangeNamesWorkbooksなど)のような任意のコレクションで使用できます。

シートの存在を確認するにはIf Contains(Sheets, "SheetName") ...を使います。

19
Peter Albert

修正済み:エラー処理なし

Function CheckIfSheetExists(SheetName As String) As Boolean
      CheckIfSheetExists = False
      For Each WS In Worksheets
        If SheetName = WS.name Then
          CheckIfSheetExists = True
          Exit Function
        End If
      Next WS
End Function
15
Shai Alon

誰かがVBAを避けて、純粋にセル式の中にワークシートが存在するかどうかをテストしたい場合、ISREFおよびINDIRECT関数を使用することが可能です。

=ISREF(INDIRECT("SheetName!A1"))

ワークブックにTRUEというシートが含まれている場合はSheetNameが返され、それ以外の場合はFALSEが返されます。

12
VirtualMichael

私はこれを書いた:

Function sheetExist(sSheet As String) As Boolean
On Error Resume Next
sheetExist = (ActiveWorkbook.Sheets(sSheet).Index > 0)
End Function
6
AOBR

私の解決策はTimsによく似ていますが、ワークシート以外のシートの場合にも機能します - チャート

Public Function SheetExists(strSheetName As String, Optional wbWorkbook As Workbook) As Boolean
    If wbWorkbook Is Nothing Then Set wbWorkbook = ActiveWorkbook 'or ThisWorkbook - whichever appropriate
    Dim obj As Object
    On Error GoTo HandleError
    Set obj = wbWorkbook.Sheets(strSheetName)
    SheetExists = True
    Exit Function
HandleError:
    SheetExists = False
End Function

5
uildriks

あなたがWorksheetFunction.のファンであるか、あなたが英語以外の国の出身で、英語以外のExcelで働いているなら、これは良い解決策です、それはうまくいきます:

WorksheetFunction.IsErr(Evaluate("'" & wsName & "'!A1"))

またはこのような関数では:

Function WorksheetExists(sName As String) As Boolean
    WorksheetExists = Not WorksheetFunction.IsErr(Evaluate("'" & sName & "'!A1"))
End Function
2
Vityata

何年も経ったが、私はこれを実行する必要があり、投稿されたどのソリューションも気に入らなかった...それで、(SpongeBob Rainbowの手のジェスチャー) "Evaluate()"の魔法のおかげでこれを完成させた。

Evaluate("IsError(" & vSheetName & "!1:1)")

Sheetが存在しない場合はTRUEを返します。シートが存在する場合はFALSE。 "1:1"の代わりに好きな範囲を代入することができますが、単一のセルcuzにエラー(例えば#N/A)が含まれている場合は使用しないことをお勧めします。

2
X37V

テストを関数に入れると、再利用できるようになり、コードの読みやすさが向上します。

コードの他の部分と競合する可能性があるため、 "On Error Resume Next"は使用しないでください。

Sub DoesTheSheetExists()
    If SheetExist("SheetName") Then
        Debug.Print "The Sheet Exists"
    Else
        Debug.Print "The Sheet Does NOT Exists"
    End If
End Sub

Function SheetExist(strSheetName As String) As Boolean
    Dim i As Integer

    For i = 1 To Worksheets.Count
        If Worksheets(i).Name = strSheetName Then
            SheetExist = True
            Exit Function
        End If
    Next i
End Function
2
Martin Carlsson

コンパクトなwsExistsname__関数 withoutエラー処理への依存!)

これは、ワークシートが存在するかどうかを判断するためにエラー処理に頼らない短くて単純な関数です(andanyシチュエーションで動作するように正しく宣言されています!)

Function wsExists(wsName As String) As Boolean
    Dim ws: For Each ws In Sheets
    wsExists = (wsName = ws.Name): If wsExists Then Exit Function
    Next ws
End Function

使用例

次の例では、myNewSheetname__という名前の新しいワークシートが追加されていない場合は追加します。

If Not wsExists("myNewSheet") Then Sheets.Add.Name = "myNewSheet"

詳しくは:

2
ashleedawg

名前付きワークシートが存在するかどうかを判断するために小さなループを使用しないでください。現在開いているブックで "Sheet1"という名前のワークシートを探しているとします。

Dim wb as Workbook
Dim ws as Worksheet

Set wb = ActiveWorkbook

For Each ws in wb.Worksheets

    if ws.Name = "Sheet1" then
        'Do something here
    End if

Next
2
ScottMcC
Public Function WorkSheetExists(ByVal strName As String) As Boolean
   On Error Resume Next
   WorkSheetExists = Not Worksheets(strName) Is Nothing
End Function

sub test_sheet()

 If Not WorkSheetExists("SheetName") Then
 MsgBox "Not available"
Else MsgBox "Available"
End If

End Sub
1
Philipp88
    For Each Sheet In Worksheets
    If UCase(Sheet.Name) = "TEMP" Then
    'Your Code when the match is True
        Application.DisplayAlerts = False
        Sheet.Delete
        Application.DisplayAlerts = True
    '-----------------------------------
    End If
Next Sheet
1
Shrikant

私は別のことをしました:それが存在する場合にのみシートを削除します - それが存在しない場合でもエラーにならないように:

Excel.DisplayAlerts = False 
Dim WS
For Each WS In Excel.Worksheets
    If WS.name = "Sheet2" Then
        Excel.sheets("Sheet2").Delete
        Exit For
    End If
Next
Excel.DisplayAlerts = True
1
Shai Alon

あなたがテストしているどんなシート名にでも "データ"を変更してください...

On Error Resume Next 

Set DataSheet = Sheets("Data")

If DataSheet Is Nothing Then

     Sheets.Add(after:=ActiveSheet).Name = "Data"
     ''or whatever alternate code you want to execute''
End If

On Error GoTo 0
1
gth826a

上記の関数が機能することは疑いなく、私は結構うまくいく以下のコードにたどり着きました:

Sub Sheet_exist ()
On Error Resume Next
If Sheets("" & Range("Sheet_Name") & "") Is Nothing Then
    MsgBox "doesnt exist"
Else
    MsgBox "exist"
End if
End sub

注:Sheets_Nameは私がユーザーに名前を入力するように頼むところです、従ってこれはあなたにとって同じではないかもしれません。

1
MAx Segura

私はそれが古い投稿であることを知っています、しかしここに速くあるもう一つの簡単な解決策があります。

Public Function worksheetExists(ByVal wb As Workbook, ByVal sheetNameStr As String) As Boolean

On Error Resume Next
worksheetExists = (wb.Worksheets(sheetNameStr).Name <> "")
Err.Clear: On Error GoTo 0

End Function
0
Guest

簡単な方法を思いついたのですが、新しいsubを作成しませんでした。代わりに、作業していたsub内で「チェックを実行した」だけです。探しているシート名が "Sheet_Exist"であると仮定し、見つかった場合はアクティブにします。

Dim SheetCounter As Integer

SheetCounter = 1

Do Until Sheets(SheetCounter).Name = "Sheet_Exist" Or SheetCounter = Sheets.Count + 1
 SheetCounter = SheetCounter +1
Loop
If SheetCounter < Sheets.Count + 1 Then
 Sheets("Sheet_Exist").Activate
Else
 MsgBox("Worksheet ""Sheet_Exist"" was NOT found")
End If

シートが存在しない場合のポップアップも追加しました。

0
imjordy23