Vba excel переименовать папку

Обновлено: 04.07.2024

В этом пошаговом руководстве приводятся основные сведения о файловом вводе-выводе в Visual Basic. В нем описывается создание небольшого приложения, перечисляющего текстовые файлы в каталоге и анализирующего их. Для каждого выбранного текстового файла приложение предоставляет атрибуты файла и первую строку содержимого. Кроме того, предоставляется возможность записать информацию в файл журнала.

Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Персонализация среды IDE.

Создание проекта

В меню Файл выберите пункт Создать проект.

Откроется диалоговое окно Создание проекта .

В области Установленные шаблоны разверните узел Visual Basic и выберите элемент Windows. В середине области Шаблоны щелкните Приложение Windows Forms.

В поле Имя введите FileExplorer , чтобы задать имя проекта, а затем нажмите кнопку ОК.

Visual Studio добавит проект в обозреватель решений, после чего откроется конструктор Windows Forms.

Добавьте в форму элементы управления из приведенной ниже таблицы и установите для их свойств соответствующие значения.

Выбор папки и перечисление файлов в ней

Создайте обработчик событий нажатия Click для кнопки browseButton , дважды щелкнув этот элемент управления в форме. Откроется редактор кода.

Добавьте следующий код в обработчик событий Click .

Вызов FolderBrowserDialog1.ShowDialog открывает диалоговое окно Выбор папки. Когда пользователь нажимает OK, свойство SelectedPath передается как аргумент методу ListFiles , который добавляется в следующем шаге.

Добавьте приведенный ниже метод ListFiles .

Этот код сперва очищает элемент ListBox.

Затем метод GetFiles возвращает коллекцию строк — по одной для каждого файла в каталоге. Метод GetFiles принимает аргумент шаблона поиска, чтобы извлечь файлы, соответствующие определенному шаблону. В этом примере возвращаются только файлы с расширением TXT.

Строки, возвращаемые методом GetFiles , затем добавляются в элемент управления ListBox.

Элемент ListBox содержит список TXT-файлов в выбранной папке.

Остановите работу приложения.

Получение атрибутов файла и содержимого текстового файла

Создайте обработчик событий нажатия Click для кнопки examineButton , дважды щелкнув этот элемент управления в форме.

Добавьте следующий код в обработчик событий Click .

Этот код проверяет, выбран ли элемент в элементе ListBox . Затем он получает запись пути к файлу из элемента ListBox . Метод FileExists позволяет проверить, существует ли файл.

Путь к файлу передается как аргумент методу GetTextForOutput , который добавляется в следующем шаге. Этот метод возвращает строку, содержащую информацию о файле. Информация о файле отображается в элементе MessageBox.

Добавьте приведенный ниже метод GetTextForOutput .

Метод GetFileInfo используется в коде для получения параметров файла. Параметры файла добавляются в StringBuilder.

Метод OpenTextFileReader считывает содержимое файла в StreamReader. Первая строка содержимого файла извлекается из StreamReader и добавляется в StringBuilder .

Выберите файл в элементе ListBox и щелкните Исследовать. В окне MessageBox будет выведена информация о файле.

Остановите работу приложения.

Добавление записи в журнал

В конец обработчика событий examineButton_Click добавьте приведенный ниже код.

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

Метод WriteAllText, которому передается аргумент append со значением True , используется для создания записи в журнале.

Запустите приложение. Перейдите к текстовому файлу, выберите его в элементе ListBox , установите флажок Сохранить результаты и щелкните Исследовать. Проверьте, добавлена ли запись в файл log.txt .

Остановите работу приложения.

Использование текущего каталога

Создайте обработчик событий для события Form1_Load , дважды щелкнув форму.

Добавьте в обработчик событий приведенный ниже код.

Этот код задает текущий каталог в качестве каталога по умолчанию для обозревателя папок.

Запустите приложение. При первом нажатии кнопки Обзор открывается диалоговое окно Выбор папки с текущим каталогом.

Остановите работу приложения.

Выборочное включение элементов управления

Добавьте приведенный ниже метод SetEnabled .

Метод SetEnabled включает и отключает элементы управления в зависимости от того, выбран ли элемент в элементе ListBox .

Создайте обработчик событий SelectedIndexChanged для элемента filesListBox , дважды щелкнув элемент управления ListBox в форме.

Добавьте вызов метода SetEnabled в новый обработчик событий filesListBox_SelectedIndexChanged .

Добавьте вызов метода SetEnabled в конце обработчика событий browseButton_Click .

Добавьте вызов метода SetEnabled в конце обработчика событий Form1_Load .

Запустите приложение. Флажок Сохранить результаты и кнопка Исследовать отключены, если элемент не выбран в элементе ListBox .

Часто при разработке различных проектов в VBA требуется где-то хранить различные служебные данные: списки, константы(вроде путей к файлам, email-ов и т.п.). Обычно это делается на отдельных листах, которые потом делают очень скрытыми. А на листах делает еще и потому, что списки удобнее хранить именно на них, да и порой необходимо дать конечному пользователю возможность самому изменять некие данные. Например, программа должна собирать информацию с различных файлов. Но файлы могут располагаться в различных папках - зависит от того, на каком компьютере программа запускается. Или лист содержит списки артикулов, на основании которых программа отбирает некоторые файлы. И эти артикулы могут изменяться со временем. В таких случаях лист не скрывают, а оставляют на виду, чтобы пользователь сам мог прописать путь к нужным папкам и файлам, вписать нужные артикулы и т.п.
В коде к этому листу можно обращаться по имени. Предположим, лист называется "SETS". Тогда код получения данных из ячейки A2 будет выглядеть так:

Dim v v = ThisWorkbook.Sheets("SETS").Range("A2").Value

Лист SETS

Подробнее про обращение к диапазонам можно узнать из статьи: Как обратиться к диапазону из VBA
Все бы ничего, но есть одна ложка дегтя: пользователь может случайно этот лист переименовать. Тогда обращение к листу по заранее заданному имени вызовет ошибку( 9 - Subscript out of range ). Можно пойти другим путем - обратиться к листу по его порядковому номеру. Например, наш лист "SETS" расположен вторым по порядку в книге:

Тогда код получения данных из ячейки A2 будет таким:

Dim v v = ThisWorkbook.Sheets(2).Range("A2").Value

Где искать кодовое имя листа

Но и здесь проблема: пользователь может удалить первый лист или просто переместить наш лист "SETS" в другое место. Что опять либо вызовет ошибку 9 - Subscript out of range (если количество листов в книге меньше указанного числа. В нашем примере если в книге будет только один лист) либо запишет нам в переменную v значение из совершенно другого листа и как следствие - это будет не то значение, которое нам нужно.
Как же быть? Есть такое понятие - кодовое имя листа. Т.е. у листа есть два имени: одно отображаемое - это то, которое мы видим на ярлыке(на рисунке выше это Лист1, SETS, Лист2). И есть кодовое имя, которое не видно напрямую. Чтобы увидеть кодовое имя листа необходимо перейти в редактор Visual Basic for Application( Alt + F11 ), отобразить окно проводника проекта -View -Project explorer(или Ctrl + R ), раскрыть папку Microsoft Excel Objects. Там мы увидим все объекты проекта VBA и их имена. Само название листов в этом окне состоит из двух частей: сначала идет кодовое имя листа, а в скобках - имя, отображаемое на ярлыке:

Где искать разобрались. Что нам это дает? Т.к. это имя просто так не найти - пользователь не сможет уже изменить его имя. А обратиться к такому листу из кода VBA проще простого - как и к любому из компонентов проекта - просто по его кодовому имени(для нашего листа "SETS" это Лист2)

Dim v v = Лист2.Range("A2").Value

Изменить кодовое имя листа

Теперь ни переименование ярлыка, ни перемещение не вызовет ошибку. Ошибку теперь может вызвать удаление этого листа. Но это другая история.
Удаление листов можно запретить, защитив структуру книги(Рецензирование (Review) -Защитить книгу (Protect workbook) )
И еще важно помнить: обращение к листу по его кодовому имени приведенным выше способом возможно исключительно внутри той книги, в которой этот лист расположен. Обратиться к нему по привычке с указанием книги уже не получится: ActiveWorkbook.Лист2.Range("A2").Value . Т.е. по факту нельзя обратиться к листу по кодовому имени из другой книги. Хотя в большинстве случаев это и не надо. Если уж реальная необходимость возникнет - ниже приведена функция поиска листа по его кодовому имени, которую легко можно переделать под получение отображаемого имени листа, найдя его по кодовому имени.
Чтобы самостоятельно изменить имя кодового листа, необходимо выделить этот лист в проводнике проекта -отобразить окно свойств, если оно еще не отображено(View -Properties Window или F4 ) и просто изменить свойство Name:

Для чего переименовывать? Во-первых, не на всех ПК кириллица воспринимается нормально. Поэтому лучше в кодах использовать латиницу. Во-вторых - код будет более читаемый и наглядный, если обращение будет к объектам вроде wsSets и wsData , чем к объектам вида Лист1 , Лист2 и т.п.
Но при переименовании необходимо помнить, что кодовое имя листа не должно содержать пробелов и иных знаков препинания(кроме нижнего подчеркивания), не должно начинаться с цифр. В общем такие же требования, как и к именам макросов.

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

'--------------------------------------------------------------------------------------- ' Procedure : RenameSheetCodeName ' Purpose : Ищет в указанной книге лист с указанным кодовым именем ' wb - Книга, лист в которой необходимо найти ' sName - Кодовое имя листа, которое надо проверить на наличие в книге '--------------------------------------------------------------------------------------- Function FindSheetByCodeName(wb As Workbook, sName As String) Dim ws As Worksheet 'цикл по всем листам For Each ws In wb.Worksheets If StrComp(ws.CodeName, sName, 1) = 0 Then 'сравнение имени без учета регистра 'назначаем функции возвращаемое значение FindSheetByCodeName = True Exit Function End If Next End Function

Проверить при этом наличие листа с кодовым именем wsSets можно так:

И вдогонку код, который поможет быстро переименовать кодовое имя листа по его отображаемому имени. Т.е. все что надо - знать имя листа, отображаемое на ярлыке. И указать новое кодовое имя:

Вызвать переименование кодового имени листа можно будет так:

Для кодового имени листа программно необходимо, чтобы было проставлено доверие к объектной модели проекта VBA и изменяемый проект не должен быть защищен. Подробнее читайте в статье: Что необходимо для внесения изменений в проект VBA(макросы) программно
Без этого будет невозможно программное вмешательство в проект VBA.


Переименовать файлы в папках
Добрый день! Дано: папка foto, в ней неограниченное число папок с названиями по принципу "052-01".

Переименовать, переместить файлы в папках
Здравствуйте, прошу помощи в решении проблемы. Исходные данные: папка с фотографиями, в ней.

Переименовать рекурсивно файлы в папках
Добрый день очень нужна помощь. Есть основная папка в которой множество других папок. а этих.

Переименовать файлы в папках по имени папки
Здравствуйте. Нужна помощь. Есть много папок , в каждой папке лежит картинка (.

Искал но удобного для работы не нашел.
Вот например из ссылки
Как можно здесь переименовать, имея список с именами и адресами и новый в который необходимо переименовать? Strashnoslav, составить массив исходных имен, либо записать их , например, в первый столбец листа, во второй соответствующие новые имена. а потом цикл по этим ячейкам. На основе того, что вы прочитали это можно записать так
Доброго времени суток. Не подскажите как с помощью подобного макроса
скопировать исходные имена файлов с со своими каталогами, в другой каталог при этом создать исходные каталоги где находились файлы. Добавьте перед копированием строку
MakeSureDirectoryPathExists sNewFileName
(может быть будет мешать имя файла, тогда его нужно отрезать, я не проверял и не помню)
а в модуль
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal lpPath As String) As Long MkDir насколько помню создаёт не дерево, а только один каталог. MakeSureDirectoryPathExists создаёт сразу дерево. Кстати если вдруг в именах нужна диакритика - тоже есть решение, используйте SHCreateDirectoryExW А можно ещё почесать левое ухо правой рукой через голову (Hugo121, конечно, прав)
Затем обрезал тоже не выходит, может что не так делаю Добавлено через 6 минут
По идее мне нужен макрос который создаст дерево каталогов, а затем уже не трудно туда закинуть файлы а в модуль
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal lpPath As String) As Long

- почему остановились на третьей строке? Или второй? Или четвёртой?

Добавлено через 1 минуту
Да, это для Экселя х32

Добавлено через 1 минуту
Проверил - имя файла не мешает.

Добавлено через 12 минут
пример ссылки на файл, который нужно копировать. Записать в ячейку А1 такую, например, строку d:\Papka1\Papka2\имя файла с расширением. В ячейку листа А2 и т.д. аналогично. Вы ведь так и хотели.

Данная команда поможет быстро переименовать сразу множество указанных файлов. Можно назначить переименование с нумерацией или на основании списка. Файлы могут быть любого типа - 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" (если одинаковых имен больше - нумерация продолжается). Если пункт Добавлять нумерацию к файлам с одинаковым именем снят, то файлы с совпадающими именами не переименовываются и весь их список можно будет просмотреть в конце обработки.

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