Vba xlDialogSaveAs-结束所有代码(如果为“;取消“;被选中
编辑:我自己想出来的。我觉得很傻,但用“结束”替换“退出子节点”效果很好 背景:我有一个Sub,它使用“Call”函数在一个Sub中运行多个Sub(参见下面的代码#1) 我的第一个代码名为“Format#MIUL”,提示用户使用以下代码行保存文件(请参见下面的代码#2)。这段代码可以工作,但问题是如果用户按下“取消”按钮,在主子代码(上面的代码#1)中调用的其余代码将继续运行。如果用户按下取消按钮,我希望所有代码停止。我只是不知道怎么做Vba xlDialogSaveAs-结束所有代码(如果为“;取消“;被选中,vba,excel,Vba,Excel,编辑:我自己想出来的。我觉得很傻,但用“结束”替换“退出子节点”效果很好 背景:我有一个Sub,它使用“Call”函数在一个Sub中运行多个Sub(参见下面的代码#1) 我的第一个代码名为“Format#MIUL”,提示用户使用以下代码行保存文件(请参见下面的代码#2)。这段代码可以工作,但问题是如果用户按下“取消”按钮,在主子代码(上面的代码#1)中调用的其余代码将继续运行。如果用户按下取消按钮,我希望所有代码停止。我只是不知道怎么做 'Save file as .xlsm MsgBox "
'Save file as .xlsm
MsgBox " Save as Excel Workbook (.xlsx)!"
Dim userResponse As Boolean
On Error Resume Next
userResponse = Application.Dialogs(xlDialogSaveAs).Show(, 51)
On Error GoTo 0
If userResponse = False Then
Exit Sub
Else
End If
非常感谢您的帮助。调用
关键字已经过时20年了,您可以删除它
End
关键字将有效地结束执行,但它实际上是一个红色的“自毁”按钮,如果代码结构正确,您根本不需要使用它
看起来Format\u MIUL
是一个Sub
过程。将其设为函数
,并返回一个布尔值
告诉调用方是否可以继续,或者是否应取消其余操作:
Private Function Format_MUIL() As Boolean
'...
'Save file as .xlsm
MsgBox " Save as Excel Workbook (.xlsx)!"
Dim userResponse As Boolean
On Error Resume Next
userResponse = Application.Dialogs(xlDialogSaveAs).Show(, 51)
On Error GoTo 0
'return False if userResponse isn't a filename, True otherwise:
Format_MUIL = Not VarType(userResponse) = vbBoolean
End Function
现在不是这样:
调用方可以执行以下操作:
If Not Format_MIUL Then Exit Sub
然后,你就可以在没有按下任何自毁按钮的情况下优雅地退出了。我觉得很傻,但用“结束”替换了“退出子节点”工作完美。请为您的问题写一个答案,以便其他人可以找到类似问题的解决方案。解决方法是将Format_Miu转换为一个函数,保存时返回TRUE,保存时返回False,这样您就可以这样调用它:如果Format_Miu,则其他调用结束If@jkpieterse嘎,刚才看到的评论很有趣…我不怎么做VBA,对于其他用户来说,这段代码并不是真正需要的,只是一个很好的工具,所以我对结构合理的代码的了解非常有限。但我并不清楚如何用函数替换所有的“Call”关键字。不是每个子系统都有这样的对话框。另外,在我的Format MIUL代码中,我应该把“Format MIUL=Not VarType…”放在哪里?@CC268,正如你所看到的,这一点都不难!FWIW我管理的开源VBIDE插件项目可以让你学到更多,提高你的编码和知识。它还可以修复你的[缺乏]只需单击两下鼠标,就可以缩进整个项目,并警告您潜在的错误、过时的构造和其他代码质量问题“,我说删除调用
关键字-它们是多余的calldosomething
与刚才的DoSomething
完全相同。是的,Format\u MIUL=…
进入了Format\u MIUL
函数-这就是您在VBA中通过指定其标识符来设置函数返回值的方式。好的,但是我是否保留了我的原始代码“另存为.xlsm MsgBox”另存为Excel工作簿(.xlsx)错误时将userResponse设置为布尔值Resume Next userResponse=Application.Dialogs(xlDialogSaveAs).Show(,51)On Error GoTo 0如果userResponse=False,则退出Sub Else End(如果
),只需添加Format\u MUIL=Not VarType(userResponse)=vbBoolean
到此结束?不管怎样,我会去看看Rubberduck,它听起来很棒。@CC268我编辑了它来澄清,希望它能有所帮助。如果userResponse=False,则Format\u MUIL=Not VarType(userResponse)=vbBoolean
部分实际上替换了整个。
Call Format_MIUL
If Not Format_MIUL Then Exit Sub