Vba excel создать папку

Обновлено: 03.07.2024

Оператор MKDIR позволяет создать новую папку или каталог.
Функция MKDIR - это встроенная в Excel функция, которая относится к категории функций файлов/каталогов. Её можно использовать как функцию VBA в Excel.
В качестве функции VBA вы можете использовать эту функцию в коде макроса, который вводится через редактор Microsoft Visual Basic Editor.

Синтаксис

Синтаксис оператора MKDIR в Microsoft Excel:

Аргументы или параметры

Возвращаемое значение

Оператор MKDIR не возвращает значение, а скорее создает новую папку или каталог.
Если путь представляет собой сложную структуру каталогов, каталоги высокого уровня должны уже существовать, иначе оператор MKDIR вызовет ошибку, например, если вы выполнили следующий код:

Каталог c:\Test уже должен существовать. Оператор MKDIR будет пытаться создать каталог Excel только в каталоге c:\Test. Сам каталог c:\Test не будет создан.

Применение

  • Excel для Office 365, Excel 2019, Excel 2016, Excel 2013, Excel 2011 для Mac, Excel 2010, Excel 2007, Excel 2003, Excel XP, Excel 2000

Тип функции

Пример (как оператор VBA)

Оператор MKDIR может использоваться только в коде VBA в Microsoft Excel.
Давайте взглянем на некоторые примеры функций оператора MKDIR, чтобы понять, как использовать оператор MKDIR в коде Excel VBA:

В этом примере оператор MKDIR создал новый каталог с именем Examples в каталоге c:\Excel, например:

В этом примере каталог с именем Files будет создан в каталоге c:\Excel\Examples.

Часто задаваемые вопросы

Вопрос: Я не уверен, существует ли уже конкретный каталог.
Если он не существует, я бы хотел создать его с помощью кода VBA. Как я могу это сделать?

Ответ: Вы можете проверить, существует ли каталог, используя приведенный ниже код VBA:

If Len ( Dir ( "c:\TEST\Excel\Examples" , vbDirectory ) ) = 0 Then

В этом примере код сначала проверяет, существует ли каталог c:\TEST\Excel\Examples.
Если он не существует, оператор MKDIR создаст новый каталог с именем Examples в каталоге c:\TEST\Excel.

Как известно, VBA-функция MkDir может создать только папку в существующем каталоге (папке).

Например, код MkDir "C:\Папка\" отработает корректно в любом случае (создаст указанную папку),
а код MkDir "C:\Папка\Подпапка\Каталог\" выдаст ошибку Run-time error '76': Path not found
(потому что невозможно создать каталог Подпапка в несуществующем ещё каталоге Папка)

Можно, конечно, использовать несколько функций MkDir подряд - но это усложняет код.

Самый простой способ решения проблемы - использование WinAPI-функции SHCreateDirectoryEx, которая может создать все нужные папки и подпапки за один запуск.

Пример использования функции SHCreateDirectoryEx:

Комментарии

Ну, например нужно создать 20 папок и еще подпапки. Сделать это за 1 клик или несколько, думаю разница очевидна-экономия времени

А какая разница, сразу или по очереди?
В любом случае это выполнится почти моментально.

А если нужно создать сразу несколько папок и подпапки в указанной директории по списку в эксель, это реализуемо?

Работает. Отлично работает.
На вопрос по Declare есть ответ пятью комментариями ниже

Не работает. Вообще.
B на вопрос о Declare полтора года нет ответа . печально что-то

а что делать если на такую строку кода:

Declare function SHCreateDirectoryEx Lib "shell32" Alias "SHCreateDirectoryExA" (ByVal hwnd As Long, ByVal pszPath As String, ByVal psa As Any) As Long

система реагирует ошибкой : Sub or function not defined?

Красиво, но в макросах Outlook не завелось.
Написал через FileSystemObject

Вася молодец! набросал себе процедуру для создания подкаталогов. Лишний раз API дёргать не буду.

Тот же макрос, только надо первую строку написать так:

Здравствуйте, а для 64-битного офиса есть такие фишки?

Скажите пожалуйста , а как ещо добавить гиперлинк на созданую папку

Большое спасибо, очень помогли.

Sub mkdir2(Путь$)
Set FSO = CreateObject("Scripting.FileSystemObject")
a = Split(Путь, "\")
For i = 0 To UBound(a)
If a(i) <> "" Then
aa = aa & a(i) & "\"
If FSO.FolderExists(aa) = False Then MkDir aa
End If
Next
End Sub

Спасибо Вам, попробую.

Здравствуйте, Иван.
Это не вопрос, это задание. Вопроса не вижу.

Вам на форуме не ответили по той же причине, - нет никакой конкретики (что именно у вас не получается)

Вот готовый код, - его надо только вставить в ваш файл, и запустить Макрос_который_нужно_запускать:

Сразу говорю, - если у вас не получится вставить макрос в свой файл, или запустить его, - помогать бесплатно не буду.

Доброго времени суток. У меня такой ворос. на диске D необходимо создавать папки из столбца А
(А1= папка1\подпапка2\
А2= папка2\подпапка 3\подпапка 4
и т.д.)

Друзья!
Такая ситуация:
Необходим создавать на диске D:\ папки и подпапки по значению ячеек двух соседних столбцов:
НАПРИМЕР:
D:\папка\подпапка\
если "папка"=А1. 100000, а "подпапка"=В1. 100000

Макрос VBA загрузки списка файлов из папки

Функция FilenamesCollection предназначена для получения списка файлов из папки, с учётом выбранной глубины поиска в подпапках.

Используется рекурсивный перебор папок, до заданного уровня вложенности.
В процессе перебора папок, пути у найденным файлам помещаются в коллекцию (объект типа Collection) для последующего перебора.

К статье прикреплено 2 примера файла с макросами на основе этой функции:

  • Пример в файле FilenamesCollection.xls выводит список файлов на чистый лист новой книги (формируя заголовки)
  • Пример в файле FilenamesCollectionEx.xls более функционален - он, помимо списка файлов из папки, отображает размер файла, и дату его создания, а также формирует в ячейках гиперссылки на найденные файлы.
    Вывод списка производится на лист запуска, параметры поиска файлов задаются в ячейках листа (см. скриншот)

Смотрите также расширенную версию макроса на базе этой функции:

Макрос FolderStructure выводит в таблицу Excel список файлов и подпапок с отображением структуры (вложенности файлов и подпапок)


ПРИМЕЧАНИЕ: Если вы выводите на лист список имен файлов картинок (изображений), то при помощи этой надстройки вы сможете вставить сами картинки в ячейки соседнего столбца (или в примечания к этим ячейкам)

Внимание: если требуется, чтобы поиск не зависел от регистра символов в маске файла
(к примеру, обнаруживались не только файлы .txt, но и .TXT и .Txt),
поставьте первой строкой в модуле директиву Option Compare Text

Этот код позволяет осуществить поиск нужных файлов в выбранной папке (включая подпапки), и выводит полученный список файлов на лист книги Excel:

Ещё один пример использования:

PS: Найти подходящие имена файлов в коллекции можно при помощи следующей функции:

Комментарии

Михаил, найдите в верхней части кода строку Option Explicit
и удалите её (эта строка требует объявлять переменные)

Подскажите. Почему excel может ругаться на
Set FSO = CreateObject("Scripting.FileSystemObject") ' создаём экземпляр FileSystemObject
Пишет что переменная не объявлена/не определена

Нужно выше дописать
Dim FSO As Object?
Или в настройках excel 2016 что-то не так? Притом ругается на все не объявленные переменные.
А переменные типа Filename$ вообще не воспринимает как переменные. В чем может быть дело?
Гуглинг пока не помог.

Здравствуйте.
DoEvents никак не влияет на правильность работы (и не может повлиять)
А количество активных гиперссылок на листе Excel ограничено, — никак не сделать, чтобы на одном листе было более 50 или 65 тысяч АКТИВНЫХ гиперссылок.

Доброго времени суток. Огромное спасибо за программу!

Добавлю от себя и задам вопрос.

При использовании "DoEvents" программа может не правильно работать, в том числе выводить не все значения. Я ее закомментировал.

При привышении 65532 строк гиперссылки прекращают формироваться. Как можно победить?

Здравствуйте.
Под заказ что угодно могу сделать (платно)

Здравствуйте. Для примера из файла "FilenamesCollectionEx.xls" - можете сделать, чтобы выводимый на лист Excel список файлов был отсортирован по размеру(по уменьшению)?

Здравствуйте.
Могу сделать под заказ
Оформляйте заказ на сайте, и обязательно прикрепляйте пример файла с примером результата.

Здравствуйте! Меня тоже интересует макрос по поиску файлов. Можете сделать так что бы в ячейках к примеру A1 задать имя файла, A2 задать тип файла и A3 путь к папке?

Огромное Вам спасибо! Столько времени мне съэкономили.
СПА-СИ-БО! :-)

Спасибо. Очень полезная вещь!

Добрый день
В случае если в именах файлов встречаются нестандартные символы (допустимые в Win) макрос выдает ошибку
Ошибка в строке ДатаСоздания = FileDateTime(ПутьКФайлу)
Можно добавить onError Resume Next но это пропуск ошибки будет а размер файла не будет определен. Есть ли варианты сделать определение размера файлов и для таких файлов тоже?

Игорь, подскажите, а можно ли в файл FilenamesCollectionEx.xls добавить маску имени подпапки, в которой производить поиск? Ситуация: файл с одинаковм именем может лежать в подпапках с разными именами. Я точно знаю, что нужная мне версия должна лежать в определенной подпапке. И проверять таким образом только их?

Так вроде и то и другое выводится
Код открыт ведь, — поменяйте как вам надо, если лишний столбец мешает.

Возможно я слепой или плохо читаю, но я не увидел что-то подобное в коментах. Поэтому мой вопрос следующий: можно как-то сделать так, чтобы выводило только название файла а не весь путь?

Отбой, разобрался. Виноват оказался не этот макрос, а тот, который его результаты использовал. Мораль — люди, не юзайте Dir, если вам нужно что-то сделать с папкой, к которой он обращается.

В моём макросе нет MoveFolder - так что мой макрос точно не виноват в вашей проблеме.
Проблема - либо в неверном использовании MoveFolder (не то или не туда перемещаете), либо нет прав доступа на перемещение в заданное место.

Игорь, всё это прекрасно. Непонятно только, что нужно сделать с Вашим макросом, чтобы после его вызова с папкой можно было бы ещё и что-нибудь сделать, например, переместить. Сейчас после вызова FSO.MoveFolder вылетает с ошибкой Access denied. Проверено, виноват именно Ваш макрос — если закомментировать ТОЛЬКО его вызов, FSO.MoveFolder отрабатывает нормально.

Спасибо, ОГРОМНОЕ.
Выручайте ребята! макрос в целом отличный, но для моих целе нужно немного переделать.
Нужно чтоб все файлы находящиеся в каждой папке были в одной ячейке через разделитель ( | )
Например:
C:\images\04-2016\10\32g.jpg|C:\images\04-2016\10\33g.jpg|C:\images\04-2016\10\33g.jpg

Да, сделал.
Высылайте на почту подробное задание (что и как должно выглядеть, для чего это вообще нужно, и т.д.)
Тогда озвучу сроки и стоимость

Добрый день!
Скажите, пожалуйста, сделали ли вы макрос для Александра?
Если да, то за сколько его можно приобрести?
Если нет, то какие сроки выполнения?
Спасибо!

Напишите на почту стоимость и сроки выполнения

Александр, в этом случае нужен более сложный макрос.
Могу сделать под заказ.

Здравствуйте, Макрос хороший. Всё отлично выводит. Но как сделать дерево? Имеется несколько папок, далее нажимаешь на папку или плюс или еще что-то, она открывается, появляется подпапки, опять жмешь на подпапку появляются подпапки и т.д.

Спасибо, отличный макрос

Ограничение на полное имя файла, включая расширение - 259 символов. Соответственно, все файлы, имеющие более длинное имя при выполнении
Set curfold = FSO.GetFolder(FolderPath)
будут проигнорированы. Тестировал на EX2010, W7 и MSServer 2008. У меня из 28 (curfold.Соunt) файлов реально в коллекции только 15 (curfold.items(1). curfold.items(15))

А как сделать макрос чтобы он мне показал только пустые папки?

Ограничений по длине имени файла, вроде как, нет (по крайней мере, за много лет использования этого кода на тысячах компов, с проблемами не сталкивался)

Добрый день.
файл 148 знаков (рус.буквы) не обрабатывается,
и сам файл на сервере (если файл на раб.столе то все работает)
какая максимальная длина имени и можно-ли ее обойти.

Адаптировал к access - все работает, спасибо, очень помогло

Ринат, посмотрите макрос обработки файлов из папки.
Там выводится диалоговое окно папки, и обрабатываются все файлы в ней (независимо от имён файлов)

Добрый день!
Такой вопрос, в отделе каждый месяц сотрудник ведет отчет по своей работе в табличной форме в ексель каждый в своем файле, а начальству необходимо данные отчеты ввести в свою итоговую таблицу для себя, то есть скопировать данные отчетов с файлов каждого сотрудника в свой отдельный файл. Я создал макрос, для скопирования данных с файлов каждого сотрудника в таблицу файла начальству указывая путь к каждому файлу. Но при этом возникает определенные неудобства, каждый месяц нужно пути к файлам прописывать заново, так как на следующий месяц создаются новые файлы по отчетам, и пути к ним необходимо обновлять. Подскажите пожалуйста, как можно сделать так, чтоб пути к файлам привязывались не по конкретному расположению файла, а например указыванием месяца и года можно было сформировать единый отчет на определенный месяц. Спасибо заранее!

Большое спасибо автору! Список использую для каталогизации архива сканов документов.

Да, можем сделать такой макрос под заказ.
Минимальная стоимость заказа 1500 руб.

добрый день
подскажите можно ли написать макрос под следующие цели
необходимо что бы в ячеке которую выделил вписывались имена файлов фотографий, если их несколько выбираешь тогда добавляются все через запятую или точку запятую только имя файла и расширение
например как вставить фото в ячейку но вставляется не фото а именно имя

или например на основе Вашего FilenamesCollectionEx.xls нашел все файлы на диске/папке нужные -нажимаешь на файл и ты нужен выбрать ячейку куда вписать имя файла
заранее спасибо

У меня почему-то размер файла в байтах выводится абсолютно иной, иногда даже с отрицательным значением.
Пример:
1.вес файла 3 840 327 Кб или 3,66 Гб, а таблица выдает "-362 472 675"
2.вес файла 5 082 087 Кб или 4,84 Гб, таблица выдает "909 089 137"

Добрый день! Подскажите, возможно ли добавить столбцы "продолжительность" и "ширина кадра", которые имеются в данных файлов?

Здравствуйте, Елизавета.
Причин может быть несколько, навскидку:
- проблемный файл, или файл, к которому у вас нет доступа (ошибка 53 - файл не найден)
- слишком длинное имя папки (много уровней вложенности) и/или файла
- сбой в файловой системе
- ошибка в макросе (что-то в коде не учтено)

Игорь, огромное вам спасибо за эту работу!
Несколько лет использую ваш файл для классификации фильмов, но пару недель назад почему-то он перестал работать. Никакой критичности в этом нет, т.к. главное исправила благодаря обсуждениям тут, но мне непонятно и жутко интересно, почему так происходит. Может, это связано с активацией офиса(примерно в то же время было)? Офис 10й.
У меня 2 вкладки в этом файле, обновляю список на 2й, и затем новые позиции копирую в первую (накапливаю). При обновлении списка, после 60-70 позиций, макрос останавливается и сообщает об ошибке Run-time error 53 со сслыкой на строку ДатаСоздания = FileDateTime(ПутьКФайлу). Дело не файле, т.к. его удаление не помогло. Я добавила в скрипт "On Error Resume Next", список обновляется до конца, но перестают запускаться фильмы по гиперссылке в 1й вкладке "не удается открыть указанный файл" (во 2й работают), хотя файл и макросы одни и те же. Знаете, в чем может быть причина?

Создать приложение в VBA, позволяющее создать примечание при открытии книги Excel
нужно 1. Создать приложение в VBA, позволяющее создать примечание при открытии книги Excel. как.

Создать робота на VBA Excel
Задача: Создать макрос, который развернет нужное мне приложение, и отработает нажатие определенных.


VBA Excel как создать подсказку
Доброго времени суток возможно ли создание подсказки (коммента) в пользовательской функции.

Решение

Причем если можно учесть тот факт что книга-форма ипользуется очень часто, и при кажом открытии или закрытии если она будет создавать новую папку ВИНДОВС не мучал лишними вопросами, типа папка существует заменить. Чтоб не мучал вопросами - просто удаляем папку (если в ней есть какие-то файлы, они будут удалены!)
Чтоб не мучал вопросами - просто удаляем папку (если в ней есть какие-то файлы, они будут удалены!) Спасибо конечно, очень помог, дальше я думаю сам придумаю что-нибудь, но удалять эту папку нельзя, там хранатся файлы, которые потом еще пару лет нужны будут. Поэтому после проверки на существование папки, если она существует можно же просто выйти из процедуры.

Зачем всё усложнять?

Если папки ещё нет - она будет создана.
Если она уже существует, то ничего не произойдёт. Ох уж эти любители On Error!
А теперь давайте представим, что там примерно должно быть в коде дальше? Например что-то вроде этого:

А теперь представим, что такого диска в системе нет. Или есть, но доступ на запись у пользователя отсутствует, что тогда? Строка сохранения книги просто не выполнится! Пользователь об этом даже не узнает, и все его труды в этой книге пропадут. Если уж вам так хочется простоты, то отключайте обработку ошибки On Error GoTo 0 после критического места.

А вообще повторюсь (в какой-то соседней теме уже поднимался вопрос обработки ошибок), ошибку, если есть такая возможность, лучше избегать, это пишут во всех книгах и это говорят все мои знакомые гуру. Ничего страшного в паре "лишних" строк кода нету! А начинающим даже полезно. Представим, что вылетает ошибка типа "Произошла ошибка, обратитесь к разработчику". А разработчик где-то на островах в этот момент, отдыхает . А у заказчика годовой отчёт горит. Хотела бы я позырить на то как он будет удалённо трассировать код, не видя чё жмёт пользователь када вылетает ошибка .

Никто и не говорил про необходимость проверять возникновение ошибок.
Я в подобных случаях использую примерно такие конструкции:

В любом случае, всех возможных ошибок не предусмотришь.

А вообще повторюсь (в какой-то соседней теме уже поднимался вопрос обработки ошибок), ошибку, если есть такая возможность, лучше избегать, это пишут во всех книгах и это говорят все мои знакомые гуру. Ничего страшного в паре "лишних" строк кода нету!

Ладно, если было бы достаточно пары строк.
В случаях, когда любое из последовательных действий может вызвать ошибку, я сам использую подобные конструкции (например, в цикле открываем файл excel, в нем ищем определённый лист, на нём - некую таблицу, и т.д.)

В данном же случае, ИМХО, вполне достаточно и On Error Resume Next

Не спорю, полезно.
Но, если человеку нужен ОДИН работающий макрос, и он в будущем не намерен углубляться в дебри программирования, - его вполне устроит и "урезанный" вариант макроса.

Зачем пытаться предусмотреть все ошибки, не зная, на каких данных и оборудовании будет работать этот макрос?
Бывает, я пишу на форум макросы из 2 строк: первая - это On Error Resume Next, вторая - длинная строка типа этого:

Для своих нужд, я, конечно, такое бы не написал, но просящих помощи форумчан такие варианты более чем устраивают.

Решение

Потому что после этого, пользователи будут медленно и с наслаждением рвать тебя на кусочки…

Читайте также: