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:
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