有ABC.xls
个文件,其中包含宏。现在,当我按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
点击关闭(右上角的X标记,关闭workboox。我没有关闭excel。)按钮,我能够看到消息框但是workboox关闭了。如果行未正确结束,我希望用户进行一些编辑。 请建议。
编辑:
由于上面的代码不起作用,我在消息框之后使用了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
现在显示&#34; Do you want to save the changes....
&#34;消息框。如果我单击消息框上的Cancel
按钮,则表示工作簿未关闭。
有没有办法自定义消息框文本或按钮或隐藏此Save
消息框?
答案 0 :(得分:6)
如果必须监视除包含宏的工作簿之外的工作簿的关闭,则可以按如下方式拦截启用宏的工作簿中的应用程序级事件:
在ThisWorkbook后面添加(或改编)此代码:
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
答案 1 :(得分:0)
按右上角的X按钮退出Excel应用程序。应用程序关闭时,您不应期望工作簿保持打开状态。您可以编写一个防止Excel退出的应用程序事件过程,但更好的方法可能是简单地摆脱使用该按钮的坏习惯。找到另一种关闭工作簿的方法。
答案 2 :(得分:0)
Workbook_BeforeClose事件仅适用于代码所在的工作簿。当您尝试关闭宏工作簿并设置其参数时,它会运行取消为TRUE只在取消关闭Excel时关闭宏工作簿。打开的csv文件是一个单独的工作簿,Excel会尝试单独关闭它,生成有关保存csv文件的单独消息。
要自动阻止csv文件被关闭,您需要使用可扩展性编程将Excel中的Workbook_BeforeClose事件添加到csv文件中。显然,您无法在事件到位时保存文件,但您不需要。当工作簿仍处于打开状态时,模块中的代码将运行,以防止在您的条件不满足时关闭; 符合条件后允许成功保存将采用.csv格式,该格式将擦除临时添加的代码。
答案 3 :(得分:0)
您是否尝试关闭所有加载项(或以安全模式运行Excel)?
我问,因为这个问题可能是因为你的一个加载项包含了一个应用程序级别事件,就像Excelosaurus中所描述的那样。回答。它可能包含Application.EnableEvents = False
甚至Cancel = False
并干扰您的代码。
答案 4 :(得分:0)
您可以在工作簿宏中使用此代码
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ActiveWorkbook.Save
Workbooks.Open Application.ActiveWorkbook.FullName
End Sub
正如您所看到的,它基本上会在关闭时保存并打开工作簿