使用VBA从Excel文件中删除工作表

时间:2019-03-14 19:01:41

标签: excel vba

我正在尝试从activeWorkbook中删除所有不必要的工作表,但是我要删除Sheet1,因为这将是我的主要工作表,其中包含初始原始数据。当我运行以下代码时,我的工作表将被删除,但是一旦到达我最后剩下的工作表,我就会收到此错误。运行时错误'1004':工作簿必须至少包含一个可见的工作表。 仅供参考:我正在个人宏书中编写此宏,以便可以将其用于所有其他excel电子表格。

Sub deleteSheets()

Dim ws As Worksheet

   Application.DisplayAlerts = False

   For Each ws In ActiveWorkbook.Worksheets
      If Not ws Is Sheet1 Then ws.Delete
   Next ws

End Sub

2 个答案:

答案 0 :(得分:2)

If Not ws Is Sheet1 Then ws.Delete

布尔表达式{object1} Is {object2}评估引用相等性:如果True{object1},它将为{object2}

这里wsActiveWorkbook中的工作表,Sheet1是(可能是)全局标识符,它引用了{{1}中存在的工作表的CodeName }-可能不是当前活动的工作簿。

如果ThisWorkbook不是ThisWorkbook,则对每个工作表的引用相等都将失败,并且该循环将尝试将其全部删除,这就是您得到该错误的原因。

除非您要删除ActiveWorkbook中的工作表,否则不能使用引用等式进行检查。

您可以go by Index,也可以按名称-在任何情况下,确保正在使用的工作簿中不止一个工作表是一个好主意:

ThisWorkbook

确认您要删除的工作表具有预期的索引(For Each ws In ActiveWorkbook.Worksheets Debug.Assert ActiveWorkbook.Worksheets.Count > 1 If Not ws.Name = "Sheet1" Then ws.Delete Next )和/或预期的名称;为此使用项目浏览器(Ctrl + R)和属性(F4)工具窗口。请记住,1属性是工作表的(Name)标识符,您只能在CodeName的VBA项目中使用/访问它;您需要验证其ThisWorkbook属性-这是工作表的用户可修改的“标签名称”。

答案 1 :(得分:1)

dim i as Integer
dim ws as Worksheet

For i = 2 to ActiveWorkbook.Worksheets.Count
   Sheets(2).Delete
Next