Excel VBA如果存在WorkSheet("wsName")

Mat*_*les 39 excel vba

我想知道如果存在工作簿中的工作表,是否存在返回True或False的清除功能?

如果可以在不跳过错误处理的情况下完成它,那将是好的,但不是必需的.

我发现的唯一的东西并不真正起作用:

On Error Resume Next
If (Worksheets("wsName").Name <> "") Then
    Debug.Print "Worksheet exists!"
Else
    Debug.Print "Worksheet doesn't exist!"
End If
On Error GoTo ErrHandler
Run Code Online (Sandbox Code Playgroud)

Dan*_*ode 79

没有错误处理的版本:

Function sheetExists(sheetToFind As String) As Boolean
    sheetExists = False
    For Each sheet In Worksheets
        If sheetToFind = sheet.name Then
            sheetExists = True
            Exit Function
        End If
    Next sheet
End Function
Run Code Online (Sandbox Code Playgroud)

  • +1 No`On Error Resume Next`,这就是我要找的. (3认同)
  • @Dante不是希腊人.如果我们调暗'ws'不是更好吗? (3认同)

Tim*_*ams 29

这没有内置功能.

Function SheetExists(SheetName As String, Optional wb As Excel.Workbook)
   Dim s As Excel.Worksheet
   If wb Is Nothing Then Set wb = ThisWorkbook
   On Error Resume Next
   Set s = wb.Sheets(SheetName)
   On Error GoTo 0
   SheetExists = Not s Is Nothing
End Function
Run Code Online (Sandbox Code Playgroud)

  • 我不同意ActiveWorkbook提供了一个更好的"默认"案例 - 在实践中,依赖于任何特定的工作簿(或工作表)是活动的,你的例程操作"正确"的对象会导致脆弱的代码.总是更好地传递对象的引用,而不是依赖于ActiveXXXX.我使用`ThisWorkbook`作为默认值,因为如果你刚刚调用`Sheets()`*而没有*任何工作簿限定符,那就是你得到的相同行为 - 即."最简单"的案例. (7认同)
  • 谢谢,看起来不错.我先用这个,它也有魅力. (3认同)
  • 人们应该使用`ActiveWorkbook`而不是`ThisWorkbook`.后者指的是包含宏代码的工作簿,它可能与工作簿不同,而不是想要测试的.我猜`ActiveWorkbook`对大多数情况都很有用(但是设计的情况总是可用的). (2认同)

小智 8

也是一个略有不同的版本.我刚刚做了一个appllication.sheets.count来了解我还有多少工作表.好吧,并进行一点重命名

Sub insertworksheet()
    Dim worksh As Integer
    Dim worksheetexists As Boolean
    worksh = Application.Sheets.Count
    worksheetexists = False
    For x = 1 To worksh
        If Worksheets(x).Name = "ENTERWROKSHEETNAME" Then
            worksheetexists = True
            'Debug.Print worksheetexists
            Exit For
        End If
    Next x
    If worksheetexists = False Then
        Debug.Print "transformed exists"
        Worksheets.Add after:=Worksheets(Worksheets.Count)
        ActiveSheet.Name = "ENTERNAMEUWANTTHENEWONE"
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)


Eri*_* K. 6

该函数的另一个版本没有错误处理.这次它不区分大小写并且效率更高一些.

Function WorksheetExists(wsName As String) As Boolean
    Dim ws As Worksheet
    Dim ret As Boolean        
    wsName = UCase(wsName)
    For Each ws In ThisWorkbook.Sheets
        If UCase(ws.Name) = wsName Then
            ret = True
            Exit For
        End If
    Next
    WorksheetExists = ret
End Function
Run Code Online (Sandbox Code Playgroud)