Хитрости »
28 Июль 2017 20502 просмотров
Предположим, что ежедневно во временную папку поступают файлы отчетов от филиалов. Они могут собираться из почты кодом вроде такого: Сохранить вложения из Outlook в указанную папку или добавляться в папку иными средствами. Далее Вы собираете данные из этих файлов неким кодом(вроде этого — Как собрать данные с нескольких листов или книг?). Но с каждым днем файлов все больше и больше и приходится заходить в папку и руками чистить её от лишних файлов, чтобы при сборе данных не приходилось каждый раз искать и отбирать только новые файлы.
Если надо удалять только конкретные файлы(например только файлы Excel, содержащие в имени слово «отчет»), то можно использовать такой код:
Sub Remove_AllFilesFromFolder() Dim sFolder As String, sFiles As String 'диалог запроса выбора папки с файлами 'подробнее про диалоги выбора папки или файла: ' http://www.excel-vba.ru/chto-umeet-excel/dialogovoe-okno-vybora-fajlovpapki/ With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub sFolder = .SelectedItems(1) End With sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator) 'отбирать только файлы Excel, содержащие в имени слово "отчет" sFiles = Dir(sFolder & "*отчет*.xls*") 'цикл по всем файлам в папке On Error Resume Next Do While sFiles <> "" 'удаляем файл Kill sFolder & sFiles If Err.Number = 70 Then MsgBox "Невозможно удалить файл '" & sFiles & "'. Возможно файл открыт в другой программе или нет прав на удаление", vbCritical, "www.excel-vba.ru" Err.Clear End If 'на всякий случай передаем управление системе, 'чтобы дождаться удаления DoEvents 'получаем имя следующего файла в папке sFiles = Dir Loop End Sub
Чтобы удалять полностью все файлы в папке(а не только файлы Excel), а саму папку оставить, то строку sFiles = Dir(sFolder & «*отчет*.xls*») надо записать так: sFiles = Dir(sFolder & «*»)
Если необходимо удалять файлы по дате создания/изменения(например, только файлы, созданные раньше 01.03.2017), то можно использовать такой код:
Sub Remove_FilesFromFolder_AfterDate() Dim sFolder As String, sFiles As String Dim dd As Date, dKill As Date 'задаем дату. Если файл был создан/изменен до этой даты - он будет удален dKill = CDate("01.03.2017") 'можно задать проще: dKill = #3/1/2017# 'диалог запроса выбора папки с файлами 'подробнее про диалоги выбора папки или файла: ' http://www.excel-vba.ru/chto-umeet-excel/dialogovoe-okno-vybora-fajlovpapki/ With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub sFolder = .SelectedItems(1) End With sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator) sFiles = Dir(sFolder & "*") 'цикл по всем файлам в папке On Error Resume Next Do While sFiles <> "" 'получаем дату создания или изменения файла dd = FileDateTime(sFolder & sFiles) 'если дата файла меньше заданной для удаления(был создан раньше) If dd < dKill Then 'удаляем файл Kill sFolder & sFiles If Err.Number = 70 Then MsgBox "Невозможно удалить файл '" & sFiles & "'. Возможно файл открыт в другой программе или нет прав на удаление", vbCritical, "www.excel-vba.ru" Err.Clear End If 'на всякий случай передаем управление системе, 'чтобы дождаться удаления DoEvents End If 'получаем имя следующего файла в папке sFiles = Dir Loop End Sub
Если необходимо всегда удалять файлы, дата создания которых раньше текущей, то строку dKill = CDate(«01.03.2017») нужно заменить на такую: dKill = Date. Если удалить надо файлы недельной давности, то: dKill = Date-7
Если же необходимо удалить папку полностью, а не только файлы в ней, то лучше использовать такой код:
Sub RemoveFolderWithContent() Dim sFolder As String, sFiles As String 'диалог запроса выбора папки на удаление With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub sFolder = .SelectedItems(1) End With sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator) 'путь к папке можно задать статично, если он заранее известен и не изменяется ' sFolder = "C:tempЕжедневные отчеты10072017" 'путь к папке, которую надо удалить Shell "cmd /c rd /S/Q """ & sFolder & """" End Sub
Этот код удалить папку вместе со всеми файлами буквально за секунду.
Вообще в VBA есть специальная команда для удаления директорий(папок) RmDir. Но она способна удалить только пустую папку, поэтому редко когда можно найти её практическое применение. Если в файле есть хоть один файл то команда RmDir выдаст ошибку ’75’ — File/Path access error.
Так же см.:
Как средствами VBA переименовать/переместить/скопировать файл
Просмотреть все файлы в папке
Как собрать данные с нескольких листов или книг?
Как удалить книгу из самой себя
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Удаление любых файлов из кода VBA Excel с помощью оператора Kill и метода DeleteFile объекта FileSystemObject. Знаки подстановки, синтаксис, примеры.
Оператор Kill
Описание
Kill – это оператор, предназначенный для удаления файлов с диска.
Синтаксис
- PathName – это строковое выражение, задающее одно или несколько имен файлов (по шаблону), которые требуется удалить.
Строка PathName может содержать каталоги (папки) и букву диска. Если файл с именем PathName не существует, будет сгенерирована ошибка.
Оператор Kill поддерживает использование знаков подстановки в последнем компоненте параметра PathName (собственное имя файла без пути к нему):
- Звездочка (*) – заменяет любое количество символов или ни одного.
- Вопросительный знак (?) – заменяет один символ или ни одного.
Знаки подстановки позволяют создать шаблон, по которому можно удалить сразу несколько файлов.
Примеры
Пример 1
Удаление одного файла без проверки его существования (в примере — удаление книги Excel):
Sub Primer1() On Error Resume Next Kill ThisWorkbook.Path & «Книга1.xlsx» End Sub |
Инструкция On Error Resume Next нужна для того, чтобы корректно завершить программу в том случае, если файла с именем PathName не существует.
Пример 2
Удаление одного файла с проверкой его существования:
Sub Primer2() Dim myPathName As String myPathName = «C:Новая папкаФайл1.docx» If Dir(myPathName) <> «» Then Kill myPathName End Sub |
Пример 3
Удаление нескольких файлов по шаблону:
Sub Primer3() On Error Resume Next Kill «C:Новая папкаСправка*» End Sub |
В результате работы этого кода VBA Excel будут удалены все файлы с любыми расширениями, которые начинаются со слова «Справка». Если строку Kill "C:Новая папкаСправка*"
заменить строкой Kill "C:Новая папка*2020*"
, она удалит все файлы, в имени которых есть подстрока «2020».
Как удалить объект ThisWorkbook с помощью оператора Kill из кода VBA Excel, размещенного в нем же, смотрите в статье: Удаление книги из собственного кода.
Метод DeleteFile
Описание
DeleteFile – это метод объекта FileSystemObject, предназначенный для удаления файлов с диска из кода VBA Excel.
Синтаксис
Object.DeleteFile PathName, [force] |
- Object – переменная, возвращающая объект FileSystemObject (обязательный параметр);
- PathName – строковое выражение, задающее одно или несколько имен файлов (по шаблону), которые требуется удалить (обязательный параметр);
- force – значение типа Boolean: True – удаляются все файлы, False (по умолчанию) – не удаляются файлы с атрибутом «только для чтения» (необязательный параметр).
В последнем компоненте параметра PathName (собственное имя файла без пути к нему) можно использовать знаки подстановки, также, как и для оператора Kill. Если указанный файл не существует, будет сгенерирована ошибка.
Примеры
Пример 4
Удаление одного файла с проверкой его существования:
Sub Primer4() Dim fso As Object ‘Присваиваем переменной fso ссылку на новый экземпляр FileSystemObject Set fso = CreateObject(«Scripting.FileSystemObject») ‘Проверяем существование удаляемого файла If Dir(ThisWorkbook.Path & «Изображение.png») <> «» Then ‘Удаляем файл, если он существует fso.DeleteFile ThisWorkbook.Path & «Изображение.png» End If End Sub |
Пример 5
Удаление нескольких или всех файлов по шаблону:
Sub Primer5() Dim fso As Object ‘Присваиваем переменной fso ссылку на новый экземпляр FileSystemObject Set fso = CreateObject(«Scripting.FileSystemObject») ‘Завершаем программу, если не существует ни одного файла, подходящего под указанный шаблон On Error Resume Next ‘Удаляем указанный файл (файлы) fso.DeleteFile «C:Новая папка*.docx» End Sub |
В результате работы этого кода VBA Excel из папки «Новая папка» будут удалены все файлы с расширением .docx
.
Фразы для контекстного поиска: удаление файла, удаление всех файлов, удаление нескольких книг, удаление всех книг, удаление по шаблону.
Return to VBA Code Examples
This short tutorial will demonstrate how to use DeleteFolder method of the FileSystemObject.
Delete Folder with VBA FileSystemObject
This lesson uses the FileSystemObject. In order to use it, you will need to set a reference to the VB script run-time library. See here for more information.
Deleting folders is easy using DeleteFolder method of the FileSystemObject.
Sub FSODeleteFolder()
Dim FSO As New FileSystemObject
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.DeleteFolder "C:TestFolder", False
End Sub
If the optional ’force’ part at the end of the FSO.DeleteFolder line is set to True, folders with the read-only attribute set can be also deleted.
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
VBA Delete all Files and Subfolders form a folder using Excel VBA. You can delete all files using DeleteFile method of FileSystemObject. And delete all folders using DeleteFolder method of FileSystemObject.
VBA Delete All Files and Subfolders from a Folder
Let us see how to delete files and sub-folders from a folder using VBA in Excel. The following VBA macro code helps to delete all files and sub-folders. We are using DeleteFile and DeleteFolder methods of FileSystemObject. In the below macro you can change the specified path as per your requirement. The following macro we used “*.*” in DeleteFile method. It represents all files in a specified folder. It can be any type of file. And also we used “*.*” in DeleteFolder method. It represents all folders in a specified folder.
'VBA Deleting All Files and Subfolders Sub VBAF1_Delete_All_Files_and_Subfolders() 'Variable declaration Dim sFolderPath As String Dim oFSO As FileSystemObject 'Define Folder Path sFolderPath = "C:VBAF1Test" 'Check if slash is added If Right(sFolderPath, 1) = "" Then 'If added remove it from the specified path sFolderPath = Left(sFolderPath, Len(sFolderPath) - 1) End If 'Create FSO Object Set oFSO = CreateObject("Scripting.FileSystemObject") 'Check Specified Folder exists or not If oFSO.FolderExists(sFolderPath) Then 'Delete All Files oFSO.DeleteFile sFolderPath & "*.*", True 'Delete All Subfolders oFSO.DeleteFolder sFolderPath & "*.*", True End If End Sub
Note:You can check your output by creating sample files and sub-folders in the specified folder. Run above macro. Once you run above VBA code the folder becomes empty. There are no files or sub-folders in it.
Instructions to Run VBA Macro Code or Procedure:
You can refer the following link for the step by step instructions.
Instructions to run VBA Macro Code
Other Useful Resources:
Click on the following links of the useful resources. These helps to learn and gain more knowledge.
VBA Tutorial VBA Functions List VBA Arrays VBA Text Files VBA Tables
VBA Editor Keyboard Shortcut Keys List VBA Interview Questions & Answers Blog
Good day,
right now I am working on a small Excel VBA Sheet which should us help to prepare data for a CAD release change. All these files are saved on a network drive (server) but I have read and write permissions.
Everything is working right now except the final cleanup. After processing the files I have to delete the remaining folders and files (thumbs.db).
Unfortunately these files are created on server-side and I can’t disable this setting.
I am looking for a VBA code to delete everything (files and folders) within a specific path. All I have right now is this: (saveto is coming from another module)
Dim fso As Object
Set fso = CreateObject("scripting.filesystemobject")
If Right(saveto, 1) = "" Then
MyPath = Left(saveto, Len(saveto) - 1)
End If
On Error Resume Next
fso.deletefile saveto & "*.*", True
fso.deletefolder saveto & "*.*", True
On Error GoTo 0
But with this code I don’t get rid of these stupid thumbs.db (which are created as «system files»). Anyone can help me with the last part?
Edit (marked as duplicate)
I would like to solve it with «filesystemobject»