使用VBA崩溃删除工作表Excel

问题描述:

我想在用户单击Excel中的图像(按钮)时删除工作表。但是,这使得excel崩溃并重新启动,忘记了任何未保存的进度。使用VBA崩溃删除工作表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在所有连接表被删除之前计算更改。

任何暗示或答案理解:)

+0

它在哪一行崩溃? – 2013-04-09 08:13:43

+0

如果您暂时关闭该行,它是否会崩溃:'Application.DisplayAlerts = False' – 2013-04-09 08:17:57

+0

@Olle它在删除表单的行上崩溃,但不是每次都崩溃。但是最后一次删除命令最常崩溃。 – 2013-04-09 08:31:44

发生错误时启动宏位于该要被删除的片材之一的按钮。

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

如果任何人都可以加入到这个答案有原因的错误,请这样做;)

+2

好点...不要删除你的父母;) – glh 2013-04-09 12:10:44

+0

真的,我猜测这个崩溃是因为我删除了一个被认为是这个宏的某种父对象的对象。因为它启动宏。可能是原因;) – 2013-04-09 12:23:57

+1

谢谢Ole。这让我疯狂。 在我之前(text_box是我的文本框对象)。 'text_box.OnAction = “user_done_click”' 现在我代替设置 'text_box.OnAction = “button_click”' 而加入该子 '私人小组button_click() Application.OnTime现在()+ TimeSerial的(0 ,0,1),“user_done_click” End Sub' – Fredrik 2017-01-05 12:01:05

我相信你的鼻孔权利,解决这个问题的唯一途径是确保这个宏是在总计划表。你也在做一些不必要的步骤,选择一个表格应该是激活并选择一个单元格。

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 
+0

我不完全同意你的看法。我创建了函数CheckSheet来检查表单是否存在(因为它通常不),我相信忽略错误来使代码工作是不好的做法。另外为什么我需要选择“Totalplan”内的单元格?这会改变什么吗? 错误是由于启动宏的按钮位于此宏中删除的最后一个工作表上而导致的。宏本身位于一个Module中,因此它独立于工作表本身。 – 2013-04-09 12:20:19

+0

这些实例相当普遍且非常可以接受的**不忽略**它,但预测错误,并让它滑动,但确保错误0恢复**。选择一个单元格可确保该工作表具有*阶段*。并且由于该按钮在**工作表上并且仍在运行宏,无论位置如何,当您删除它时,都会使其恢复正常。你有另一种方法来启动宏吗? – glh 2013-04-09 12:35:12

+0

是的,我添加了一个按钮到我用来创建工作表(及其相关工作表)副本的表单中。所以我现在工作:)有意义选择一个单元格。我会补充说,谢谢:) – 2013-04-09 12:38:07

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

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

我发现在Office 2013中,不能放置与该宏变化的单元格重叠的按钮。有趣的是,如果变化本质上是数字,则不会发生,但如果它是字母数字的,当您尝试删除该选项卡时,它会发生变化。事实证明,当试图手动删除选项卡(通过鼠标点击)或宏尝试删除选项卡时,会造成打击。 THUS,我从这个线程中学到的教训,并将其应用于我的具体情况,就是永远不会在它发生变化的单元格上放置一个开发按钮(在我的例子中,它仅仅是一个单元格,表示该宏所在的状态)。 Excel 2013不喜欢这种情况,而Excel 2010根本不在乎。

+0

这个“答案”实际上是一个新问题和这个问题的答案的组合。您应该将其中的一部分作为新问题和其他部分作为该问题的答案。 (是的,你可以回答你自己的问题)。这是有用的信息。我希望你确实将其转化为问题和答案。 – Makyen 2015-02-28 00:47:43

我刚碰到这个问题我自己!我将推迟到更有经验的设计师来完善这种技术,但作为一般概念,我确实有一个工作解决方案:

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

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

我也有类似,但不完全相同的问题。我有一个使用以下命令删除所有图表的宏,但是虽然它运行正常,但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的...语句删除不需要的

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

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