Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Vba xlDialogSaveAs-结束所有代码(如果为“;取消“;被选中_Vba_Excel - Fatal编程技术网

Vba xlDialogSaveAs-结束所有代码(如果为“;取消“;被选中

Vba xlDialogSaveAs-结束所有代码(如果为“;取消“;被选中,vba,excel,Vba,Excel,编辑:我自己想出来的。我觉得很傻,但用“结束”替换“退出子节点”效果很好 背景:我有一个Sub,它使用“Call”函数在一个Sub中运行多个Sub(参见下面的代码#1) 我的第一个代码名为“Format#MIUL”,提示用户使用以下代码行保存文件(请参见下面的代码#2)。这段代码可以工作,但问题是如果用户按下“取消”按钮,在主子代码(上面的代码#1)中调用的其余代码将继续运行。如果用户按下取消按钮,我希望所有代码停止。我只是不知道怎么做 'Save file as .xlsm MsgBox "

编辑:我自己想出来的。我觉得很傻,但用“结束”替换“退出子节点”效果很好

背景:我有一个Sub,它使用“Call”函数在一个Sub中运行多个Sub(参见下面的代码#1)

我的第一个代码名为“Format#MIUL”,提示用户使用以下代码行保存文件(请参见下面的代码#2)。这段代码可以工作,但问题是如果用户按下“取消”按钮,在主子代码(上面的代码#1)中调用的其余代码将继续运行。如果用户按下取消按钮,我希望所有代码停止。我只是不知道怎么做

'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