Pergunta

Usando VBA, como posso:

  1. testar se um arquivo existe e, em caso afirmativo,
  2. delete isso?
Foi útil?

Solução

1.) Verifique aqui.Basicamente faça isso:

Function FileExists(ByVal FileToTest As String) As Boolean
   FileExists = (Dir(FileToTest) <> "")
End Function

Deixarei que você descubra os vários tratamentos de erros necessários, mas estes estão entre os itens de tratamento de erros que eu consideraria:

  • Verifique se uma string vazia está sendo passada.
  • Verifique se há uma string contendo caracteres ilegais em um nome/caminho de arquivo

2.) Como excluir um arquivo.Olhe para esse. Basicamente, use o comando Kill, mas você precisa permitir a possibilidade de um arquivo ser somente leitura.Aqui está uma função para você:

Sub DeleteFile(ByVal FileToDelete As String)
   If FileExists(FileToDelete) Then 'See above          
      ' First remove readonly attribute, if set
      SetAttr FileToDelete, vbNormal          
      ' Then delete the file
      Kill FileToDelete
   End If
End Sub

Novamente, deixarei o tratamento de erros para você e, novamente, estas são as coisas que consideraria:

  • Isso deve se comportar de maneira diferente para um diretório vs.um arquivo?Um usuário deve indicar explicitamente que deseja excluir um diretório?

  • Você deseja que o código redefina automaticamente o atributo somente leitura ou o usuário deve receber algum tipo de indicação de que o atributo somente leitura está definido?


EDITAR:Marcando esta resposta como wiki da comunidade para que qualquer pessoa possa modificá-la, se necessário.

Outras dicas

Uma forma alternativa de codificar a resposta de Brettski, com a qual concordo inteiramente, poderia ser

With New FileSystemObject
    If .FileExists(yourFilePath) Then
        .DeleteFile yourFilepath
    End If
End With

O mesmo efeito, mas menos (bem, nenhuma) declarações de variáveis.

O FileSystemObject é uma ferramenta realmente útil e vale a pena conhecê-la.Além de tudo, para escrever arquivos de texto, às vezes pode ser mais rápido do que a alternativa legada, o que pode surpreender algumas pessoas.(Na minha experiência, pelo menos, YMMV).

Provavelmente serei criticado por isso, mas qual é o sentido de testar a existência se você vai simplesmente excluí-lo?Uma das minhas maiores irritações é um aplicativo que exibe uma caixa de diálogo de erro com algo como "Não foi possível excluir o arquivo, ele não existe!"

On Error Resume Next
aFile = "c:\file_to_delete.txt"
Kill aFile
On Error Goto 0
return Len(Dir$(aFile)) > 0 ' Make sure it actually got deleted.

Se o arquivo não existir, missão cumprida!

O seguinte pode ser usado para testar a existência de um arquivo e, em seguida, excluí-lo.

Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
     Kill aFile
End If 

Em VB é normalmente Dir para encontrar o diretório do arquivo.Se não estiver em branco então existe e então use Kill para se livrar do arquivo.

test = Dir(Filename)
If Not test = "" Then
    Kill (Filename)
End If

definir uma referência para a biblioteca Scripting.Runtime e então use o FileSystemObject:

Dim fso as New FileSystemObject, aFile as File

if (fso.FileExists("PathToFile")) then
    aFile = fso.GetFile("PathToFile")
    aFile.Delete
End if

Aqui vai uma dica:você está reutilizando o nome do arquivo ou planejando fazer algo que exija a exclusão imediata?

Não?

Você pode fazer com que o VBA dispare o comando DEL "C: EMP\scratchpad.txt" /F no prompt de comando de forma assíncrona usando VBA.Shell:

Shell "DEL " & chr(34) & strPath & chr(34) & " /F ", vbHide

Observe as aspas duplas (caractere ASCII 34) ao redor do nome do arquivo:Presumo que você tenha um caminho de rede ou um nome de arquivo longo contendo espaços.

Se for um arquivo grande ou estiver em uma conexão de rede lenta, disparar e esquecer é a melhor opção.Claro, você nunca consegue ver se isso funcionou ou não;mas você retoma seu VBA imediatamente e há momentos em que isso é melhor do que esperar pela rede.

Você pode definir uma referência para a biblioteca Scripting.Runtime e depois usar o FileSystemObject.Possui um método DeleteFile e um método FileExists.

Veja o artigo do MSDN aqui.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top