Respostas:
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
With New FileSystemObject
If .FileExists(yourFilePath) Then
.DeleteFile yourFilepath
End If
End With
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).
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!"
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 em primeiro lugar, missão cumprida!
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 parte SetAttr FileToDelete, vbNormal
eloquentemente cuida disso para você.
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
Len()
(e LenB()
, 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 em vbNullString
vez disso, pois é uma constante e não usa mais memória.
defina uma referência para a 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
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.
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 .