删除工作表(如果存在)并创建一个新工作表

时间:2016-10-23 18:09:04

标签: excel vba excel-vba

我想查看我的Excel工作表并查找具有特定名称的工作表,并删除该工作表(如果找到)。之后我想在具有该名称的所有现有工作表之后创建工作表。我的代码如下:

For Each ws In Worksheets
    If ws.Name = "asdf" Then
        Application.DisplayAlerts = False
        Sheets("asdf").Delete
        Application.DisplayAlerts = True
        End
    End If
Next

Sheets.Add(After:=Sheets(Sheets.count)).Name = "asdf"

但是,这不会在一次代码运行中执行这两个操作。如果工作表已经存在,它将只删除工作表而不是像我想要的那样制作一个新工作表。我需要再次运行它来创建一个新的。

如何修复我的代码以删除旧工作表(如果存在并创建新工作表)?

3 个答案:

答案 0 :(得分:9)

您可以尝试并获取项目中的项目,而不是循环遍历Worksheets

Function GetWorksheet(shtName As String) As Worksheet
    On Error Resume Next
    Set GetWorksheet = Worksheets(shtName)
End Function

If Not GetWorksheet("asdf") Is Nothing Then
    Application.DisplayAlerts = False
    Worksheets("asdf").Delete
    Application.DisplayAlerts = True
End If
Worksheets.Add(After:=sheets(sheets.Count)).name = "asdf"

但是,最直接的方法是尝试在On Error Resume Next - On Error GoTo 0“块”中包含时删除工作表:

Application.DisplayAlerts = False
On Error Resume Next
Worksheets("asdf").Delete
On Error GoTo 0
Application.DisplayAlerts = True
Worksheets.Add(After:=sheets(sheets.Count)).name = "asdf"

答案 1 :(得分:7)

删除End语句后,您的代码会在找到并删除工作表asdf后终止。

For Each ws In Worksheets
    If ws.Name = "asdf" Then
        Application.DisplayAlerts = False
        Sheets("asdf").Delete
        Application.DisplayAlerts = True
    End If
Next

Sheets.Add(After:=Sheets(Sheets.count)).Name = "asdf"

答案 2 :(得分:-1)

我不同意“最直接的” 方法是有意产生(并抑制)错误。我个人会选择“循环定位”方法,仅在对象存在时尝试删除。

如果您仍然要重新创建工作表,则几乎在每种情况下都可以完成工作:

Sheets("asdf").Cells.Delete  'deletes all cells in the specified worksheet

安全删除工作表

如果单线(以上)对您不起作用(可能是由于某些顽固的背景颜色/图像所致),则可以使用以下子项来删除任何指定的工作表:

Sub deleteSheet(wsName As String)
  Dim ws As Worksheet
  For Each ws In ThisWorkbook.Sheets 'loop to find sheet (if it exists)
    Application.DisplayAlerts = False 'hide confirmation from user
    If ws.Name = wsName Then ws.Delete 'found it! - delete it
    Application.DisplayAlerts = True 'show future confirmations
  Next ws
End Sub

简单地称呼它:

deleteSheet "asdf"

......,其中asdf是要删除的工作表(标签)的名称。


删除并替换工作表

或者,调用下面的子目录将删除并替换工作表,为其赋予相同的名称并将其置于与原始表相同的选项卡位置:

Sub resetSheet(wsName As String)
  Dim ws As Worksheet, ws2 As Worksheet
  For Each ws In ThisWorkbook.Sheets        'loop to find sheet (if it exists)
    If ws.Name = wsName Then                'found it!
      Set ws2 = ThisWorkbook.Sheets.Add(ws) 'add new sheet located before old one
      Application.DisplayAlerts = False     'hide confirmation from user
      ws.Delete                             'delete sheet (new one takes its place)
      Application.DisplayAlerts = True      'show future confirmations
      ws2.Name = wsName                     'rename new sheet to old name
      Exit Sub                              'finished! (no need to continue looping)
    End If
  Next ws
End Sub

关于 ThisWorkbook

我在两个子目录中都使用了ThisWorkbook,这在运行修改其他工作簿的VBA或同时打开多个工作簿时非常重要。

使用ThisWorkbook可确保您的代码始终引用该代码所在的工作簿。

例如,如果没有打开它,则如果有两个相似的文件打开,并且正在等待VBA在另一工作簿中运行时正在查看一个文件,那么“在最上面”的工作簿中有一个试图删除的一个VBA的名称,它将删除当前(活动)工作簿中的工作表,而不是预期的工作表。

(...并且您不能 Ctrl + Z 撤消VBA!)