it-swarm-pt.tech

Excluindo um arquivo no VBA

Usando o VBA, como posso:

  1. testar se existe um arquivo e, em caso afirmativo,
  2. delete isso?
108
inglesp

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

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

Deixarei para você descobrir os vários tipos de erros necessários, mas estes estão entre os erros que lidam com as coisas que eu consideraria:

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

2.) Como excluir um arquivo. Olhe para this. Basicamente use o comando Kill, mas você precisa permitir a possibilidade de um arquivo ser somente de 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

Mais uma vez, vou deixar o tratamento de erros para você e, novamente, estas são as coisas que eu considero:

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

  • Deseja que o código redefina automaticamente o atributo somente leitura ou o usuário receba algum tipo de indicação de que o atributo somente leitura está definido?


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

149
Onorio Catenacci

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

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

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

O FileSystemObject é uma ferramenta muito útil e vale a pena ser amigável. Além de qualquer outra coisa, para a escrita de 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).

49
Mike Woodhouse

Provavelmente vou ser criticado por isso, mas qual é o sentido de testar a existência se você for excluí-la? Um dos meus principais pet peeves é um aplicativo jogando um 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 existe em primeiro lugar, missão cumprida!

13
JohnFx

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

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

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

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

defina uma referência à biblioteca Scripting.Runtime e use o FileSystemObject:

Dim fso as New FileSystemObject, aFile as File

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

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

Não?

Você pode obter o VBA para disparar o comando DEL "C:\TEMP\scratchpad.txt"/F a partir do comando Prompt assíncrono usando VBA.Shell:

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

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

Se é um arquivo grande, ou está em uma conexão de rede lenta, o fogo-e-esqueça é o caminho a percorrer. 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.

3
Nigel Heffernan

Você pode definir uma referência à biblioteca Scripting.Runtime e usar o FileSystemObject. Tem um método DeleteFile e um método FileExists.

Veja o artigo do MSDN aqui .

2
Darrel Miller