【问题标题】:Delete Sheets and avoid Excel asking the user to confirm, using custom messages instead删除表格并避免 Excel 要求用户确认,而是使用自定义消息
【发布时间】:2012-02-13 23:20:47
【问题描述】:

我有一个触发一连串事件的按钮。其中一个事件是删除工作表。在用户删除任何内容之前,我会弹出我的自定义“是/否”消息,要求他们确认整个过程。

然后是删除工作表的子事件,Excel会弹出自己的窗口确认删除工作表。问题是,如果用户此时说“不”,这会使我的应用程序处于不一致的状态。

如何绕过 Excel 要求确认删除工作表

【问题讨论】:

    标签: vba excel


    【解决方案1】:

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

    Application.DisplayAlerts = False
    

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

    Application.DisplayAlerts = True
    

    【讨论】:

    • 也许只有我一个人,但我喜欢恢复旧值而不是设置为True。即oldvalue = Application.DisplayAlertsApplication.DisplayAlerts = Falsesheet.DeleteApplication.DisplayAlerts = oldvalue
    • @Andre - 很好的接触,在更改应用程序设置时要记住一些事情,你永远不知道它们的开始是什么,并且可能会阻止以后进行调试。
    【解决方案2】:

    我在使用 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.ClearContents(),再用Worksheet.Save(),然后删除工作表。 Excel 显然担心工作表有内容,只有在工作表有内容时才显示警报,否则不显示警报。
    • @AWizardInDallas:我遵循你的推理,但我不明白你对Worksheet.Save() 的意思。 Excel 中没有 Worksheet 对象的 Save 方法。有一个Workbook.Save 方法,但它也会将即将删除的工作表保存在磁盘或其他任何地方,这会适得其反,并且可能会产生一些不需要的副作用。 @felfrag 还使用了 UsedRange.Clear,它比 ClearContents 做得更多(它还清除了格式。)
    【解决方案3】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-24
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多