Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 111
1

Переименовать файлы в разных папках

07.07.2019, 17:43. Показов 7592. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый вечер. Нужно переименовать файлы находящиеся в разных папках
имя Путь
a12.docx D:\переименовать файлы\1а12\
f12.docx D:\переименовать файлы\12\
и11.docx D:\переименовать файлы\11s\

в любые другие имена например:
имя Путь
11a12.docx D:\переименовать файлы\1а12\
23f12.docx D:\переименовать файлы\12\
44и11.docx D:\переименовать файлы\11s\

Не подскажите макрос в VBA для excel?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.07.2019, 17:43
Ответы с готовыми решениями:

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

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

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

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

24
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
07.07.2019, 18:50 2
Strashnoslav, не полениться и набрать в поисковике rename ВБА. Одна из тысяч ссылок http://yandex.ru/clck/jsredir?... ime=144249
0
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 111
07.07.2019, 20:31  [ТС] 3
Искал но удобного для работы не нашел.
Вот например из ссылки
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
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, "Ошибка": Exit Sub
 
    Name sFileName As sNewFileName 'переименовываем файл
 
    MsgBox "Файл переименован", vbInformation, "www.excel-vba.ru"
End Sub
Как можно здесь переименовать, имея список с именами и адресами и новый в который необходимо переименовать?
0
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
08.07.2019, 06:54 4
Strashnoslav, составить массив исходных имен, либо записать их , например, в первый столбец листа, во второй соответствующие новые имена. а потом цикл по этим ячейкам. На основе того, что вы прочитали это можно записать так
Visual Basic
1
2
3
4
5
6
Last = cells(Rows.Count,1).End(xlUp).Row
For I = 1 to Last
  sFileName = Cells(I,1)
  sNewFileName = Cells(I,2)
  Name sFileName As sNewFileName 'переименовываем файл
Next
0
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 111
22.02.2020, 15:26  [ТС] 5
Доброго времени суток. Не подскажите как с помощью подобного макроса
Visual Basic
1
2
3
4
5
6
7
8
Sub tt()
Last = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To Last
  sFileName = Cells(i, 1)
  sNewFileName = Cells(i, 2)
    FileCopy sFileName, sNewFileName 
    Next
End Sub
скопировать исходные имена файлов с со своими каталогами, в другой каталог при этом создать исходные каталоги где находились файлы.
Вложения
Тип файла: xlsx пример.xlsx (10.2 Кб, 7 просмотров)
0
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
22.02.2020, 16:29 6
Добавьте перед копированием строку
MakeSureDirectoryPathExists sNewFileName
(может быть будет мешать имя файла, тогда его нужно отрезать, я не проверял и не помню)
а в модуль
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal lpPath As String) As Long
0
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
22.02.2020, 17:19 7
Strashnoslav, например так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub proba()
[A1] = "d:\Evgeny\chance.xlsm" 'на примере папок моего компа
Last = Cells(Rows.Count, 1).End(xlUp).Row
For I = 1 To Last
  Call CopyFile(Cells(I, 1), "d:\TMP")
Next
End Sub
 
Sub CopyFile(ByVal Source As String, ByVal NewDir As String)
Dim Sold As String, Snew As String, I As Integer, Last As Integer, Nd As String
Snew = NewDir & "\" & Mid(Source, 4)
Nd = Left(Snew, InStrRev(Snew, "\"))
If Dir(Nd, vbDirectory) = "" Then MkDir Nd
'MsgBox Source & "  " & Snew
FileCopy Source, Destination:=Snew
End Sub
0
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
22.02.2020, 17:47 8
MkDir насколько помню создаёт не дерево, а только один каталог. MakeSureDirectoryPathExists создаёт сразу дерево. Кстати если вдруг в именах нужна диакритика - тоже есть решение, используйте SHCreateDirectoryExW
0
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
22.02.2020, 20:14 9
А можно ещё почесать левое ухо правой рукой через голову (Hugo121, конечно, прав)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub CopyFile(ByVal Source As String, ByVal NewDir As String)
Dim Snew As String, Last As Integer, K, Nd As String
K = 4: Snew = NewDir & Mid(Source, InStrRev(Source, "\") + 1)
Do
  K = InStr(K + 1, Snew, "\")
  If K = 0 Then Exit Do
  Nd = Left(Snew, K)
'  MsgBox "k=" & K & "  " & Nd
  If Dir(Nd, vbDirectory) = "" Then MkDir Nd
Loop
FileCopy Source, Destination:=Snew
End Sub
0
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 111
22.02.2020, 22:11  [ТС] 10
Hugo121, не выходит, пробовал
Visual Basic
1
2
3
4
5
6
7
8
9
Sub tt()
Last = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To Last
  sFileName = Cells(i, 1)
  sNewFileName = Cells(i, 2)
  MakeSureDirectoryPathExists sNewFileName
    FileCopy sFileName, sNewFileName 'копируем файл
Next
End Sub
Затем обрезал тоже не выходит, может что не так делаю
Вложения
Тип файла: rar пример.rar (12.0 Кб, 14 просмотров)
0
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 111
22.02.2020, 22:26  [ТС] 11
Burk, что-то не разберусь с вашем макросом
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub CopyFile(ByVal Source As String, ByVal NewDir As String)
Dim Snew As String, Last As Integer, K, Nd As String
K = 4: Snew = NewDir & Mid(Source, InStrRev(Source, "") + 1)
Do
  K = InStr(K + 1, Snew, "")
  If K = 0 Then Exit Do
  Nd = Left(Snew, K)
'  MsgBox "k=" & K & "  " & Nd
  If Dir(Nd, vbDirectory) = "" Then MkDir Nd
Loop
FileCopy Source, Destination:=Snew
End Sub
Добавлено через 6 минут
По идее мне нужен макрос который создаст дерево каталогов, а затем уже не трудно туда закинуть файлы
0
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
22.02.2020, 22:30 12
Цитата Сообщение от Hugo121 Посмотреть сообщение
а в модуль
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal lpPath As String) As Long
- почему остановились на третьей строке? Или второй? Или четвёртой?

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

Добавлено через 1 минуту
Проверил - имя файла не мешает.
0
1846 / 1161 / 354
Регистрация: 11.07.2014
Сообщений: 4,102
23.02.2020, 01:08 13
Strashnoslav, это не макрос, а процедура с параметрами или вы их не различаете? Пример макроса запуска мой макрос proba. Просто ту процедуру CopyFile из первого моего сообщения надо заменить на CopyFile их второго сообщения.
Создаются деревья каталогов, если их нет, и тут же копируются туда файлы, получаемые с листа экселя. Надо их занести в столбик подряд на лист. Но я думаю, что у Hugo121 проще. И не надо копировать мои макросы в своё сообщение, тем более, что вы неправильно их оформляете. надо выделить код и нажать на VB в меню, читайте правила

Добавлено через 12 минут
пример ссылки на файл, который нужно копировать. Записать в ячейку А1 такую, например, строку d:\Papka1\Papka2\имя файла с расширением. В ячейку листа А2 и т.д. аналогично. Вы ведь так и хотели.
0
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 111
23.02.2020, 09:39  [ТС] 14
Hugo121, а можете скинуть рабочий вариант, буду очень благодарен
0
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
23.02.2020, 14:39 15
Лучший ответ Сообщение было отмечено Strashnoslav как решение

Решение

Да в тот же добавить просто в модуль (тот или другой, не важно) первой строкой эту указанную строку и всё работает.

Добавлено через 11 минут
В тот что в пример.rar
1
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 111
23.02.2020, 19:11  [ТС] 16
Спасибо. Модуль добавлял, но почему-то не выполнялось, сейчас заново все вставил и заработало. Всех мужчин с праздником!!!!
0
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 111
04.03.2020, 23:01  [ТС] 17
Всем доброго времени суток. Не подскажите как игнорировать повторяющиеся строки имен при переименовании
Visual Basic
1
2
3
4
5
6
7
8
Sub tt()
Last = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To Last
  sFileName = Cells(i, 1)
  sNewFileName = Cells(i, 2)
  Name sFileName As sNewFileName 
Next
End Sub
Добавлено через 19 минут
Например
e:\123\1\11\1.docx e:\123\1\11\11.docx
e:\123\1\11\1.docx e:\123\1\11\12.docx
пропускал повторяющуюся строчку исходного имени, даже если новое имя другое
0
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
05.03.2020, 01:46 18
Думаю самое правильное - такого не допускать, если это не нужно. Потому что в принципе это вполне возможно что нужны дубли файлов в разных каталогах.
Но если уж есть - можно например сперва удалить дубликаты по этому столбцу.
Или если вот прямо тут в коде - привлечь коллекцию (с ключами) или словарь. Проще код на словаре. Если повтор sFileName - пропускаем.
0
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 111
06.04.2021, 15:54  [ТС] 19
Доброго времени суток. Не подскажите, как сделать чтобы при несовпадении полного исходного имени, переходил к следующей строке:
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal lpPath As String) As Long
Sub tt()
Last = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To Last
  sFileName = Cells(i, 1)
  sNewFileName = Cells(i, 2)
  MakeSureDirectoryPathExists sNewFileName
    FileCopy sFileName, sNewFileName 'копируем файл
Next
End Sub
0
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
10.04.2021, 22:00 20
Цитата Сообщение от Strashnoslav Посмотреть сообщение
при несовпадении полного исходного имени
- с чем?
0
10.04.2021, 22:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2021, 22:00
Помогаю со студенческими работами здесь

Переименовать файлы в папках по имени папки
Добрый день, помогите батником Есть много папок, в каждой папке лежат фото в .jpg с абсолютно...

Как переименовать файлы во вложенных папках данной папки?
Имеется папка, внутри неё папки с целочисленными названиями. Непонятны 2 момента. 1. ошибка на...

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

Две таблицы dBase в разных папках
Как в выражении SQL (ODBC: Provider=MSDASQL.1;Data Source=Файлы dBASE) упомянуть после FROM две...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru