Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 测试或检查工作表是否存在_Excel_Vba_Scripting - Fatal编程技术网

Excel 测试或检查工作表是否存在

Excel 测试或检查工作表是否存在,excel,vba,scripting,Excel,Vba,Scripting,基本上,我循环浏览原始工作簿中的所有工作表,然后将目标工作簿中的destsheet设置为与原始工作簿中当前迭代的工作表同名的工作表 PublicFunctionSheetExists(strSheetNameAsString,OptionalwbWorkbookAsWorkbook)AsBoolean IfwbWorkbookIsNothingThenSetwbWorkbook=ActiveWorkbook'or ThisWorkbook - whichever appropriate Dimo

基本上,我循环浏览原始工作簿中的所有工作表,然后将目标工作簿中的
destsheet
设置为与原始工作簿中当前迭代的工作表同名的工作表

PublicFunctionSheetExists(strSheetNameAsString,OptionalwbWorkbookAsWorkbook)AsBoolean
IfwbWorkbookIsNothingThenSetwbWorkbook=ActiveWorkbook'or ThisWorkbook - whichever appropriate
DimobjAsObject
OnErrorGoToHandleError
Setobj=wbWorkbook.Sheets(strSheetName)
SheetExists=True
ExitFunction
HandleError:
SheetExists=False
EndFunction
如何测试该表是否存在?比如:

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

有些人不喜欢这种方法,因为错误处理的使用“不恰当”,但我认为它在VBA中被认为是可以接受的。。。另一种方法是循环遍历所有工作表,直到找到匹配项

If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then 

由于检查集合的成员是一个普遍问题,下面是Tim答案的抽象版本:

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
函数将(objCollection作为对象,strName作为字符串)包含为布尔值 作为对象的dimo 出错时继续下一步 集合o=对象集合(strName) 包含=(Err.Number=0) 呃,明白了 端函数 此功能可用于任何集合,如对象(
形状
范围
名称
工作簿
,等等)


要检查是否存在工作表,请使用
如果包含(工作表,“SheetName”)…

您不需要错误处理即可完成此操作。您只需迭代所有工作表并检查指定的名称是否存在:

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
将测试放在一个函数中,您将能够重用它,并且您有更好的代码可读性

不要使用“错误时继续下一步”,因为它可能与代码的其他部分冲突

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

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

在我的例子中,我想删除工作表,然后用相同的名称重新创建相同的工作表,但是如果程序无法删除工作表,因为它已经被删除,则代码被中断

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

我的解决方案看起来很像Tims,但也适用于非工作表-图表的情况

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

.

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

PublicFunctionSheetExists(strSheetNameAsString,OptionalwbWorkbookAsWorkbook)AsBoolean
IfwbWorkbookIsNothingThenSetwbWorkbook=ActiveWorkbook'or ThisWorkbook - whichever appropriate
DimobjAsObject
OnErrorGoToHandleError
Setobj=wbWorkbook.Sheets(strSheetName)
SheetExists=True
ExitFunction
HandleError:
SheetExists=False
EndFunction

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

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
更正: 无错误处理:

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

我做了另一件事:仅当工作表存在时才删除它-如果不存在,则不会出现错误:

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(间接(“SheetName!A1”)


如果工作簿包含一个名为
SheetName
的工作表,则返回
TRUE
,否则返回
FALSE

毫无疑问,上述函数可以工作,我只是得到了以下代码,它工作得非常好:

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

注意:
Sheets\u Name
是我要求用户输入名称的地方,因此这对您来说可能不一样。

很多年后,但我只需要这样做,不喜欢发布的任何解决方案。。。所以我编了一个,这都要归功于(海绵宝宝彩虹手势)“Evaluate()”的魔力

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

如果你是
工作表函数的粉丝。
或者你在非英语国家使用非英语Excel工作,这是一个很好的解决方案,可以:

Evaluate("IsError(" & vSheetName & "!1: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
或者在这样的函数中:

WorksheetFunction.IsErr(Evaluate("'" & wsName & "'!A1"))
将“数据”更改为您要测试的任何工作表名称

Function WorksheetExists(sName As String) As Boolean
    WorksheetExists = Not WorksheetFunction.IsErr(Evaluate("'" & sName & "'!A1"))
End Function
我写了这封信:

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
紧凑的
wsExists
功能(不依赖于错误处理!) 这里有一个简短的函数,它不依赖于错误处理来确定工作表是否存在(并且正确声明在任何情况下都可以工作!)


用法示例: 以下示例添加了一个名为
myNewSheet
的新工作表(如果它还不存在):

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

更多信息:
  • MSDN:
  • MSDN:
  • MSDN:

我想出了一个简单的方法,但我没有为它创建新的sub。相反,我只是在我正在工作的潜艇内“运行检查”。假设我们要查找的工作表名称为“sheet_Exist”,如果找到,我们只想激活它:

If Not wsExists("myNewSheet") Then Sheets.Add.Name = "myNewSheet"
Dim SheetCounter为整数
纸张计数器=1
直到工作表(SheetCounter)。Name=“Sheet_Exist”或SheetCounter=工作表。计数+1
纸张计数器=纸张计数器+1
环
如果SheetCounter

我还添加了一个弹出窗口,用于当工作表不存在时显示。

我知道这是一篇旧文章,但这里有另一个简单的解决方案,速度很快

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
Public Function工作表列表(ByVal wb作为工作簿,ByVal sheetNameStr作为字符串)为布尔值
出错时继续下一步
工作表列表=(wb.Worksheets(sheetNameStr.Name“”)
错误清除:错误转到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

逻辑:如果工作表存在,则索引将大于0,否则将为-1。

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

完全适当地使用IMO。这是一个陷阱,它被认为是存在的,没有,并且有很长的历史-cf perl strict,STAE等。UpvotedOne可能应该使用
ActiveWorkbook
而不是
ThisWorkbook
。后者指的是包含宏代码的工作簿,宏代码可能与要测试的工作簿不同。我猜
ActiveWorkbook
对于大多数情况都很有用(尽管人为的情况总是可用)。
sht Is Nothing
如果没有具有该名称的工作表,则将
True
,但如果有具有该名称的工作表,则我们希望返回
True
。如果您将一点重新安排到
SheetExists=sht并不是一无是处,这会稍微容易一些(但不是有效的),请注意,如果您运行此代码
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
Function IsSheet(n$) As Boolean
    IsSheet = Not IsError(Evaluate(n & "!a1"))
End Function
Function isSheetExist(sSheet As String) As Boolean
    On Error Resume Next
    isSheetExist = (ActiveWorkbook.Sheets(sSheet).Index > 0)
End Function