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
エラー処理の「不適切な」使用のためにこのアプローチを嫌う人もいますが、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
ワークシートのみに特に興味がある場合は、単純なEvaluate呼び出しを使用できます。
Function WorksheetExists(sName As String) As Boolean
WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function
これを実現するためにエラー処理は必要ありません。あなたがしなければならないのは、すべてのワークシートを反復処理し、指定された名前が存在するかどうかを確認することです。
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
コレクションのメンバーをチェックすることは一般的な問題なので、Timの答えを抽象化したものがここにあります。
関数には、(ObjectとしてのobjCollection、StringとしてのstrName)が含まれます。 オブジェクトとしてのdim o [Error]再開次へ =(Err.Number = 0) Err.Clear 終了関数
この関数はオブジェクト(Shapes
、Range
、Names
、Workbooks
など)のような任意のコレクションで使用できます。
シートの存在を確認するにはIf Contains(Sheets, "SheetName") ...
を使います。
修正済み:エラー処理なし
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
誰かがVBAを避けて、純粋にセル式の中にワークシートが存在するかどうかをテストしたい場合、ISREF
およびINDIRECT
関数を使用することが可能です。
=ISREF(INDIRECT("SheetName!A1"))
ワークブックにTRUE
というシートが含まれている場合はSheetName
が返され、それ以外の場合はFALSE
が返されます。
私はこれを書いた:
Function sheetExist(sSheet As String) As Boolean
On Error Resume Next
sheetExist = (ActiveWorkbook.Sheets(sSheet).Index > 0)
End Function
私の解決策は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
。
あなたがWorksheetFunction.
のファンであるか、あなたが英語以外の国の出身で、英語以外のExcelで働いているなら、これは良い解決策です、それはうまくいきます:
WorksheetFunction.IsErr(Evaluate("'" & wsName & "'!A1"))
またはこのような関数では:
Function WorksheetExists(sName As String) As Boolean
WorksheetExists = Not WorksheetFunction.IsErr(Evaluate("'" & sName & "'!A1"))
End Function
何年も経ったが、私はこれを実行する必要があり、投稿されたどのソリューションも気に入らなかった...それで、(SpongeBob Rainbowの手のジェスチャー) "Evaluate()"の魔法のおかげでこれを完成させた。
Evaluate("IsError(" & vSheetName & "!1:1)")
Sheetが存在しない場合はTRUEを返します。シートが存在する場合はFALSE。 "1:1"の代わりに好きな範囲を代入することができますが、単一のセルcuzにエラー(例えば#N/A)が含まれている場合は使用しないことをお勧めします。
テストを関数に入れると、再利用できるようになり、コードの読みやすさが向上します。
コードの他の部分と競合する可能性があるため、 "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
wsExists
name__関数 (withoutエラー処理への依存!)これは、ワークシートが存在するかどうかを判断するためにエラー処理に頼らない短くて単純な関数です(andはanyシチュエーションで動作するように正しく宣言されています!)
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
次の例では、myNewSheet
name__という名前の新しいワークシートが追加されていない場合は追加します。
If Not wsExists("myNewSheet") Then Sheets.Add.Name = "myNewSheet"
For Each
…Next
name__ステートメント(VBA)Exit
name__ステートメント(VBA)名前付きワークシートが存在するかどうかを判断するために小さなループを使用しないでください。現在開いているブックで "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
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
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
私は別のことをしました:それが存在する場合にのみシートを削除します - それが存在しない場合でもエラーにならないように:
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
あなたがテストしているどんなシート名にでも "データ"を変更してください...
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
上記の関数が機能することは疑いなく、私は結構うまくいく以下のコードにたどり着きました:
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
は私がユーザーに名前を入力するように頼むところです、従ってこれはあなたにとって同じではないかもしれません。
私はそれが古い投稿であることを知っています、しかしここに速くあるもう一つの簡単な解決策があります。
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
簡単な方法を思いついたのですが、新しい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
シートが存在しない場合のポップアップも追加しました。