使用VBA删除工作表会导致Excel崩溃

我试图删除工作表,当用户点击在Excel中的图像(button)。 但是,这使得excel崩溃和重启,忘记了任何未保存的进度。

这是我的sub:

Sub DeletePlan() Application.Calculation = xlCalculationManual Application.DisplayAlerts = False Dim SheetNamesToCopy As String SheetNamesToCopy = ActiveSheet.Name ' Check what addon sheets exists for the media, then add existing ones to string If CheckSheet("periodeplan", True) = True Then ThisWorkbook.SheetS(SheetNamesToCopy & " - periodeplan").Delete End If If CheckSheet("ukesplan", True) = True Then ThisWorkbook.SheetS(SheetNamesToCopy & " - ukesplan").Delete End If If CheckSheet("Input", True) = True Then ThisWorkbook.SheetS(SheetNamesToCopy & " - Input").Delete End If SheetS("Totalplan").Select ThisWorkbook.SheetS(SheetNamesToCopy).Delete Application.DisplayAlerts = True Application.Calculation = xlCalculationAutomatic End Sub 

应用程序大部分时间崩溃。 但并不总是…任何想法可能是错的? (我已经testing并确认删除function导致崩溃,但它并不总是相同的表)。

编辑:此function不删除工作簿中的最后一个工作表。 还有20多张。 我也使用Application.Calculation = xlCalculationAutomatic ,因为有公式的分配,我不想Excel的计算变化之前,所有连接表被删除。

任何提示或答案赞赏:)

当启动macros的button位于要删除的工作表之一时,会发生错误。

所以答案是:不要创build一个button(或者链接到一个macros的图像)来删除它所在的工作表。

如果有人可以添加到这个答案与此错误的原因,请这样做;)

我自己就遇到了这个问题! 我将推迟到更有经验的devise师来完善这种技术,但作为一个普遍的概念,我有一个工作的解决scheme:

如果您允许macros运行它,然后删除工作表,它不会崩溃。 像这样的东西:

 Sub Delete_This_Sheet() Application.OnTime Now + TimeValue("00:00:02"), "Watergate" Sheets("Sheet with a death sentence").Visible = False End Sub Sub Watergate() 'To make things go away Application.DisplayAlerts = False Sheets("Sheet with a death sentence").Delete Application.DisplayAlerts = True End Sub 

我发现在Office 2013中,不能放置与该macros更改的单元格重叠的button。 有趣的是,如果变化本质上是数字,则不会发生,但是如果它是字母数字,当您试图删除该选项卡时,会发生变化。 事实certificate,当试图手动删除选项卡(通过鼠标点击)或macros尝试删除选项卡时,就会炸掉它。 THUS,我从这个线程中学到的教训,并将其应用于我的具体情况是,永远不要在它改变的单元格上放置一个开发button(在我的例子中,它只是一个单元格,给出了这个macros正在做什么的状态)。 Excel 2013不喜欢这种情况,而Excel 2010根本不在乎。

我相信你是对的,唯一的办法是确保这个macros是在整个计划表上。 此外,你正在做一些不必要的步骤,select一个表应该是激活并select一个单元格。

 Sub DeletePlan() Application.Calculation = xlCalculationManual Application.DisplayAlerts = False Dim SheetNamesToCopy As String SheetNamesToCopy = ActiveSheet.Name 'dont delete total plan If sheetnames = "Totalplan" then exit sub SheetS("Totalplan").Activate Activesheet.Cells(1,1).select 'Turn off errors if sheet doesn't exist On error resume next ThisWorkbook.SheetS(SheetNamesToCopy & " - periodeplan").Delete ThisWorkbook.SheetS(SheetNamesToCopy & " - ukesplan").Delete ThisWorkbook.SheetS(SheetNamesToCopy & " - Input").Delete ThisWorkbook.SheetS(SheetNamesToCopy).Delete On error goto 0 Application.DisplayAlerts = True Application.Calculation = xlCalculationAutomatic End Sub 

可以从活动工作表上的button(或图像)删除活动工作表。 你只需要解决它。

 ActiveSheet.Move before:=Worksheets(1) Worksheets(2).Activate Worksheets(1).Delete 

我有一个类似的,但不完全相同的问题。 我有一个macros使用下面的命令删除了所有的图表,但是虽然运行正常,但Excel 2013注册失败,只要我试图保存文件,并通过恢复到以前保存的情况,“恢复”抛弃后续的工作:

哦,它工作得很好,直到我从Excel 2010移到了2013年,同时转换到了Windows 10。 厄运的命令是:

 ThisWorkbook.Charts.Delete 

从上面的答案中得到一些启发,我首先在删除操作之前插入了一个保存,然后按如下方式更改了删除(事实certificate,保存并不是最终需要的,但我喜欢将它们保存在那里,即使我将它们注释掉了):

 Dim graphSheet As Chart ActiveWorkbook.Save For Each graphSheet in this Workbook.Charts graphSheet.Delete ActiveWorkbook.Save Next graphSheet 

我还应该提到在for循环之前有一个前面的Application.DisplayAlerts = False ,当然在Next …语句之后Application.DisplayAlerts = True可以删除不需要的

你确定你想要做这个types的问题吗?

再次感谢您的贡献者的灵感。