Réponses:
1.) Vérifiez ici . En gros, faites ceci:
Function FileExists(ByVal FileToTest As String) As Boolean
FileExists = (Dir(FileToTest) <> "")
End Function
Je vous laisse le soin de déterminer les différentes méthodes de gestion des erreurs nécessaires, mais ce sont parmi les choses de gestion des erreurs que j'envisagerais:
2.) Comment supprimer un fichier. Regarde ça. En gros, utilisez la commande Kill, mais vous devez prévoir la possibilité qu'un fichier soit en lecture seule. Voici une fonction pour vous:
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
Encore une fois, je vous laisse la gestion des erreurs et encore une fois, ce sont les choses que je considérerais:
Cela devrait-il se comporter différemment pour un répertoire par rapport à un fichier? Un utilisateur doit-il avoir à indiquer explicitement qu'il souhaite supprimer un répertoire?
Voulez-vous que le code réinitialise automatiquement l'attribut en lecture seule ou l'utilisateur doit-il recevoir une sorte d'indication que l'attribut en lecture seule est défini?
EDIT: Marquer cette réponse comme wiki de la communauté afin que tout le monde puisse la modifier si nécessaire.
Une autre façon de coder la réponse de Brettski, avec laquelle je suis entièrement d'accord, pourrait être
With New FileSystemObject
If .FileExists(yourFilePath) Then
.DeleteFile yourFilepath
End If
End With
Même effet, mais moins de déclarations de variables (enfin aucune).
Le FileSystemObject est un outil vraiment utile et il vaut la peine de se familiariser avec. En dehors de toute autre chose, l'écriture de fichiers texte peut parfois être plus rapide que l'alternative héritée, ce qui peut surprendre quelques personnes. (Dans mon expérience au moins, YMMV).
Je vais probablement m'enflammer pour cela, mais quel est l'intérêt de tester l'existence si vous allez simplement le supprimer? Une de mes principales bêtes noires est une application qui lance une boîte de dialogue d'erreur avec quelque chose comme "Impossible de supprimer le fichier, il n'existe pas!"
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.
Si le fichier n'existe pas en premier lieu, mission accomplie!
ActiveWorkbook.SaveCopyAs
ne permet pas d'écraser, vous devez donc d'abord supprimer le fichier existant avec le même nom de fichier.
On Error Resume Next
, ou alors on m'a dit: D Bien sûr, c'est un conseil ridicule, et votre réponse est correcte.
Len(dir(...))
partie n'est pas SEULEMENT pour vérifier l'existence. Il est également vérifier si le fichier est HIDDEN car un fichier caché retourne une chaîne vide , même si elle existe (et vous ne serez pas en mesure de le supprimer): Dir(hiddenFile) = ""
. Par conséquent, la partie s'en SetAttr FileToDelete, vbNormal
occupe avec éloquence pour vous.
Ce qui suit peut être utilisé pour tester l'existence d'un fichier, puis pour le supprimer.
Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
Kill aFile
End If
Len()
(et LenB()
, ce qui est encore plus rapide) sont plus rapides que la comparaison de chaînes, c'est qu'en mémoire, les chaînes VB sont précédées de leur longueur. Len / LenB extrait juste la longueur de cet emplacement mémoire, ils n'ont pas à parcourir la chaîne pour connaître sa longueur. D'autre part, l'utilisation de la comparaison de chaînes a beaucoup plus de travail à faire. De plus, évitez d'utiliser ""
dans VB car il alloue toujours une nouvelle chaîne. Utilisez à la vbNullString
place car il s'agit d'une constante et n'utilise pas plus de mémoire.
définissez une référence à la bibliothèque Scripting.Runtime , puis utilisez FileSystemObject:
Dim fso as New FileSystemObject, aFile as File
if (fso.FileExists("PathToFile")) then
aFile = fso.GetFile("PathToFile")
aFile.Delete
End if
Voici un conseil: réutilisez-vous le nom du fichier ou prévoyez-vous de faire quelque chose qui nécessite la suppression immédiate?
Non?
Vous pouvez demander à VBA de lancer la commande DEL "C: \ TEMP \ scratchpad.txt" / F à partir de l'invite de commande de manière asynchrone en utilisant VBA.Shell:
Shell "DEL" & chr (34) & strPath & chr (34) & "/ F", vbHide
Notez les doubles guillemets (caractère ASCII 34) autour du nom de fichier: je suppose que vous avez un chemin réseau ou un nom de fichier long contenant des espaces.
S'il s'agit d'un gros fichier ou d'une connexion réseau lente, le feu et l'oubli est la voie à suivre. Bien sûr, vous ne voyez jamais si cela a fonctionné ou non; mais vous reprenez votre VBA immédiatement, et il y a des moments où c'est mieux que d'attendre le réseau.
Vous pouvez définir une référence à la bibliothèque Scripting.Runtime, puis utiliser FileSystemObject. Il a une méthode DeleteFile et une méthode FileExists.
Consultez l'article MSDN ici .