测试或检查是否存在纸张

时间:2011-07-14 03:23:53

标签: excel vba scripting

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

基本上,我遍历原始工作簿中的所有工作表,然后将目标工作簿中的destsheet设置为与原始工作簿中当前迭代的工作表相同的工作表。

如何测试该表是否存在?类似的东西:

If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then 

23 个答案:

答案 0 :(得分:144)

有些人不喜欢这种方法,因为错误处理的“不合适”使用,但我认为它在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

答案 1 :(得分:86)

如果您只对工作表感兴趣,可以使用简单的评估调用:

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

答案 2 :(得分:37)

您无需进行错误处理即可完成此操作。您所要做的就是遍历所有工作表并检查指定的名称是否存在:

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

答案 3 :(得分:20)

由于检查集合成员是一个普遍问题,这里是蒂姆答案的抽象版本:

Function Contains(objCollection As Object, strName as String) As Boolean
    Dim o as Object
    On Error Resume Next
    set o = objCollection(strName)
    Contains = (Err.Number = 0)
    Err.Clear
 End Function

此功能可用于任何集合,如对象(ShapesRangeNamesWorkbooks等。)

要检查是否存在工作表,请使用If Contains(Sheets, "SheetName") ...

答案 4 :(得分:15)

<强> 修正: 没有错误处理:

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

答案 5 :(得分:12)

如果有人想要避免使用VBA并测试工作表是否完全存在于单元格公式中,则可以使用ISREFINDIRECT函数:

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

如果工作簿包含名为TRUESheetName的工作表,则会返回FALSE

答案 6 :(得分:6)

我写了这个:

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

答案 7 :(得分:5)

我的解决方案看起来很像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

答案 8 :(得分:2)

为什么不使用一个小循环来确定命名的工作表是否存在?假设您正在寻找名为&#34; Sheet1&#34;的工作表。在当前打开的工作簿中。

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

答案 9 :(得分:2)

压缩wsExists函数 没有依赖于错误处理!)

这是一个简短的&amp;简单的函数不依赖于错误处理来确定是否存在工作表(已正确声明在任何情况下工作!)

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的新工作表,如果它尚未存在:

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

更多信息:

答案 10 :(得分:2)

将测试放在一个函数中,您将能够重用它,并且您具有更好的代码可读性。

请勿使用“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

答案 11 :(得分:2)

如果您是WorksheetFunction.的粉丝,或者您是非英语国家/地区的非英语国家/地区,那么这是一个很好的解决方案,可行:

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

或者在这样的函数中:

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

答案 12 :(得分:2)

很晚很多年了,但我只是需要这样做并且不喜欢发布的任何解决方案......所以我做了一个,都归功于(SpongeBob彩虹手势)的魔力“评估()” !

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

如果Sheet不存在,则返回TRUE;如果表存在,则为FALSE。 您可以用“1:1”代替您喜欢的任何范围,但我建议不要使用单个单元格,因为如果它包含错误(例如,#N / A),它将返回True。

答案 13 :(得分:1)

    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

答案 14 :(得分:1)

更改&#34;数据&#34;到你正在测试的任何工作表名称......

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

答案 15 :(得分:1)

毫无疑问上述功能可以正常工作,我最后得到了以下代码,效果非常好:

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是我要求用户输入名称的地方,所以这可能与你不一样。

答案 16 :(得分:1)

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

答案 17 :(得分:1)

我做了另一件事:只有在它存在的情况下删除一张纸 - 如果不存在则不会出现错误:

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

答案 18 :(得分:0)

我想出了一个简单的方法,但我没有为它创建一个新的子。相反,我只是在我正在处理的子中“运行检查”。假设我们要查找的工作表名称是“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

我还在工作表不存在时添加了一个弹出窗口。

答案 19 :(得分:0)

我知道这是一篇老文章,但这是另一个快速的简单解决方案。

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

答案 20 :(得分:0)

短而干净:

Function IsSheet(n$) As Boolean
    IsSheet = Not IsError(Evaluate(n & "!a1"))
End Function

答案 21 :(得分:0)

如果需要,我使用此函数检查并返回新的工作表名称。 WSname 是所需的工作表名称,WBCur 是您要签入的工作簿。我使用它是因为不需要错误处理,并且可以在我创建新工作表时调用它。

Public Function CheckNewWorksheetName(WSName As String, WBCur As Workbook) 'Will return New Name if needed
    Dim NewWSNum As Long, A As Integer, B As Integer, WorksheetFound As Boolean
    NewWSNum = 1
    WorksheetFound = False
    For A = 1 To WBCur.Worksheets.Count
        If WBCur.Worksheets(A).Name = WSName Then
            A = WBCur.Worksheets.Count
            WorksheetFound = True
        End If
    Next A
    
    If WorksheetFound = False Then
        CheckNewWorksheetName = WSName
    Else
        Do While WorksheetFound = True
            WorksheetFound = False
            For B = 1 To WBCur.Worksheets.Count
                If WBCur.Worksheets(B).Name = WSName & "_" & NewWSNum Then
                    B = WBCur.Worksheets.Count
                    WorksheetFound = True
                    NewWSNum = NewWSNum + 1
                End If
            Next B
        Loop
        CheckNewWorksheetName = WSName & "_" & NewWSNum
    End If
End Function

答案 22 :(得分:-3)

我实际上有一种简单的方法来检查工作表是否存在,然后执行一些指令:

在我的情况下,我想要删除工作表,然后重新创建具有相同名称的相同工作表,但如果程序无法删除已删除的工作表,则代码被中断

Sub Foo ()

    Application.DisplayAlerts = False

    On Error GoTo instructions
    Sheets("NAME OF THE SHEET").Delete

    instructions:

    Sheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "NAME OF THE SHEET"

End Sub