Excel VBA MsgBox gerenciando a verificação de arquivos existentes

0

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?

    
por music2myear 07.04.2011 / 18:52

1 resposta

2

Como eu me lembro, a melhor maneira de lidar com o aninhado if s é ter todos os if s como multi-linhas if s, ou seja, passar para uma nova linha após o then .

Pode-se então usar end if para especificar que não se deseja que o seguinte else esteja relacionado ao if imediatamente anterior, mas um acima na cadeia.

if Test1 then
    if Test2 then
        do something
    end if
else
    do something else if Test1 is false
end if

Na verdade, prefiro evitar o aninhado if s usando uma instrução if e uma and , ou seja, algo como:

if FileExists and UserDoesntWantToOverWrite then
    ProcessFailed2
else
    ProcessStep2
end if
    
por 07.04.2011 / 19:43