Удаление файла в VBA - PullRequest
       67

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

108 голосов
/ 16 сентября 2008

Как использовать VBA:

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

Ответы [ 8 ]

149 голосов
/ 16 сентября 2008

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

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

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

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

2.) Как удалить файл. Посмотрите на this. В основном используйте команду 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

Опять же, я оставлю вам обработку ошибок, и снова я рассмотрю следующие вещи:

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

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


РЕДАКТИРОВАТЬ: пометить этот ответ как вики сообщества, чтобы любой мог изменить его, если потребуется.

49 голосов
/ 16 сентября 2008

Альтернативным способом кодирования ответа Бреттского, с которым я полностью согласен, может быть

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

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

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

11 голосов
/ 16 сентября 2008

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

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.

Если файл вообще не существует, миссия выполнена!

10 голосов
/ 16 сентября 2008

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

Dim aFile As String
aFile = "c:\file_to_delete.txt"
If Len(Dir$(aFile)) > 0 Then
     Kill aFile
End If 
6 голосов
/ 16 сентября 2008

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

test = Dir(Filename)
If Not test = "" Then
    Kill (Filename)
End If
4 голосов
/ 16 сентября 2008

установить ссылку на библиотеку Scripting.Runtime и затем использовать FileSystemObject:

Dim fso as New FileSystemObject, aFile as File

if (fso.FileExists("PathToFile")) then
    aFile = fso.GetFile("PathToFile")
    aFile.Delete
End if
3 голосов
/ 02 октября 2014

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

Нет?

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

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

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

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

2 голосов
/ 16 сентября 2008

Вы можете установить ссылку на библиотеку Scripting.Runtime, а затем использовать FileSystemObject. У него есть метод DeleteFile и метод FileExists.

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

...