Vba excel переименовать папку
В этой статье я хотел бы рассказать как средствами VBA переименовать, переместить или скопировать файл. В принципе методы переименования, перемещения и копирования, так сказать, встроены в VBA. Это значит что можно без вызова сторонних объектов переименовать, переместить или копировать любой файл. Все это делается при помощи всего двух команд: FileCopy и Name [Исходный файл] As [Новый файл] . Притом команда FileCopy выполняет только копирование, а Name [Исходный файл] As [Новый файл] - как переименование, так и перемещение. Разница лишь в том, что при переименовании мы указываем только новое имя файла, а при перемещении - другую директорию(папку), в которую следует переместить файл. Плюс рассмотрим пример удаления файла.
Так же разберем методы копирования, перемещения, переименования и удаления файлов и папок через библиотеку FileSystemObject (FSO).
Работа с файлами встроенными командами VBA
Работа с файлами через объект FileSystemObject (FSO)
Работа с папками через объект FileSystemObject (FSO)
Во всех примерах работы с файлами встроенными функциями будет присутствовать проверка на наличие файла по указанному пути. Делать это будем при помощи встроенной функции Dir([PathName],[Attributes]) .
PathName - указывается полный путь к файлу
Attributes - указывается признак свойств файла. Вообще их несколько(скрытый, архивный и т.п.), но нас для наших задач будет интересовать пока только один: 16(vbDirectory). Он отвечает за проверку папок и файлов без специальных свойств(т.е. не архивные, не скрытые и т.д.). Хотя по сути его можно вообще не указывать, и тогда будет по умолчанию применен атрибут 0(vbNormal) - проверка файлов без определенных свойств. Ни в том ни в другом случае ошибкой это не будет.
Sub Copy_File() Dim sFileName As String, sNewFileName As String sFileName = "C:\WWW.xls" 'имя файла для копирования sNewFileName = "D:\WWW.xls" 'имя копируемого файла. Директория(в данном случае диск D) должна существовать If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru" Exit Sub End If FileCopy sFileName, sNewFileName 'копируем файл MsgBox "Файл скопирован", vbInformation, "www.excel-vba.ru" End Sub
Sub Move_File() Dim sFileName As String, sNewFileName As String sFileName = "C:\WWW.xls" 'имя исходного файла sNewFileName = "D:\WWW.xls" 'имя файла для перемещения. Директория(в данном случае диск D) должна существовать If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru" Exit Sub End If Name sFileName As sNewFileName 'перемещаем файл MsgBox "Файл перемещен", vbInformation, "www.excel-vba.ru" End Sub
Sub Rename_File() Dim sFileName As String, sNewFileName As String sFileName = "C:\WWW.xls" 'имя исходного файла sNewFileName = "C:\WWW1.xls" 'имя файла для переименования If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru" Exit Sub End If Name sFileName As sNewFileName 'переименовываем файл MsgBox "Файл переименован", vbInformation, "www.excel-vba.ru" End Sub
Sub Delete_File() Dim sFileName As String sFileName = "C:\WWW.xls" 'имя файла для удаления If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru" Exit Sub End If Kill sFileName 'удаляем файл MsgBox "Файл удален", vbInformation, "www.excel-vba.ru" End Sub
Как видно ничего сложного.
Так же можно проделать те же операции с файлами при помощи объекта FileSystemObject. Строк кода несколько больше и выполняться операции будут медленнее(хотя вряд ли это будет заметно на примере одного файла). Однако есть существенный плюс - при помощи FileSystemObject можно корректно производить операции с файлами и папками на сетевом диске. Хотя та же Dir(sFileName, 16) часто выдает ошибку при работе с сетевыми дисками.
Прежде всего следует, я думаю, пояснить что за зверь такой - FileSystemObject.
FileSystemObject (FSO) - содержится в библиотеке типов Scripting, расположенной в файле библиотеки scrrun.dll. Объектная модель FSO дает возможность создавать, изменять, перемещать и удалять папки и файлы, собирать о них различную информацию: имена, атрибуты, даты создания или изменения и т.д. Чтобы работать с FSO необходимо создать переменную со ссылкой на объект библиотеки. Сделать это можно двумя способами: через ранее связывание и позднее. Я не буду сейчас вдаваться в подробности этих методов - тема довольно обширная и я опишу её в другой статье.
Ранее связывание: для начала необходимо подключить библиотеку Microsoft Scripting Runtime. Делается это в редакторе VBA: References-находите там Microsoft Scripting Runtime и подключаете. Объявлять переменную FSO при раннем связывании следует так:
Dim objFSO As New FileSystemObject
Плюсы раннего связывания: с помощью Object Browser можно просмотреть список объектов, свойств, методов, событий и констант, включенных в FSO. Но есть значительный минус: если планируется использовать программу на нескольких компьютерах, то есть большая вероятность получить ошибку(читать подробнее).
Позднее связывание: ничего нигде не надо подключать, а просто используем метод CreateObject(именно этот способ используется мной в примерах ниже). Методы таким образом просмотреть не получится, но зато работать будет без проблем на любых компьютерах без дополнительных действий.
Sub Copy_File() Dim objFSO As Object, objFile As Object Dim sFileName As String, sNewFileName As String sFileName = "C:\WWW.xls" 'имя исходного файла sNewFileName = "D:\WWW.xls" 'имя файла для переименования 'создаем объект FileSystemObject Set objFSO = CreateObject("Scripting.FileSystemObject") 'проверяем наличие файла по указанному пути If objFSO.FileExists(sFileName) = False Then MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru" Exit Sub End If 'копируем файл Set objFile = objFSO.GetFile(sFileName) objFile.Copy sNewFileName MsgBox "Файл скопирован", vbInformation, "www.excel-vba.ru" End Sub
Sub Move_File() Dim objFSO As Object, objFile As Object Dim sFileName As String, sNewFileName As String sFileName = "C:\WWW.xls" 'имя исходного файла sNewFileName = "D:\WWW.xls" 'имя файла для переименования 'создаем объект FileSystemObject Set objFSO = CreateObject("Scripting.FileSystemObject") 'проверяем наличие файла по указанному пути If objFSO.FileExists(sFileName) = False Then MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru" Exit Sub End If 'перемещаем файл Set objFile = objFSO.GetFile(sFileName) objFile.Move sNewFileName MsgBox "Файл перемещен", vbInformation, "www.excel-vba.ru" End Sub
Sub Rename_File() Dim objFSO As Object, objFile As Object Dim sFileName As String, sNewFileName As String sFileName = "C:\WWW.xls" 'имя исходного файла sNewFileName = "WWW1.xls" 'имя файла для переименования 'создаем объект FileSystemObject Set objFSO = CreateObject("Scripting.FileSystemObject") 'проверяем наличие файла по указанному пути If objFSO.FileExists(sFileName) = False Then MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru" Exit Sub End If 'переименовываем файл Set objFile = objFSO.GetFile(sFileName) objFile.Name = sNewFileName MsgBox "Файл переименован", vbInformation, "www.excel-vba.ru" End Sub
Хочу обратить внимание, что при переименовании файла через FileSystemObject необходимо указать только имя нового файла - путь указывать не надо. Иначе получите ошибку.
Sub Delete_File() Dim objFSO As Object, objFile As Object Dim sFileName As String sFileName = "C:\WWW.xls" 'имя файла для удаления 'создаем объект FileSystemObject Set objFSO = CreateObject("Scripting.FileSystemObject") 'проверяем наличие файла по указанному пути If objFSO.FileExists(sFileName) = False Then MsgBox "Нет такого файла", vbCritical, "www.excel-vba.ru" Exit Sub End If 'удаляем файл Set objFile = objFSO.GetFile(sFileName) objFile.Delete MsgBox "Файл удален", vbInformation, "www.excel-vba.ru" End Sub
Точно так же можно перемещать, копировать и удалять целые папки:
Sub Copy_Folder() Dim objFSO As Object Dim sFolderName As String, sNewFolderName As String sFolderName = "C:\test" 'имя исходной папки sNewFolderName = "D:\tmp\" 'имя папки, в которую копируем(нужен слеш на конце) 'создаем объект FileSystemObject Set objFSO = CreateObject("Scripting.FileSystemObject") 'проверяем наличие папки по указанному пути If objFSO.FolderExists(sFolderName) = False Then MsgBox "Нет такой папки", vbCritical, "www.excel-vba.ru" Exit Sub End If 'копируем папку objFSO.CopyFolder sFolderName, sNewFolderName MsgBox "Папка скопирована", vbInformation, "www.excel-vba.ru" End Sub
Sub Move_Folder() Dim objFSO As Object Dim sFolderName As String, sNewFolderName As String sFolderName = "C:\test" 'имя исходной папки sNewFolderName = "C:\tmp\test\" 'имя папки, в которую перемещаем(нужен слеш на конце) 'создаем объект FileSystemObject Set objFSO = CreateObject("Scripting.FileSystemObject") 'проверяем наличие папки по указанному пути If objFSO.FolderExists(sFolderName) = False Then MsgBox "Нет такой папки", vbCritical, "www.excel-vba.ru" Exit Sub End If 'перемещаем папку objFSO.MoveFolder sFolderName, sNewFolderName MsgBox "Папка перемещена", vbInformation, "www.excel-vba.ru" End Sub
Sub Rename_Folder() Dim objFSO As Object, objFolder As Object Dim sFolderName As String, sNewFolderName As String sFolderName = "C:\test\" 'имя исходной папки 'имя папки для переименования(только имя, без полного пути) sNewFolderName = "new folder name" 'создаем объект FileSystemObject Set objFSO = CreateObject("Scripting.FileSystemObject") 'проверяем наличие папки по указанному пути If objFSO.FolderExists(sFolderName) = False Then MsgBox "Нет такой папки", vbCritical, "www.excel-vba.ru" Exit Sub End If 'переименовываем папку 'получаем доступ к объекту Folder(папка) Set objFolder = objFSO.GetFolder(sFolderName) 'назначаем новое имя objFolder.Name = sNewFolderName MsgBox "Папка переименована", vbInformation, "www.excel-vba.ru" End Sub
Sub Delete_Folder() Dim objFSO As Object, objFolder As Object Dim sFolderName As String sFolderName = "C:\test\" 'имя папки для удаления 'создаем объект FileSystemObject Set objFSO = CreateObject("Scripting.FileSystemObject") 'проверяем наличие папки по указанному пути If objFSO.FolderExists(sFolderName) = False Then MsgBox "Нет такой папки", vbCritical, "www.excel-vba.ru" Exit Sub End If 'удаляем папку objFSO.DeleteFolder sFolderName MsgBox "Папка удалена", vbInformation, "www.excel-vba.ru" End Sub
FSO, конечно, способен на большее - но цель данной статьи была показать основные операции с папками и файлами как стандартными методами, так и более продвинутыми.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Переименовывает файл или каталог на диске. Функция My обеспечивает более высокие показатели производительности и быстродействия в операциях файлового ввода-вывода в сравнении с Rename . Для получения дополнительной информации см. FileSystem.
Параметры
Обязательный. Строковое выражение, указывающее имя и расположение существующего файла. Выражение OldPath может содержать имя каталога и метку диска для файла.
Обязательный. Строковое выражение, указывающее имя и расположение нового файла. Параметр NewPath может содержать имя каталога и метку диска для нового местонахождения файла. Имя файла, заданного параметром NewPath не может быть именем существующего файла.
Исключения
Файл OldPath не существует.
Нельзя переименовать с указанием другого диска.
Примеры
В этом примере функция используется Rename для переименования файла. В этом примере предполагается, что указанные каталоги уже существуют.
Комментарии
Функция Rename переименовывает файл и перемещает его в другой каталог, если это необходимо. Функция Rename может перемещать файл между дисками, но может переименовать существующий каталог только в том случае, если они NewPath OldPath находятся на одном диске. Rename не удается создать новый файл или каталог.
Rename Использование функции в открытом файле приводит к ошибке. Перед переименованием необходимо закрыть открытый файл. Rename Аргументы не могут включать подстановочные знаки с несколькими символами (*) и одинарными знаками (?).
При использовании Rename для копирования файла из незащищенного расположения в защищенное расположение файл сохраняет менее ограниченные права. Убедитесь, что вы не вводите возможный риск безопасности.
Данная команда поможет быстро переименовать сразу множество указанных файлов. Можно назначить переименование с нумерацией или на основании списка. Файлы могут быть любого типа - Excel, Word, картинки, текстовые и т.д.
Просматривать файлы:
- только выбранные - после нажатия кнопки ОК появится диалоговое окно, в котором необходимо выбрать файлы для переименования
- все в папке - после нажатия кнопки ОК появится диалоговое окно выбора папки. Выбирается папка, файлы в которой необходимо просмотреть и переименовать
-
включая подпапки - доступно для пункта все в папке. Если установлен, то файлы будут просматриваться не только в указанной папке, но и во всех вложенных в неё папках до самой глубоко вложенной. Если отключен, то файлы будут просматриваться исключительно в указанной папке.
Метод переименования:
- Только нумерация - имена всех выбранных файлов переименовываются в порядковые номера - 1, 2, 3 и т.д.
- Нумерация с префиксом - в поле указывается префикс(на примере это - новый_ ), который будет добавлен перед номером файла. После нажатия ОК и указания файлов, выбранным файлам будут даны имена с указанным префиксом и порядковым номером. В приведенном выше примере файлы будут переименованы в: новый_1 , новый_2 , новый_3 , новый_4 и т.д. Если префикс не указан, то появится предупреждение и поле можно оставить пустым. Однако даже если непосредственно префикс не указан, нижнее подчеркивание все равно будет добавлено перед нумерацией( _1 , _2 , _3 , _4 ).
- Сопоставление - переименовывает файлы по списку. В первом столбце указанного диапазона записывается текущее имя файла, а во втором - новое, которое надо дать файлу после переименования. К примеру на рисунке ниже файл с именем Картинка_1 будет переименован в Цветы , файл Фото в Пейзаж , а Книга1 в Прайс .
рис.2
В ячейках должны быть записаны только имена файлов, без расширения (.jpg, .xls,.docx и т.д.).
Для создания списка файлов для переименования можно воспользоваться командой Путь к файлу(выбрав только имена файлов -без расширения типа файла). Это поможет избежать ошибок неверного написания имени файла.
Если файл из указанного диапазона будет отсутствовать среди выбранных файлов, то он не будет переименован. Однако это не вызовет ошибки выполнения
Переименованные файлы:
- Оставить в исходной папке - будут переименованы исходные файлы. Отменить данную операцию нельзя.
- Переместить в папку - все переименованные файлы будут перемещены в указанную папку.
-
перемещать копии файлов - доступно для пункта Переместить в папку. Если установлен, то переименованы и перемещены будут копии исходных файлов. Исходные файлы при этом остаются без изменений. Если отключен, то переименовываются исходные файлы. Отменить данную операцию нельзя.
Добавлять нумерацию к файлам с одинаковым именем - если в качестве метода переименования выбрано Сопоставление, то есть вероятность, что имена файлов будут повторяться, если при этом так же выбран просмотр всех файлов в папке и подпапках. Для файлов разного типа это не критично, а для файлов одного типа это недопустимо. Например, в одной папке могут находится два файла " Первый квартал.xls " и " Первый квартал.pdf " , однако не может быть два файла " Первый.xls " . Если установлен пункт Добавлять нумерацию к файлам с одинаковым именем, то будет создано два файла: "Первый квартал.xls" и "Первый квартал(1).xls" (если одинаковых имен больше - нумерация продолжается). Если пункт Добавлять нумерацию к файлам с одинаковым именем снят, то файлы с совпадающими именами не переименовываются и весь их список можно будет просмотреть в конце обработки.
Переименовать файлы в папках
Добрый день! Дано: папка foto, в ней неограниченное число папок с названиями по принципу "052-01".
Переименовать, переместить файлы в папках
Здравствуйте, прошу помощи в решении проблемы. Исходные данные: папка с фотографиями, в ней.
Переименовать рекурсивно файлы в папках
Добрый день очень нужна помощь. Есть основная папка в которой множество других папок. а этих.
Переименовать файлы в папках по имени папки
Здравствуйте. Нужна помощь. Есть много папок , в каждой папке лежит картинка (.
Как можно здесь переименовать, имея список с именами и адресами и новый в который необходимо переименовать?
Strashnoslav, составить массив исходных имен, либо записать их , например, в первый столбец листа, во второй соответствующие новые имена. а потом цикл по этим ячейкам. На основе того, что вы прочитали это можно записать так
скопировать исходные имена файлов с со своими каталогами, в другой каталог при этом создать исходные каталоги где находились файлы.
Добавьте перед копированием строку
MakeSureDirectoryPathExists sNewFileName
(может быть будет мешать имя файла, тогда его нужно отрезать, я не проверял и не помню)
а в модуль
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal lpPath As String) As Long
MkDir насколько помню создаёт не дерево, а только один каталог. MakeSureDirectoryPathExists создаёт сразу дерево. Кстати если вдруг в именах нужна диакритика - тоже есть решение, используйте SHCreateDirectoryExW
Добавлено через 6 минут
По идее мне нужен макрос который создаст дерево каталогов, а затем уже не трудно туда закинуть файлы
а в модуль
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal lpPath As String) As Long
- почему остановились на третьей строке? Или второй? Или четвёртой?
Добавлено через 1 минуту
Да, это для Экселя х32
Добавлено через 1 минуту
Проверил - имя файла не мешает.
Добавлено через 12 минут
пример ссылки на файл, который нужно копировать. Записать в ячейку А1 такую, например, строку d:\Papka1\Papka2\имя файла с расширением. В ячейку листа А2 и т.д. аналогично. Вы ведь так и хотели.
Переименование файлов
Народ, оживите код, надо переименовать 560 файлов Sub имя() Dim sFileName As String.
Групповое переименование файлов
Здравствуйте всем! Возникла необходимость переименовать около тысячи файлов. Новые названия файлов.
Переименование файлов из файла Excel
Добрый вечер. Помогите с переименованием файлов. Есть два файла: 1 - фио_имя ПК 2 - OF1234 (или.
Решение
Вроде так, но лучше сначала проверить на кошках
Добавлено через 8 минут
ЗЫ не забудьте подключить в Tools -> References "Windows Script Host Object Model"
Всем спасибо за ответы
небольшой нюанс - надо чтобы имена файлов з таких " bilibirba.0* " стало таким " 0*.csv " (или таким " 0.0*.csv ")
Хотя впринципе неясно, что значит * в данном случае. То ли звездочку, то ли набор любых символов. Если любой набор символов:
Я правильно понял что в итоге файл типа bili.0463278 должен стать 0463278.csv ? А то чтот я не вкурю, если там файлы с расширением к примеру, его же тоже надо бы убрать перед тем как csv добавить. Выложите 2 имени файла полностью до и после преобразования.
The_Prist, сильно сомневаюсь что файлы названы билибирдой)
Добавлено через 10 минут
На входе " dz300713.001 " на выходе " 001.csv "
Ваш код отлично справляется, огромное спасибо!
Видны неприятности. К примеру если будут dz300713.001 и dz999999.001 будет ошибка файл уже существует.
Если номер до ста дойдёт вроде dz300713.100 тогда ничего не переименуется
Видны неприятности. К примеру если будут dz300713.001 и dz999999.001 будет ошибка файл уже существует.
Если номер до ста дойдёт вроде dz300713.100 тогда ничего не переименуется
dz300713.001
dz - суточный отчет ( "добовий звіт" )
300713 - дата 30 07 13
001 - номер района ( всего их 16 )
так что все в порядке
The_Prist, спасибо за труд
vldkv, Как вариант :
не получается.
Значит нужно получить доступ к папке на диске и переименовать вложенные файлы (для примера просто сделать строчными названия файлов); получаю доступ к файловой системе, получаю список вложенных файлов - это все работает; но когда пытаюсь переименовать файл с помощью "fl.Name = Lcase(stg)" выдает ошибку - неправильный вызов процедуры или аргумент. Не могу понять что делает не так; по справочнику свойство объекта File - Name содержит имя файла, его можно считать или изменять непосредственно из программы;
Может быть для переименования файла использовать метод Copy?
Добавлено через 22 минуты
получилось переименовать корневые файлы в папке с помощью:
Теперь как переименовать не только корневые файлы в папке, но и все файлы во вложенных подпапках?
Добавлено через 1 минуту
и переименовать вложенные подпапки.
Добавлено через 1 час 49 минут
кое-что получилось:
получилось переименовать корневые файлы, получилось переименовать вложенные папки и файлы в них;
проблема возникает если пытаюсь таким же способом обратиться и изменить вложенные папки во вложенных папках; выдает ошибку.
Читайте также: