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 ответ

Решение

Насколько я помню, лучший способ борьбы с вложенными ifs иметь все ifs как многострочный ifs, т.е. перейти к новой строке после 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
Другие вопросы по тегам