it-swarm-ru.tech

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

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

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

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

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

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

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


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

149
Onorio Catenacci

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

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

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

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

49
Mike Woodhouse

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

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.

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

13
JohnFx

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

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

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

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

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

Dim fso as New FileSystemObject, aFile as File

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

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

Нет?

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

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

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

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

3
Nigel Heffernan

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

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

2
Darrel Miller