Excel VBA MsgBox обрабатывает проверку существующего файла
Я не уверен, как обработать вывод из 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
Проблема заключается в следующем:
Когда выходной файл уже существует, приглашение отображается правильно, но при нажатии YES (как в Yes, пожалуйста, перезаписать) макрос прекращает обработку, если я нажимаю No, появляется ожидаемое сообщение и макрос завершается, как и было задумано.
Если выходной файл еще не существует, сценарий продолжает работу без каких-либо запросов, как это было задумано, и обрабатывает файл.
Замена ProcessFailed2 и ProcessStep2 и изменение значения vbNo на vbYes в конце строки MsgBox вызывает другой набор проблем.
В этом случае, если выходной файл уже существует, Msgbox отображается правильно, и выбор "Да" позволяет макросу обрабатываться как положено, перезаписывая выходной файл вновь созданным.
Но если выходной файл не существует, скрипт переходит прямо в ProcessFailed2.
Я полагаю, что проблема заключается в том, в какой оператор If включено остальное. Как мне указать, какой If получает остальное?
Я предположил, что если первый If - это блок If, а второй - однострочный If, то остальное будет включено в блок 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
Однако, основываясь на рекомендациях Нила, последний нерешенный вопрос: при использовании оператора 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
то есть что-то вроде:
if FileExists and UserDoesntWantToOverWrite then
ProcessFailed2
else
ProcessStep2
end if