Excluindo um arquivo no VBA
-
09-06-2019 - |
Pergunta
Usando VBA, como posso:
- testar se um arquivo existe e, em caso afirmativo,
- delete isso?
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.