如果工作表“数据”不存在,则代码可以正常工作,如果确实存在,则出现错误“名称已存在,请尝试使用其他名称”。我已经用On Error GoTo ErrorHandler
修复了这个问题,但是问题是,代码运行后,宏触发了错误处理程序msgbox,无论如何,它仍然会创建一个新工作表(名称为'Sheet1,2,3,。 ..')。
摘要:
Sub AddWorkSheet()
Dim wb As Workbook, shtDest As Worksheet
On Error GoTo ErrorHandler
Sheets.Add.Name = ("Data")
Set shtDest = Sheets("Data")
ErrorHandler:
MsgBox ("Something went wrong."), vbCritical
End Sub
我希望代码简单地返回消息框,并且如果表单“数据”已经存在,则不创建任何其他表单。
答案 0 :(得分:1)
当您尝试为变量分配不存在的工作表时,VBA将返回错误9。从我的POV中,我认为捕获该错误并在需要时创建工作表很有用。
所以我会用:
Sub AddWorkSheet()
Dim wb As Workbook, shtDest As Worksheet
On Error GoTo ErrorHandler
Set shtDest = Sheets("Data")
'<--rest of your code-->
'
'
'
'
'
'
''<--rest of your code-->
Set shtDest = Nothing
Set wb = Nothing
Exit Sub
ErrorHandler:
If Err.Number = 9 Then
'must create worksheet DATA
Sheets.Add.Name = ("Data")
Set shtDest = Sheets("Data")
Resume Next
Else
'different error. MSgbox with new error
MsgBox Err.Description, vbCritical, Err.Number
Stop
End If
End Sub
请注意,在ErrorHanlder
部分的前面,我添加了Exit Sub
以避免每次子程序运行时都执行这部分代码。
答案 1 :(得分:0)
(编辑:该答案的先前版本产生了错误的结果,注释中有详细信息。)
这应该有效。请注意,结合使用On Error Resume Next
和On Error GoTo 0
而不是On Error GoTo ErrorHandler
。 (GoTo语句通常与so-called "spaghetti code"相关联,因此在可能的情况下最好避免使用它们。)
Sub AddWorkSheet()
Dim wb As Workbook, ws As Worksheet
On Error Resume Next
Set ws = Worksheets("Data")
If Err.Number <> 9 Then ' 9 means subscript out of range
MsgBox ("Sheet already exists."), vbCritical
Else
Sheets.Add After:=Worksheets(Worksheets.Count)
Sheets(Worksheets.Count).Name = "data"
End If
On Error GoTo 0
End Sub
在您的原始代码中,您可以在错误处理程序之前添加一个Exit Sub
语句;没有它的ErrorHandler
将始终被调用。 (您可能想看看documentation。)。
答案 2 :(得分:0)
在添加工作表之前,请检查其是否存在:
Function ShtExist(ShtName As String) As Boolean
On Error Resume Next
ShtExist = Len(ThisWorkbook.Sheets(ShtName).Name) > 0
On Error GoTo 0
End Function
Sub AddWorkSheet()
Dim wb As Workbook, shtDest As Worksheet
If ShtExist("Data") Then
MsgBox ("Something went wrong."), vbCritical
Else
Sheets.Add.Name = ("Data")
Set shtDest = Sheets("Data")
End If
End Sub