Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:如何停止程序并返回到代码中的特定步骤&x27;绕过MsgBox'的模式限制;_Excel_Vba_Error Handling_Userform_Msgbox - Fatal编程技术网

Excel VBA:如何停止程序并返回到代码中的特定步骤&x27;绕过MsgBox'的模式限制;

Excel VBA:如何停止程序并返回到代码中的特定步骤&x27;绕过MsgBox'的模式限制;,excel,vba,error-handling,userform,msgbox,Excel,Vba,Error Handling,Userform,Msgbox,我有一个用户界面,用户在其中输入一些信息。然后,他们按下按钮生成报告。但是,在生成报告时,用户不能让某些文件处于打开状态。如果用户打开一个文件,我希望弹出一条错误消息来通知他们这一点。然后我想要一种方法,让用户修复问题(关闭文件),而不必重新启动程序,因为他们已经输入了信息 我有MsgBox弹出窗口: Do While IsFileOpen(wfileName) MsgBox "Please close the Weights Machine Data Excel File '" &am

我有一个用户界面,用户在其中输入一些信息。然后,他们按下按钮生成报告。但是,在生成报告时,用户不能让某些文件处于打开状态。如果用户打开一个文件,我希望弹出一条错误消息来通知他们这一点。然后我想要一种方法,让用户修复问题(关闭文件),而不必重新启动程序,因为他们已经输入了信息

我有MsgBox弹出窗口:

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

Loop

问题是,一旦出现错误消息,用户将无法执行任何操作。我知道
MsgBox
是模态的,但有没有办法绕过它。如果没有,我希望用户返回到按下
generateReport
按钮之前的位置,这样他们就不必重新输入任何输入的信息。如何解决此问题?

MessageBox结果可以捕获为长/整数值。因此,您可以使用它们捕获用户输入,然后通过调用其他过程或发送到
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
我不太清楚你这是什么意思:

我希望用户返回到按下generateReport按钮之前的位置,这样他们就不必重新键入输入的任何信息。我该如何着手解决这个问题? 但最有可能的是,除非按钮(以及用户迄今为止“输入”的所有信息)位于UserForm上,或者存储在类对象或其他一些持久内存中,否则很难完成


仅仅保存/关闭文件就足够了吗?这将允许过程继续运行,而不会出现文件已打开时可能出现的错误。

MessageBox结果可以捕获为长/整数值。因此,您可以使用它们捕获用户输入,然后通过调用其他过程或发送到
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
我不太清楚你这是什么意思:

我希望用户返回到按下generateReport按钮之前的位置,这样他们就不必重新键入输入的任何信息。我该如何着手解决这个问题? 但最有可能的是,除非按钮(以及用户迄今为止“输入”的所有信息)位于UserForm上,或者存储在类对象或其他一些持久内存中,否则很难完成


仅仅保存/关闭文件就足够了吗?这将允许程序继续运行,而不会出现文件已打开时可能出现的错误。

我的回答可能更适合作为注释而不是答案,但我的声誉还不够好……无论如何


为什么不在generateReport按钮单击事件中调用
IsFileOpen(wfileName)
。如果是真的,请显示您的消息,然后退出Sub.

我的回答可能更适合作为评论而不是回答——但我的声誉还不够……无论如何


为什么不在generateReport按钮单击事件中调用
IsFileOpen(wfileName)
。如果为真,则显示消息,然后退出Sub.

+1。这是一个恰当的答案,国际海事组织,除非OP不能以这种方式实施它有一些深奥的原因。这是一个合适的答案,IMO,除非OP不能以这种方式实现它有一些深奥的原因。这很好。关于您的问题,当用户按下
generateReport()
时,将调用一个驱动程序,该驱动程序将生成报告。
MsgBox
的原始位置位于驱动程序在“生成报告”时调用的函数中。我所寻找的基本上是
GoTo
函数,用户可以在该函数中“返回”用户表单并重新启动报告生成过程。通常,一旦生成报告,用户表单就会关闭。在这种情况下,如果用户不希望程序保存和关闭,我如何使
GoTo
返回到已填写的UF?是否只是
GoTo
命令按钮单击()(实际上是
生成器报告单击()
)sub?很难说没有看到完整的代码,但我认为另一个答案是正确的。您是关闭表单还是卸载表单?如果是这样,请不要这样做,只需将其设置为.visible=false,然后在验证步骤失败时使其再次可见(或在验证通过时卸载)。虽然我没有使用
GoTo
,但我通过在
用户表单中包含您的
子项解决了我的问题。然后我就不必使用
GoTo
功能了。再次感谢你的帮助。这个很好用。关于您的问题,当用户按下
generateReport()
时,将调用一个驱动程序,该驱动程序将生成报告。
MsgBox
的原始位置位于驱动程序在“生成报告”时调用的函数中。我所寻找的基本上是
GoTo
函数,用户可以在该函数中“返回”用户表单并重新启动报告生成过程。通常,一旦生成报告,用户表单就会关闭。在这种情况下,如果用户不希望程序保存和关闭,我如何使
GoTo
返回到已填写的UF?是否只是
GoTo
命令按钮单击()
(实际上是
生成器报告单击()
)sub?很难说没有看到完整的代码,但我认为另一个答案是正确的。您是关闭表单还是卸载表单?如果是这样,请不要这样做,只需将其设置为.visible=false,然后在验证步骤失败时使其再次可见(或在验证通过时卸载)。虽然我没有使用
GoTo
,但我通过在
用户表单中包含您的
子项解决了我的问题。然后我就