我不确定如何处理 MsgBox 的输出以允许我的宏在不同情况下继续处理。
此宏创建一个每日报告文件,其输出名称为 abcdMMDD.xls。
在脚本的早期阶段,我会检查输出目录中是否有与当天输出文件同名的文件,并向用户显示一个消息框,询问他们是否要覆盖该文件。根据他们的反应,脚本将以两种方式之一继续运行。
重要的代码是:
If ChkFileThere("G:\Management Reporting\Asset Comparison Report\DAILY\" & FileName) Then
If MsgBox("File " & FileName & " already exists. Continue and overwrite?", vbYesNo, "Output File Exists") = vbNo Then GoTo ProcessFailed2
Else: GoTo ProcessStep2
End If
问题是这样的:
当输出文件已经存在时,提示会正确显示,但按“是”(如“是,请覆盖”),宏将停止处理,如果我按“否”,则会显示预期消息,并且宏将按设计退出。
如果输出文件尚不存在,脚本将按照设计继续进行而不进行任何提示并处理该文件。
交换 ProcessFailed2 和 ProcessStep2 并将 MsgBox 行末尾的 vbNo 更改为 vbYes 会导致一组不同的问题。
在这种情况下,如果输出文件已经存在,则 Msgbox 会正确显示,选择“是”可使宏按预期处理,并用新创建的文件覆盖输出文件。
但是如果输出文件不存在,脚本将直接传递到 ProcessFailed2。
我认为问题在于 Else 包含在哪个 If 语句中。我如何指定哪个 If 获取 Else?
我假设,如果第一个 If 是块 If,而第二个 If 是单行 If,那么 Else 将包含在块 If 中。但我认为这是错误的。
更新:感谢尼尔。
以下代码目前可以解决该问题:
ProcessStatus = "Checking if report output file already exists."
Application.StatusBar = ProcessStatus
If ChkFileThere("G:\Management Reporting\Asset Comparison Report\DAILY\" & FileName) Then
If MsgBox("File " & FileName & " already exists. Continue and overwrite?", vbYesNo, "Output File Exists") = vbNo Then
GoTo ProcessFailed2
End If
Else: GoTo ProcessStep2
End If
不过,根据 Neal 的建议,最后一个未解决的问题是:使用 IF/AND 语句时,是否仅当第一部分为真时才处理 AND 部分?
答案1
我记得,处理嵌套if
s 的最佳方法是将所有if
s 作为多行if
s,即在 之后移动到新行then
。
然后,人们可以使用end if
来指定人们不希望以下内容else
与紧接在前的 相关联if
,而是希望其与链中上层的内容相关联。
if Test1 then
if Test2 then
do something
end if
else
do something else if Test1 is false
end if
实际上,我宁愿if
通过使用一个if
语句和一个and
类似的语句来避免嵌套的 s:
if FileExists and UserDoesntWantToOverWrite then
ProcessFailed2
else
ProcessStep2
end if