Excel VBA:如何停止程序并返回到代码中的某个步骤,“绕过MsgBox的模态限制”

我有一个用户界面,用户input一些信息。 然后他们按下一个button来生成报告。 但是用户不能在生成报告时打开某些文件。 如果用户打开一个文件,我想要popup一个错误消息通知他们。 然后,我想让用户修复问题(closures文件),而不必重新启动程序,因为他们已经input了信息。

我有MsgBoxpopup:

Do While IsFileOpen(wfileName) MsgBox "Please close the Weights Machine Data Excel File '" & getFileName(wfileName) & "' to proceed", vbInformation, "Error" Loop 

问题是一旦错误消息发生,用户不能做任何事情。 我知道MsgBox是模式,但有没有办法解决这个问题。 如果不是,我希望用户返回到按下generateReportbutton之前的点,所以他们不必重新键入他们input的任何信息。 我该如何解决这个问题?

我的回答可能更适合作为评论,而不是回答 – 但是我还没有足够的声望呢….无论如何

为什么不直接在generateReportbutton点击事件中调用IsFileOpen(wfileName) ? 如果是这样,显示您的消息,然后退出小组。

MessageBox结果可以被捕获为一个长/整数值。 因此,您可以使用它们捕获用户input,然后通过调用其他过程或发送GoTo语句等来相应地路由您的代码。

 Sub Example() Dim mb as VbMsgBoxResult ShowAgain: mb = MsgBox("Do you want to see another message box?", vbYesNo) If mb = vbYes Then GoTo ShowAgain Else: 'Do something else End If End Sub 

在你的情况下,你可能会这样做:

 Dim mb as vbMsgBoxResult mb = MsgBox("Please close the Weights Machine Data Excel File '" & getFileName(wfileName) & "' to proceed", vbOkCancel, "Error") If mb = vbOk Then Workbooks(getFileName(wfileName)).Save Workbooks(getFileName(wfileName)).Close Else: 'Do something else... End If 

我不完全确定你的意思是:

我想要用户返回到按下generateReportbutton之前的点,所以他们不必重新键入他们input的任何信息。 我该如何解决这个问题? 但是,除非button(以及用户迄今为止所input的所有信息)位于UserForm中或存储在Class对象或其他持久存储器中,否则很可能无法轻松完成。

简单地保存/closures文件是否足够? 这应该允许过程继续运行,而不会发生如果文件已经打开会发生的错误。