【发布时间】:2012-02-13 23:20:47
【问题描述】:
我有一个触发一连串事件的按钮。其中一个事件是删除工作表。在用户删除任何内容之前,我会弹出我的自定义“是/否”消息,要求他们确认整个过程。
然后是删除工作表的子事件,Excel会弹出自己的窗口确认删除工作表。问题是,如果用户此时说“不”,这会使我的应用程序处于不一致的状态。
如何绕过 Excel 要求确认删除工作表?
【问题讨论】:
我有一个触发一连串事件的按钮。其中一个事件是删除工作表。在用户删除任何内容之前,我会弹出我的自定义“是/否”消息,要求他们确认整个过程。
然后是删除工作表的子事件,Excel会弹出自己的窗口确认删除工作表。问题是,如果用户此时说“不”,这会使我的应用程序处于不一致的状态。
如何绕过 Excel 要求确认删除工作表?
【问题讨论】:
您可以使用以下方法更改 Excel 的默认显示警报参数:
Application.DisplayAlerts = False
不要忘记在流程结束时恢复标准行为:
Application.DisplayAlerts = True
【讨论】:
True。即oldvalue = Application.DisplayAlerts、Application.DisplayAlerts = False、sheet.Delete、Application.DisplayAlerts = oldvalue。
我在使用 Excel 2016 时遇到了这个问题,令人惊讶的是 DisplayAlerts 毫无用处。不确定其他人是否经历过这种情况。我仍然不确定为什么,但是根据 Worksheet.Delete 方法(here)的备注阅读此thread:
当您删除 Worksheet 时,此方法会显示一个对话框,提示用户确认删除。 默认显示此对话框。在 Worksheet 对象上调用时,Delete 方法返回一个布尔值,如果用户单击对话框上的 Cancel,则返回 False;如果用户单击 Delete,则返回 True。
在 Excel 2016 中,尽管 Application.DisplayAlerts 设置为 False,但它在删除之后(或更确切地说是之前)一直显示警报。
我还没有找到真正的解决方法,所以我只是使用for each 循环使我想删除的工作表“消失”:
Sht.UsedRange.clear
For each shp in sht.Shapes
shp.Delete
Next
For each nm in sht.Parent.Names
if nm.RefersToRange.Parent is sht then nm.Delete
Next
sht.visible = xlSheetVeryHidden
(代码是未经检查的草稿;最终的错误可以用on error resume next 处理)
它远非理想,但它完成了我需要做的事情(当然,以更多内存为代价)。也许我应该把这个回复变成一个问题,看看是否有人对 Excel 2016 有更好的想法。
【讨论】:
Worksheet.Save() 的意思。 Excel 中没有 Worksheet 对象的 Save 方法。有一个Workbook.Save 方法,但它也会将即将删除的工作表保存在磁盘或其他任何地方,这会适得其反,并且可能会产生一些不需要的副作用。 @felfrag 还使用了 UsedRange.Clear,它比 ClearContents 做得更多(它还清除了格式。)
删除所有没有“报告”表的工作表**
Dim NM As String
Dim CTS As Integer
Dim CNT2 As Integer
Dim CNT3 As Integer
CNT3 = 1
CNT2 = 1
CTS = Sheets.Count
Do Until CNT2 = CTS + 1
NM = Sheets(CNT3).Name
If Name = "Report" Then
Range("A1").Select
CNT3 = CNT3 + 1
Else
Sheets(NM).Select
Application.DisplayAlerts = False
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True
End If
CNT2 = CNT2 + 1
Loop
【讨论】: