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

时间:2013-04-09 07:56:18

标签: excel vba excel-vba excel-2010

当用户在Excel中单击图像(按钮)时,我试图删除工作表。但是这会使excel崩溃并重新启动,忘记任何未保存的进度。

这是我的潜艇:

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

应用程序大部分时间都崩溃了。但并不总是......任何想法可能是错的? (我已经测试并确认删除功能会导致崩溃,但它并不总是相同的表格。)

编辑:此功能不会删除工作簿中的最后一个工作表。还有20张床单。我也使用Application.Calculation = xlCalculationAutomatic,因为有一些公式,我不希望excel在所有连接工作表被删除之前计算更改。

赞赏任何提示或答案:)

9 个答案:

答案 0 :(得分:6)

当启动宏的按钮位于其中一个要删除的工作表上时,会发生错误。

所以答案是:不要创建一个按钮(或链接到宏的图像)来删除它所在的工作表。

如果有人可以为此错误添加此答案,请执行此操作;)

答案 1 :(得分:3)

我自己也遇到过这个问题!我将推荐更有经验的设计师来改进这项技术,但作为一般概念,我确实有一个可行的解决方案:

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

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

答案 2 :(得分:2)

因为我遇到相同的问题并希望共享解决方案,所以恢复了该线程。

我有一个非常简单的子来删除工作表:

Sub deletetraindoc()
Dim ws As Worksheet

Application.ScreenUpdating = False

For Each ws In ThisWorkbook.Sheets

    'This if statement looks for any worksheet that contains the term "Form" 
    'Any worksheet that contains that string will be deleted
    If InStr(ws.Name, "Form") > 0 Then
            Application.DisplayAlerts = False 'Deactivates the standard deletion confirmation
            ws.Activate
            ws.Delete 'Deletes the worksheet
            Application.DisplayAlerts = True 'Reactivates display alerts
    End If
Next
Application.ScreenUpdating = True

End Sub

这一直导致崩溃,直到我添加行“ ws.Activate”以在删除之前激活每个工作表,这似乎已经解决了问题。在许多其他情况下,我在工作表上执行操作时也会遇到此问题,但通常会导致对象错误而不是完全崩溃。

答案 3 :(得分:1)

我发现在Office 2013中,您无法放置与该宏更改的单元格重叠的按钮。有趣的是,如果更改本质上是数字,则不会发生,但如果它是字母数字,则当您尝试删除该选项卡时,它会爆炸excel。事实证明,当尝试手动(通过鼠标单击)或尝试执行此操作的宏删除选项卡时,它会将其炸毁。因此,我从这个线程中学到的经验并将其应用到我的特定情况是永远不会在它更改的单元格上放置一个开发按钮(在我的情况下,它只是一个单元格,它给出了宏正在做什么的状态)。 Excel 2013不喜欢这种情况,而Excel 2010根本不关心。

答案 4 :(得分:0)

我相信你是对的,唯一的办法就是确保这个宏位于总计划表单上。此外,您正在执行一些不必要的步骤,选择一个工作表应该激活并选择一个单元格。

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

我有类似但不完全相同的问题。我有一个使用以下命令删除所有图表工作表的宏,但是虽然它运行正常,但是当我尝试保存文件时Excel 2013注定要失败,并且会通过恢复到以前保存的情况来“恢复”,扔掉任何后续工作:

哦,它工作正常,直到我离开,我认为是Excel 2010至2013年,同时更改为Windows 10。 厄运的命令是:

ThisWorkbook.Charts.Delete

感谢上面答案中的一些灵感,我首先在删除操作之前插入了一个保存,然后更改了删除如下(事实证明,保存不是所有需要的,但我喜欢将它们放在那里,即使我评论出来):

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来删除不想要的

  你确定要做这种类型的问题吗?

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

答案 7 :(得分:0)

我想要一个可以删除工作表的按钮,因为工作簿受到保护并且可以“导出”结果,但不能删除不需要的结果。

我的简单解决方法是让宏隐藏工作表,但是然后删除最后一个隐藏工作表,因此文件不会因数十个隐藏工作表而变得很大。

我在名为“ DeleteSheet”的隐藏工作表中创建了一个范围,以存储隐藏工作表的名称。


Sub Delete_Sheet()

ActiveWorkbook.Unprotect Password:="Patrick2017"

ActiveSheet.Unprotect Password:="Patrick2017"

On Error Resume Next

' (In event there is no hidden sheet or the sheet is already deleted, resume next)

'The below finds the name of the previously hidden sheet to delete, and stores it.

Dim DeleteSheet As String
DeleteSheet = Range("DeleteSheet")

'The below is to avoid the main sheet being deleted

If ActiveSheet.Name = "POAL Calculator" Then     
Exit Sub                                        
End If

' The below stores the current sheets name before hiding, for deleting next time the 
' macro is run

Range("DeleteSheet") = ActiveSheet.Name          
ActiveWindow.SelectedSheets.Visible = False 

' The below deletes the sheet previously hidden

Application.DisplayAlerts = False 
Sheets(DeleteSheet).Delete


ActiveWorkbook.Protect Password:="Patrick2017"
Application.DisplayAlerts = True

End Sub

答案 8 :(得分:0)

如何将按钮代码移动到模块上?

我在Excel 2016中遇到了一个问题,如果代码在模块中,则选项显式选项不起作用,但是如果代码在模块中,则“应该”可以删除工作表所在的工作表按钮是。