Não tenho certeza de como lidar com a saída de uma MsgBox para permitir que minha macro continue processando em situações diferentes.
Esta macro cria um arquivo de relatório diário com um nome de saída de abcdMMDD.xls.
No início do script, eu procuro por um arquivo no diretório de saída com o mesmo nome do arquivo de saída do dia e mostro uma caixa de mensagem para o usuário perguntando se ele quer sobrescrever o arquivo. Com base em sua resposta, o script continua de duas maneiras.
O código importante é:
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
O problema é este:
Quando o arquivo de saída já existe, o prompt é exibido corretamente, mas pressionando YES (como em Sim, sobrescreva) a macro pára o processamento; se eu pressionar Não, a mensagem esperada será mostrada e a macro sairá como planejada.
Se o arquivo de saída ainda não existir, o script continuará sem nenhum aviso conforme projetado e processará o arquivo.
Trocar ProcessFailed2 e ProcessStep2 e mudar o vbNo para vBYes no final da linha MsgBox causa um conjunto diferente de problemas.
Nesse caso, se o arquivo de saída já existir, o Msgbox é exibido corretamente e selecionar Sim permite que a macro seja processada conforme o esperado, sobrescrevendo o arquivo de saída pelo recém-criado.
Mas se o arquivo de saída não existir, o script passa direto para o ProcessFailed2.
Suponho que o problema seja em qual instrução If o Else está incluído. Como especifico qual If recebe o else?
Eu assumi que, dado o primeiro Se é um bloco Se e o segundo é uma linha única Se, o Outro seria incluído no bloco Se. Mas acho que isso é incorreto.
ATUALIZAÇÃO: Obrigado por Neal.
O código a seguir resolve o problema atualmente:
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
Com base na recomendação de Neal, a última pergunta pendente é: Ao usar uma instrução IF / AND, a porção AND só será processada se a primeira parte for encontrada como verdadeira?