删除工作表并避免Excel询问用户确认,使用自定义消息代替。

53

我有一个按钮来触发一系列事件,其中之一是删除工作表。在用户进行任何删除前,我会弹出我的自定义YES/NO消息,要求他们确认整个过程。

然后就是删除工作表的子事件,Excel弹出自己的窗口以确认删除工作表。问题在于,如果用户此时选择“否”,那么我的应用程序将处于不一致状态。

如何绕过Excel要求确认删除工作表的步骤?

3个回答

76

您可以使用以下方式更改Excel的默认显示警报参数:

Application.DisplayAlerts = False

不要忘记在流程结束时恢复标准行为:

Application.DisplayAlerts = True

9
也许只是我的个人习惯,但我喜欢恢复旧值而不是将其设置为“True”。也就是说,oldvalue = Application.DisplayAlertsApplication.DisplayAlerts = Falsesheet.DeleteApplication.DisplayAlerts = oldvalue - André Chalella
@ Andre - 不错的点子,当更改应用程序设置时一定要记住,你永远不知道它们最初是什么样子的,这可能会防止很多调试。 - Alfa Bravo

4
我在使用Excel 2016时遇到了这个问题,令人惊讶的是DisplayAlerts毫无用处。不确定是否有其他人经历过这种情况。但根据thread中Worksheet.Delete方法(here)的备注,当您删除一个工作表时,此方法会显示一个对话框,提示用户确认删除默认情况下,此对话框将被显示。当在工作表对象上调用Delete方法时,它返回一个布尔值,如果用户在对话框上单击“取消”则为False,如果用户单击“删除”则为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是否有更好的解决方法。


1
如果工作表有内容,解决方法是使用Worksheet.ClearContents(),然后Worksheet.Save(),最后删除该工作表。显然,Excel会关注工作表是否有内容,并且仅在工作表有内容时显示警报,否则不会显示警报。 - AWizardInDallas
@AWizardInDallas:我理解你的意思,但我不明白你所说的“Worksheet.Save()”。在Excel中,Worksheet对象没有“Save”方法。有一个Workbook.Save方法,但它也会将即将被删除的工作表保存到磁盘或其他地方,这有点不太合适,并且可能带来一些不必要的副作用。 此外,@felfrag使用了UsedRange.Clear,这比仅清除内容(ClearContents)还要多做一些事情(它还清除格式)。 - AntoineL

2

删除所有没有“报告”工作表的方法

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接