2

当用户单击 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 在删除所有连接的工作表之前计算更改。

任何提示或答案表示赞赏:)

4

9 回答 9

7

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

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

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

于 2013-04-09T09:19:46.830 回答
4

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

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

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

于 2015-04-17T19:05:30.067 回答
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”行来激活每个工作表,这似乎已经解决了这个问题。我在许多其他对工作表执行操作的情况下遇到了这个问题,但它通常会导致对象错误而不是完全崩溃。

于 2019-08-12T15:15:18.680 回答
1

我发现在 Office 2013 中,您不能放置与该宏更改的单元格重叠的按钮。有趣的是,如果更改本质上是数字,则不会发生这种情况,但如果是字母数字,当您尝试删除该选项卡时,它会炸毁 excel。事实证明,当尝试手动删除选项卡(通过鼠标单击)或宏尝试删除选项卡时,它会炸毁它。因此,我从该线程中吸取的教训并将其应用于我的具体情况是永远不要在它更改的单元格上放置一个开发按钮(在我的情况下,它只是一个提供宏正在执行的状态的单元格)。Excel 2013 不喜欢这种情况,而 Excel 2010 根本不在乎。

于 2014-11-15T17:32:07.247 回答
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
于 2013-04-09T12:10:01.207 回答
0

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

ActiveSheet.Move before:=Worksheets(1)
Worksheets(2).Activate
Worksheets(1).Delete
于 2014-11-05T01:33:25.607 回答
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

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

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

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

于 2016-11-29T22:19:03.707 回答
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
于 2018-07-10T22:38:56.233 回答
0

将按钮代码移动到模块中怎么样?

我在 Excel 2016 中遇到了一个问题,如果代码在模块中,Option explicit 不起作用,但如果代码在模块中,那么您“应该”能够删除按钮所在的工作表。

于 2018-12-19T09:43:26.460 回答