Используя VBA, как я могу:
- проверить, существует ли файл, и если да,
- удали это?
Используя VBA, как я могу:
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
Опять же, я оставлю обработку ошибок вам, и снова вот что я рассмотрю:
Должно ли это вести себя по-разному для каталога и файла? Должен ли пользователь явно указывать, что он хочет удалить каталог?
Вы хотите, чтобы код автоматически сбрасывал атрибут «только для чтения», или пользователю следует дать какое-то указание на то, что атрибут «только для чтения» установлен?
РЕДАКТИРОВАТЬ: пометить этот ответ как вики сообщества, чтобы каждый мог его изменить при необходимости.
Альтернативный способ закодировать ответ Бреттски, с которым я полностью согласен, может быть
Тот же эффект, но меньше (ну, совсем не объявлений) переменных.
FileSystemObject - действительно полезный инструмент, с которым стоит подружиться. Помимо всего прочего, для записи текстовых файлов это иногда может быть быстрее, чем унаследованная альтернатива, что может удивить некоторых людей. (По моему опыту, по крайней мере, YMMV).
источник
Я, наверное, разозлюсь на это, но какой смысл проверять существование, если вы просто собираетесь его удалить? Одна из моих главных неприятностей - это приложение, которое выдает диалоговое окно с ошибкой вроде «Не удалось удалить файл, он не существует!»
Если файл вообще не существует, миссия выполнена!
источник
ActiveWorkbook.SaveCopyAs
не может перезаписать, поэтому вам сначала нужно удалить существующий файл с тем же именем файла.On Error Resume Next
, по крайней мере, мне так сказали: D Конечно, это смешной совет, и ваш ответ правильный.Len(dir(...))
Часть не ИСКЛЮЧИТЕЛЬНО для проверки существования. Также проверить , если файл скрыт , так как скрытый файл будет возвращать пустую строку , даже если она существует (и вы не сможете удалить его):Dir(hiddenFile) = ""
. Следовательно, частьSetAttr FileToDelete, vbNormal
красноречиво позаботится об этом за вас.Следующее можно использовать для проверки существования файла, а затем для его удаления.
источник
Len()
(иLenB()
что еще быстрее) быстрее, чем сравнение строк, заключается в том, что в памяти строкам VB предшествует их длина. Len / LenB просто извлекают длину из этой ячейки памяти, им не нужно перебирать строку, чтобы узнать ее длину. С другой стороны, при использовании сравнения строк нужно сделать гораздо больше. Кроме того, избегайте использования""
в VB, поскольку он всегда выделяет новую строку. ИспользуйтеvbNullString
вместо этого, поскольку это константа и не использует больше памяти.В VB обычно
Dir
можно найти каталог с файлом. Если он не пустой, значит, он существует, а затем используйтеKill
его, чтобы избавиться от файла.источник
установите ссылку на библиотеку Scripting.Runtime, а затем используйте FileSystemObject:
источник
Вот совет: вы повторно используете имя файла или планируете сделать что-то, что требует немедленного удаления?
Нет?
Вы можете заставить VBA запускать команду DEL "C: \ TEMP \ scratchpad.txt" / F из командной строки асинхронно с помощью VBA.Shell:
Оболочка "DEL" & chr (34) & strPath & chr (34) & "/ F", vbHide
Обратите внимание на двойные кавычки (символ ASCII 34) вокруг имени файла: я предполагаю, что у вас есть сетевой путь или длинное имя файла, содержащее пробелы.
Если это большой файл или он находится в медленном сетевом соединении, запускать и забывать - лучший способ. Конечно, вы никогда не увидите, сработало это или нет; но вы сразу же возобновляете свой VBA, и бывают случаи, когда это лучше, чем ожидание сети.
источник
Вы можете установить ссылку на библиотеку Scripting.Runtime, а затем использовать FileSystemObject. У него есть метод DeleteFile и метод FileExists.
См. Статью MSDN здесь .
источник