Vba excel скопировать папку
Если папка, указанная параметром foldername уже существует, произойдет ошибка.
Копирование папки (метод CopyFolder)
CopyFolder – это метод объекта FileSystemObject, предназначенный для копирования папки из одного расположения в другое.
Синтаксис
Параметры
Параметр | Описание |
---|---|
object | Переменная, возвращающая объект FileSystemObject. |
source | Строковое выражение, указывающее папку, которую требуется скопировать в другое расположение. Для копирования нескольких папок используются подстановочные знаки. |
destination | Строковое выражение, задающее конечное расположение, куда требуется скопировать папку (папки) со всеми вложениями из элемента source. Подстановочные знаки не допускаются. |
overwrite | Логическое значение, которое указывает, требуется ли перезаписывать существующие папки и файлы в конечном расположении. True – папки и файлы будут перезаписаны, False – перезапись не выполняется. Необязательный параметр. По умолчанию – True. |
Перемещение папки (метод MoveFolder)
MoveFolder – это метод объекта FileSystemObject, предназначенный для перемещения папки из одного расположения в другое.
Синтаксис
Параметры
Параметр | Описание |
---|---|
object | Переменная, возвращающая объект FileSystemObject. |
source | Строковое выражение, указывающее папку, которую требуется переместить в другое расположение. Для перемещения нескольких папок используются подстановочные знаки. |
destination | Строковое выражение, задающее конечное расположение, куда требуется переместить папку (папки) со всеми вложениями из элемента source. Подстановочные знаки не допускаются. |
Удаление папки (метод DeleteFolder)
DeleteFolder – это метод объекта FileSystemObject, предназначенный для удаления папки с диска со всем ее содержимым.
Синтаксис
Параметры
Параметр | Описание |
---|---|
object | Переменная, возвращающая объект FileSystemObject. |
folderspec | Строковое выражение, указывающее папку, которую следует удалить. Для удаления нескольких папок используются подстановочные знаки. |
force | Значение типа Boolean: True – удаляются все папки, False (по умолчанию) – не удаляются папки с атрибутом «только для чтения» (необязательный параметр). |
Метод DeleteFolder удаляет папки независимо от того, есть ли в них содержимое или нет.
Удаление папки (оператор RmDir)
Синтаксис
- path – строковое выражение, определяющее каталог или папку, которую необходимо удалить.
Если удаляемый каталог или папка содержит файлы, произойдет ошибка.
Примеры
Пример 1
Создание папок в VBA Excel с помощью метода CreateFolder:
Синтаксис метода CopyFolder состоит из следующих частей:
Часть | Описание |
---|---|
object | Обязательно. Всегда имя FileSystemObject. |
источник | Обязательно. Строка знаков, представляющая спецификацию папки, которая может содержать подстановочные знаки для одной или нескольких копируемых папок. |
destination | Обязательно. Строка знаков, определяющая место назначения, в которое должны быть скопированы папка и вложенные папки из source. Использование подстановочных знаков запрещено. |
переописывание | Необязательное свойство. Значение типа Boolean, показывающее, можно ли перезаписывать существующие папки. При значении True файлы перезаписываются, при значении False перезапись файлов не происходит. По умолчанию используется значение True. |
Комментарии
Подстановочные знаки могут использоваться только в последнем компоненте пути аргумента source. Например, можно использовать:
Однако нельзя использовать:
Если источник содержит символы под диктовки или пункт назначения заканчивается сепаратором пути ()предполагается, что назначение — это существующая папка, в которой можно скопировать совпадающие папки и подмостки. В противном случае предполагается, что destination — это имя создаваемой папки. В любом случае при копировании отдельной папки могут произойти четыре вещи:
Если папка destination не существует, выполняется копирование папки source и всего ее содержимого. Это обычный случай.
Если destination является существующим файлом, происходит ошибка.
Если destination является каталогом, выполняется попытка скопировать папку и все ее содержимое. Если файл, содержащийся в source, уже существует в destination, возникает ошибка, если значение overwrite равно False. В противном случае будет выполнена попытка скопировать файл поверх существующего файла.
Если destination является каталогом только для чтения и значение overwrite равно False, при попытке скопировать в этот каталог существующий файл только для чтения возникает ошибка.
Ошибка также возникает, если значение source, заданное с использованием подстановочных знаков, не соответствует никаким папкам.
Метод CopyFolder останавливается при первой обнаруженной ошибке. Попытка отката изменений, выполненных до появления ошибки, не выполняется.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Используйте метод CopyDirectory для копирования каталога в другой каталог. Этот метод копирует и содержимое каталога, и сам каталог. Если целевой каталог не существует, он будет создан. Если каталог с тем же именем уже существует в целевом расположении, а параметр overwrite имеет значение False , содержимое двух каталогов будут объединено. Во время операции можно указать новое имя для каталога.
При копировании файлов в каталоге могут возникать исключения, вызываемые определенным файлом, например файлом, существующим во время слияния, если параметр overwrite имеет значение False . Если такие исключения возникают, они объединяются в общее исключение. Свойство Data этого исключения содержит записи, в которых путь к файлу и каталогу является ключом, а соответствующее значение содержит сведения о конкретном исключении.
Копирование каталога в другой каталог
Воспользуйтесь методом CopyDirectory , указав имена исходного и целевого каталогов. Представленный в приведенном ниже примере код копирует каталог с именем TestDirectory1 в TestDirectory2 , перезаписывая существующие файлы.
Этот пример кода также доступен в качестве фрагмента кода IntelliSense. В средстве выбора фрагментов кода он находится в разделе Файловая система: обработка дисков, папок и файлов. Дополнительные сведения см. в статье Фрагменты кода.
Отказоустойчивость
При следующих условиях возможно возникновение исключения:
Новое имя, указанное для каталога, содержит двоеточие (:) или косую черту (\ или /) (ArgumentException).
Путь является недопустимым по одной из следующих причин: это строка нулевой длины, содержащая только пробелы, содержит недопустимые символы или путь к устройству (начинается с \ \. \) ( ArgumentException ).
Путь не является допустимым, поскольку он равен Nothing (ArgumentNullException).
Параметр destinationDirectoryName имеет значение Nothing или является пустой строкой (ArgumentNullException).
Исходный каталог является корневым каталогом (IOException).
Объединенный путь указывает на существующий файл (IOException).
Исходный и конечный пути совпадают (IOException).
ShowUI имеет значение UIOption.AllDialogs , а пользователь отменяет операцию, либо невозможно скопировать один или несколько файлов в каталоге (OperationCanceledException).
Длина пути превышает максимальную длину, определенную в системе (PathTooLongException).
Имя файла или папки в пути содержит двоеточие (:) или имеет недопустимый формат (NotSupportedException).
У пользователя отсутствуют необходимые разрешения на просмотр пути (SecurityException).
Recursively copies a folder from one location to another.
Syntax
object.CopyFolder source, destination, [ overwrite ]
The CopyFolder method syntax has these parts:
Part | Description |
---|---|
object | Required. Always the name of a FileSystemObject. |
source | Required. Character string folder specification, which can include wildcard characters, for one or more folders to be copied. |
destination | Required. Character string destination where the folder and subfolders from source are to be copied. Wildcard characters are not allowed. |
overwrite | Optional. Boolean value that indicates if existing folders are to be overwritten. If True, files are overwritten; if False, they are not. The default is True. |
Remarks
Wildcard characters can only be used in the last path component of the source argument. For example, you can use:
But you can't use:
If source contains wildcard characters, or destination ends with a path separator (), it is assumed that destination is an existing folder in which to copy matching folders and subfolders. Otherwise, destination is assumed to be the name of a folder to create. In either case, four things can happen when an individual folder is copied:
If destination does not exist, the source folder and all its contents gets copied. This is the usual case.
If destination is an existing file, an error occurs.
If destination is a directory, an attempt is made to copy the folder and all its contents. If a file contained in source already exists in destination, an error occurs if overwrite is False. Otherwise, it will attempt to copy the file over the existing file.
If destination is a read-only directory, an error occurs if an attempt is made to copy an existing read-only file into that directory and overwrite is False.
An error also occurs if a source using wildcard characters doesn't match any folders.
The CopyFolder method stops on the first error it encounters. No attempt is made to roll back any changes made before an error occurs.
See also
Support and feedback
Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
Иногда бывает необходимо заполучить на лист Excel список файлов в заданной папке и ее подпапках. В моей практике такое встречалось неоднократно, например:
- перечислить в приложении к договору на проведение тренинга список файлов из раздаточных материалов для особо щепетильных юристов в некоторых компаниях
- создать список файлов для ТЗ проекта
- сравнить содержимое папок (оригинал и бэкап, например)
Для реализации подобной задачи можно использовать несколько способов.
Способ 1. Скелет из шкафа - функция ФАЙЛЫ
Этот способ использует древнюю функцию ФАЙЛЫ (FILES) , оставшуюся в Microsoft Excel с далеких девяностых. Вы не найдете эту функцию в общем списке функций, но для совместимости, она всё ещё остаётся внутри движка Excel, и мы вполне можем её использовать.
1. В любую ячейку листа (например, в А1) введём путь к папке, список файлов из которой мы хотим получить.
Обратите внимание, что путь должен оканчиваться шаблоном со звездочками:
- *.* - любые файлы
- *.xlsx - книги Excel (только с расширением xlsx)
- *.xl* - любые файлы Excel
- *отчет* - файлы, содержащие слово отчет в названии
2. Создадим именованный диапазон с помощью вкладки Формулы - далее кнопка Диспетчер имен - Создать (Formulas - Names Manger - Create) . В открывшемся окне введем любое имя без пробелов (например Мои_файлы) и в поле диапазона выражение:
После нажатия на ОК будет создан именованный диапазон с именем Мои_файлы, где хранится список всех файлов из указанной в А1 папки. Останется их оттуда только извлечь.
3. Чтобы извлечь имена отдельных файлов из созданной переменной, используем функцию ИНДЕКС (INDEX) , которая в Excel вытаскивает данные из массива по их номеру:
Если лениво делать отдельный столбец с нумерацией, то можно воспользоваться костылем в виде функции СТРОКИ (ROWS) , которая будет подсчитывать количество заполненных строк с начала списка автоматически:
=ИНДЕКС(Мои_файлы; ЧСТРОК($B$3:B3) )
= ЕСЛИОШИБКА( ИНДЕКС(Мои_файлы; ЧСТРОК($B$3:B3)) ; "")
Важное примечание : формально функция ФАЙЛЫ относится к макро-функциям, поэтому необходимо будет сохранить ваш файл в формате с поддержкой макросов (xlsm или xlsb).
Способ 2. Готовый макрос для ленивых
Если вы знакомы с макросами (не в смысле их программирования, а в смысле копипастинга готовых кодов на VBA), то вам, возможно, отлично зайдёт небольшой макрос, добавляющий в текущую книгу новый пустой лист и выводящий на него список всех файлов с их параметрами из заданной пользователем папки.
Для добавления макроса в вашу книгу нажмите сочетание клавиш Alt + F11 , или кнопку Visual Basic на вкладке Разработчик (Developer) , в открывшемся окне редактора Visual Basic вставьте новый модуль через меню Insert - Module и скопируйте туда текст этого макроса:
Для запуска макроса нажмите сочетание клавиш Alt + F8 ,или кнопку Макросы (Macros) на вкладке Разработчик (Developer) , выберите наш макрос FileList и нажмите кнопку Выполнить (Run) . В диалоговом окне выберите любую папку или диск и - вуаля!
Если захотите, чтобы вместо пути к файлу в столбце B выводилась живая гиперссылка, то замените 52-ю строку
Cells(r, 2).Formula = FileItem.Path
Cells(r, 2).Formula = "=HYPERLINK(""" & FileItem.Path & """)"
Способ 3. Мощь и красота - надстройка Power Query
Power Query - это очень мощная и при этом бесплатная надстройка для Excel от Microsoft, упрощающая множество задач по загрузке и трансформации данных. В нашей ситуации она тоже может здорово помочь.
Если у вас Excel 2016 или новее, то Power Query уже встроена в Excel по умолчанию, поэтому просто на вкладке Данные выберите команду Создать запрос / Получить данные - Из файла - Из папки (Create Query / Get Data - From file - From folder) . Если у вас Excel 2010-2013, то Power Query нужно будет скачать с сайта Microsoft и установить как отдельную надстройку и она появится у вас в Excel в виде отдельной вкладки Power Query. На ней будет аналогичная кнопка Из файла - Из папки (From file - From folder) .
В открывшемся окне нужно будет указать папку, содержимое которой мы хотим получить. После нажатия на ОК Power Query обшарит указанную папку и все вложенные подпапки и выдаст на экран окно с предварительным просмотром результатов:
Если внешний вид списка вас устраивает, то можно смело жать внизу кнопку Загрузить (Load) , чтобы залить эти данные на новый лист. Если же хочется дополнительно обработать список (удалить лишние столбцы, отобрать только нужные файлы и т.п.), то нужно выбрать команду Изменить / Преобразовать данные (Edit / Transform Data).
Поверх окна Excel откроется окно редактора Power Query, где мы увидим список всех наших файлов в виде таблицы:
Дальше возможны несколько вариантов:
-
Если нужны только файлы определенного типа, то их можно легко отобрать с помощью фильтра по столбцу Extension:
После того, как необходимые файлы отобраны, можно смело удалить ненужные столбцы, щелкнув по заголовку столбца правой кнопкой мыши и выбрав команду Удалить (Remove column ) . Это, кстати, уже никак не повлияет на фильтрацию или сортировку нашего списка:
Если в будущем планируется подсчитывать количество файлов в каждой папке (например, для контроля поступивших заявок или подсчета статистики по заявкам), то имеет смысл дополнительно сделать ещё пару действий:
- Щелкните правой кнопкой мыши по столбцу Folder Path и выберите команду Дублировать столбец (Duplicate Column) .
- Выделите скопированный столбец и на вкладке Преобразование (Transform) выберите Разделить столбец - По разделителю (Split Column - By delimiter)
Мы получим рядом с нашими данными еще несколько столбцов, где будут продублированы имена вложенных папок - это пригодится нам чуть позже для подсчета статистики с помощью сводной таблицы:
Получившиеся столбцы можно переименовать (Диск, Папка1, Папка2 и т.д.), просто щёлкнув дважды по заголовку каждого.
И, наконец, когда список готов, то его можно выгрузить на лист с помощью команды Главная - Закрыть и загрузить - Закрыть и загрузить в. (Home - Close & Load - Close & Load to. ) :
И, само-собой, теперь можно построить по нашей таблице сводную (вкладка Вставка - Сводная таблица), чтобы легко подсчитать количество файлов в каждой папке:
Дополнительным бонусом можно сделать еще один столбец с функцией ГИПЕРССЫЛКА (HYPERLINK) , которая создаст красивые стрелочки-ссылки для моментального перехода к каждому файлу:
Мелочь, а приятно :)
И вдвойне приятно, что в будущем, при изменении содержимого исходной папки, достаточно будет просто щелкнуть мышью по нашей таблице и выбрать команду Обновить (Refresh) - и Power Query выполнит всю цепочку запрограммированных нами единожды действий уже автоматически, отобразив все изменения в составе папки.
Читайте также: