yse*_*yse 102 excel scripting vba
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
Run Code Online (Sandbox Code Playgroud)
基本上,我遍历原始工作簿中的所有工作表,然后destsheet在目标工作簿中将其设置为与原始工作簿中当前迭代的工作表相同的工作表.
如何测试该表是否存在?就像是:
If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then
Run Code Online (Sandbox Code Playgroud)
Tim*_*ams 159
有些人不喜欢这种方法,因为错误处理的"不恰当"使用,但我认为它在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
Run Code Online (Sandbox Code Playgroud)
Ror*_*ory 94
如果您只对工作表感兴趣,可以使用简单的Evaluate调用:
Function WorksheetExists(sName As String) As Boolean
WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function
Run Code Online (Sandbox Code Playgroud)
fbo*_*tti 41
您无需进行错误处理即可完成此操作.您所要做的就是遍历所有工作表并检查指定的名称是否存在:
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
Run Code Online (Sandbox Code Playgroud)
Pet*_*ert 21
检查集合成员是一个普遍的问题,这是蒂姆答案的抽象版本:
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") ...
Sha*_*lon 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
Run Code Online (Sandbox Code Playgroud)
Vir*_*ael 12
如果有人想要避免VBA并测试工作表是否纯粹存在于单元格公式中,则可以使用ISREF和INDIRECT函数:
=ISREF(INDIRECT("SheetName!A1"))
TRUE如果工作簿包含一个被调用的工作表SheetName,FALSE则返回此选项.
小智 8
我写了这个:
Function sheetExist(sSheet As String) As Boolean
On Error Resume Next
sheetExist = (ActiveWorkbook.Sheets(sSheet).Index > 0)
End Function
Run Code Online (Sandbox Code Playgroud)
小智 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 FunctionRun Code Online (Sandbox Code Playgroud)
.
wsExists功能(不依赖错误处理!)这是一个简短而简单的函数,它不依赖于错误处理来确定工作表是否存在(并且被正确声明为在任何情况下都可以工作!)
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
Run Code Online (Sandbox Code Playgroud)
下面的示例添加一个名为 的新工作表myNewSheet(如果它不存在):
If Not wsExists("myNewSheet") Then Sheets.Add.Name = "myNewSheet"
Run Code Online (Sandbox Code Playgroud)
For Each...Next声明(VBA)Exit声明(VBA)