如果存在工作表,请不要添加其他工作表

时间:2018-11-07 09:29:11

标签: excel vba

如果工作表“数据”不存在,则代码可以正常工作,如果确实存在,则出现错误“名称已存在,请尝试使用其他名称”。我已经用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

我希望代码简单地返回消息框,并且如果表单“数据”已经存在,则不创建任何其他表单。

3 个答案:

答案 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 NextOn 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