Вопрос

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

  1. проверить, существует ли файл, и если да,
  2. удали это?
Это было полезно?

Решение

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

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

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

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


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

Другие советы

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

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

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

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

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

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 

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

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

установите ссылку на библиотеку Scripting.Runtime а затем используйте 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: EMP\scratchpad.txt" /F из командной строки. асинхронно используя VBA.Shell:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top