Удаление файла в VBA

используя VBA, как я могу:

  1. проверьте, существует ли файл, и если да,
  2. удалить его?

9 ответов


1.) Проверка здесь. В основном сделайте это:

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

Я оставлю это вам, чтобы выяснить различные обработки ошибок, необходимых, но это среди ошибок обработки вещей, которые я буду рассматривать:

  • проверьте, не передается ли пустая строка.
  • проверить строку, содержащую символы, недопустимые в имени файла/пути

2.) Как удалить файл. Посмотреть этого. в основном используйте команду Kill, но вы должны учитывать возможность того, что файл доступен только для чтения. Вот функция для вас:

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

опять же, я оставлю обработку ошибок вам, и снова это то, что я бы рассмотрел:

  • Должно ли это вести себя по-разному для каталога и файла? Должен ли пользователь явно указывать, что он хочет удалить каталог?

  • вы хотите, чтобы код автоматически сбрасывал атрибут только для чтения или должен пользователю будет дано какое-то указание на то, что атрибут "только чтение" установлен?


EDIT: пометка этого ответа как Вики сообщества, чтобы любой мог изменить его, если это необходимо.


альтернативный способ код ответа Brettski, с которым я совершенно согласен, может быть

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

тот же эффект, но меньше (ну, вообще нет) объявлений переменных.

FileSystemObject-действительно полезный инструмент, с которым стоит подружиться. Помимо всего прочего, для написания текстовых файлов он иногда может быть быстрее, чем устаревшая альтернатива, что может удивить нескольких людей. (По моему опыту, по крайней мере, YMMV).


Я, вероятно, вспыхну за это, но какой смысл тестировать существование, если вы просто собираетесь удалить его? Один из моих основных pet peeves-это приложение, бросающее диалог об ошибке с чем-то вроде "не удалось удалить файл, его не существует!"

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.

Если файл не существует, в первую очередь, миссия выполнена!


следующее Можно использовать для проверки наличия файла, а затем для его удаления.

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

в VB его нормально Dir чтобы найти каталог файла. Если он не пуст, то он существует, а затем использует Kill чтобы избавиться от файла.

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

задайте ссылку на сценарий.Библиотека времени выполнения а затем используйте FileSystemObject:

Dim fso as New FileSystemObject, aFile as File

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

вот совет: вы повторно используя имя файла, или планируете сделать что-то, что требует немедленного удаления?

нет?

вы можете заставить VBA уволить команду DEL "C:\TEMP\scratchpad - ... txt " /F из командной строки асинхронно использование VBA.Шелл:

Оболочка " DEL "& chr (34) & strPath & chr (34) & "/F", vbHide

обратите внимание на двойные кавычки (символ ASCII 34) вокруг имени файла: я предполагаю, что у вас есть сетевой путь, или длинное имя файла, содержащее пробелы.

Если это большой файл, или он находится на медленном сетевом подключении, огонь и забыть-это путь. Конечно, вы никогда не увидите, сработало это или нет; но вы немедленно возобновляете свой VBA, и бывают моменты, когда это лучше, чем ждать сети.


вы можете установить ссылку на скрипт.Библиотека времени выполнения, а затем использовать FileSystemObject. Он имеет метод DeleteFile и метод FileExists.

см. статью MSDN здесь.


2 строки кода в VBA..

Set FSO = CreateObject("Scripting.FileSystemObject")
If FSO.FileExists(strPath) Then FSO.DeleteFile ("" & strPath & "")