1

Я не уверен, как обработать вывод из 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. Но я думаю, что это неправильно.

ОБНОВЛЕНИЕ: Спасибо за Нила.

Следующий код решает проблему в настоящее время:

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

2

Насколько я помню, лучший способ справиться с вложенным 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 s, используя оператор if и a and т. Е. Что-то вроде:

if FileExists and UserDoesntWantToOverWrite then
    ProcessFailed2
else
    ProcessStep2
end if

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .