Usando o VBA, como posso:
- testar se existe um arquivo e, se houver,
- delete isso?
Usando o VBA, como posso:
1.) Confira aqui . Basicamente, faça isso:
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
Deixarei que você descubra as várias manipulações de erros necessárias, mas essas são algumas das coisas que eu consideraria:
2.) Como excluir um arquivo. Olhe isso. 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
Mais uma vez, deixarei o tratamento de erros para você e, novamente, estas são as coisas que considero:
Isso deve se comportar de maneira diferente entre um diretório e um arquivo? Um usuário deve explicitamente precisar 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 esta resposta como wiki da comunidade, para que qualquer pessoa possa modificá-la, se necessário.
Uma maneira alternativa de codificar a resposta de Brettski, com a qual eu concordo totalmente, pode ser
Mesmo efeito, mas menos (bem, nenhuma) declarações de variáveis.
O FileSystemObject é uma ferramenta realmente útil e vale a pena ser amigável. Além de qualquer outra coisa, para escrever arquivos de texto, às vezes pode ser mais rápido que a alternativa herdada, o que pode surpreender algumas pessoas. (Pelo menos na minha experiência, YMMV).
fonte
Provavelmente serei inflamado por isso, mas qual é o sentido de testar a existência se você apenas deseja excluí-lo? Um dos meus principais ódios de estimação é um aplicativo que gera uma caixa de diálogo de erro com algo como "Não foi possível excluir o arquivo, ele não existe!"
Se o arquivo não existir em primeiro lugar, missão cumprida!
fonte
ActiveWorkbook.SaveCopyAs
não pode substituir, portanto, você deve primeiro remover o arquivo existente com o mesmo nome de arquivo.On Error Resume Next
, ou pelo menos me disseram: D É claro que esse conselho é ridículo e sua resposta está correta.Len(dir(...))
parte não é ÚNICA para verificar a existência. É também verificar se o arquivo está escondido porque um arquivo oculto irá retornar uma string vazia, mesmo se ele existe (e você não será capaz de excluí-lo):Dir(hiddenFile) = ""
. Portanto, a parteSetAttr FileToDelete, vbNormal
eloquentemente cuida disso para você.O seguinte pode ser usado para testar a existência de um arquivo e excluí-lo.
fonte
Len()
(eLenB()
, que é ainda mais rápido) é mais rápida que a comparação de cadeias é que, na memória, as cadeias VB são precedidas pelo seu comprimento. Len / LenB apenas puxa o comprimento desse local de memória, eles não precisam percorrer a string para saber seu comprimento. Por outro lado, o uso da comparação de strings tem muito mais trabalho a fazer. Além disso, evite usar""
no VB, pois ele sempre aloca uma nova string. Use emvbNullString
vez disso, pois é uma constante e não usa mais memória.No VB é normalmente
Dir
encontrar o diretório do arquivo. Se não estiver em branco, ele existe e, em seguida, use-oKill
para se livrar do arquivo.fonte
defina uma referência para a biblioteca Scripting.Runtime e use o FileSystemObject:
fonte
Aqui está uma dica: você está reutilizando o nome do arquivo ou planeja fazer algo que exija a exclusão imediatamente?
Não?
Você pode fazer com que o VBA inicie o comando DEL "C: \ TEMP \ scratchpad.txt" / F no prompt de comando de forma assíncrona usando o VBA.Shell:
Shell "DEL" e chr (34) & 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 for um arquivo grande ou estiver em uma conexão de rede lenta, o recurso ignorar é o caminho a seguir. 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.
fonte
Você pode definir uma referência para a biblioteca Scripting.Runtime e, em seguida, usar o FileSystemObject. Possui um método DeleteFile e um método FileExists.
Veja o artigo do MSDN aqui .
fonte