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
答案 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
此功能可用于任何集合,如对象(Shapes
,Range
,Names
,Workbooks
等。)
要检查是否存在工作表,请使用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并测试工作表是否完全存在于单元格公式中,则可以使用ISREF
和INDIRECT
函数:
=ISREF(INDIRECT("SheetName!A1"))
如果工作簿包含名为TRUE
和SheetName
的工作表,则会返回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