我想查看我的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"
但是,这不会在一次代码运行中执行这两个操作。如果工作表已经存在,它将只删除工作表而不是像我想要的那样制作一个新工作表。我需要再次运行它来创建一个新的。
如何修复我的代码以删除旧工作表(如果存在并创建新工作表)?
答案 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!) >