代码之家  ›  专栏  ›  技术社区  ›  NJMR

阻止关闭工作簿

  •  6
  • NJMR  · 技术社区  · 7 年前

    ABC.xls 包含宏的文件。现在,宏有一个sub,当我按下时会调用它 Ctrl + M . CSV 文件基本上,这个宏用于处理和保存 CSV 文件 Ctrl+M .

    Sub runProperChangeSubroutine()             ' Assigned to shortcut key CTRL + M.
        file_name = ActiveWorkbook.Name         ' Gets the file name.
        Application.Run file_name & "!ChangeSub"
    End Sub
    

    CSV 现在,我应该弹出一个消息框给用户,并防止关闭工作簿。 所以我做了以下。。。

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Dim improperRowNumber As Integer
        Dim BlnEventState As Boolean
        improperRowNumber = returnImproperRow()
    
        BlnEventState = Application.EnableEvents
        Application.EnableEvents = True
    
        If improperRowNumber <> -1 Then
            Cancel = True
            MsgBox "The row number " & improperRowNumber & " is not ending with '@/#'. Please correct the row before closing."
        Else
            Call saveCSV
        End If
        Application.EnableEvents = BlnEventState
    End Sub
    

    请提出建议。

    由于上述代码不起作用,我使用了 ThisWorkbook.Saved = False 在如下所示的消息框之后。。。

    If improperRowNumber <> -1 Then
        MsgBox "The row number " & improperRowNumber & " is not ending with '@/#'. Please correct the row before closing."
        Application.DisplayAlerts = False
        ThisWorkbook.Saved = False
        Cancel = False
    Else
    

    Do you want to save the changes.... “消息框。如果我单击 Cancel 按钮,工作簿未关闭。

    有没有办法自定义或隐藏消息框文本或按钮 Save

    5 回复  |  直到 7 年前
        1
  •  6
  •   Community arnoo    6 年前

    如果必须监视除包含宏的工作簿外的其他工作簿的关闭,则可以按如下方式从启用宏的工作簿截取应用程序级事件:

    在此工作簿后面添加(或改编)此代码:

    Option Explicit
    
    Private m_CloseHelper As CloseHelper
    
    Private Sub Workbook_Open()
        Set m_CloseHelper = New CloseHelper
    End Sub
    

    添加名为CloseHelper的新类模块:

    Option Explicit
    
    Private WithEvents m_App As Excel.Application
    
    Private Sub Class_Initialize()
        Set m_App = Excel.Application
    End Sub
    
    Private Sub Class_Terminate()
        Set m_App = Nothing
    End Sub
    
    Private Sub m_App_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
        'Logic goes here, e.g. the code below will prevent the user from closing
        'any workbook other than this one, for as long as this workbook is open.
        If Not Wb Is ThisWorkbook Then
            Cancel = True
            MsgBox "Hello from m_App_WorkbookBeforeClose"
        End If
    End Sub
    

    重要的关键字是WithEvents,其原理是Excel应用程序引发的事件现在可以在CloseHelper类中进行编码。

    您可以在此处找到更深入的文章: Application Events

        2
  •  0
  •   Variatus    7 年前

    按右上角的X按钮退出Excel应用程序。当应用程序关闭时,您不应该期望工作簿保持打开状态。您可以编写一个应用程序事件过程来防止Excel退出,但更好的方法可能是简单地改掉使用该按钮的坏习惯。找到另一种关闭工作簿的方法。

        3
  •  0
  •   Community arnoo    6 年前

    为了自动防止csv文件被关闭,您需要使用可扩展性编程在csv文件在Excel中打开时向其添加Workbook\u BeforeClose事件。显然,您无法在事件发生时保存文件,但您不需要这样做。模块中的代码将在工作簿仍处于打开状态时运行,以防止在不满足条件时关闭;在条件满足后允许成功保存

    http://www.cpearson.com/excel/vbe.aspx

        4
  •  0
  •   DecimalTurn    7 年前

    你试过关闭所有 加载项 (或在安全模式下运行Excel)?

    应用程序级事件 就像Excelosaurus在回答中描述的那样。它可能包含 Application.EnableEvents = False 甚至 Cancel = False 并干扰您的代码。

    编辑:对于受保护的加载项,这将特别难以检测,因为代码将运行 之后 在关闭工作簿之前,即使使用F8逐行调试,您也无法知道它在做什么。

        5
  •  0
  •   amitklein    7 年前

    您可以在工作簿宏中使用此代码

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ActiveWorkbook.Save
    Workbooks.Open Application.ActiveWorkbook.FullName
    End Sub
    

    如您所见,它基本上在关闭工作簿时保存并打开工作簿