Здравствуйте. Может кому будет интересно. С помощью обычных текстовых функций, с дополнительными столбцами или без них, выводим новое имя файла в колонку "Новое имя файла", не забываем про расширение файла, т.е., чтобы оно не "потерялось", так-как я не делал "защиту от дурака". ! Переименовываемые файлы не должны быть открыты в других программах или в самом Екселе, иначе будет ошибка.
DANIKOLA, здравствуйте Вам не кажется, что более универсально делать поля "старый путь" и "новый путь", чем прописывать общую для частного случая часть отдельно?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: более универсально делать поля "старый путь" и "новый путь",
Возможно я вас не до конца понял, но мне кажется названия этих полей вполне соответствуют назначению макроса, мы ведь переименовываем файлы, а не перемещаем по новому пути... Каждый в праве переделать, как ему угодно - код открыт. В макросе ListFilesInFolder меняем на своё, для тех кто плохо знает VBA.
Код
Range("A2").Value = "Старое имя файла"
Range("B2").Value = "Новое имя файла"
DANIKOLA написал: мы ведь переименовываем файлы, а не перемещаем по новому пути...
переименовать файл с точки зрения ЛЮБОЙ файловой системы значит присвоить файлу НОВОЕ имя (если файлу Х присвоить имя У - файла Х уже нет, есть файл У) скопировать файл с новым именем (не переименовать, а скопировать) это значит создать копию файла с другим именем, оригинал остается на месте, а в каком-то другом месте появляется его двойник (копия) а вот, ПЕРЕИМЕНОВАТЬ с точки зрения файловой системы и всех, кто понимает что это такое (и файловая система и процесс переименования файла) это синоним слова ПЕРЕМЕСТИТЬ
Ігор Гончаренко, я знаю это в коммандной строке windows и linux одна и та же команда может выполнять эти действия с файлами. А в vba, команда Name, тоже так умеет? У меня просто была задача переименовать группу файлов в одной папке без каких-либо перемещений, то я и не пробовал перемещать.
Name предназвначена для переименования (переноса файлов) переименовать файл, оставив в той же папке, это частный случай от переименования файла, когда он получает другой адрес и фактически перемещается в другую папку, на другой диск (и все это написано в документации)
Исправлено после прочтения справки по оператору Name.
Цитата
Оператор Name переименовывает файл и при необходимости перемещает его в другой каталог или папку.
Я было подумал, что исходные файлы останутся, а нет — переместятся в другую указанную папку. В таком случае я не вижу смысла перемещать переименовываемые файлы в другую папку.
DANIKOLA: мы ведь переименовываем файлы, а не перемещаем по новому пути
Цитата
Ігор Гончаренко: ПЕРЕИМЕНОВАТЬ это синоним слова ПЕРЕМЕСТИТЬ
я бы сказал, что ПЕРЕИМЕНОВАНИЕ - это частный случай ПЕРЕМЕЩЕНИЯ, а именно перемещение без изменения пути до имени файла и именно поэтому гораздо универсальнее делать именно ПЕРЕМЕЩЕНИЕ, но дело ваше
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Здравствуйте. Спасибо, воспользовался вашим файлом. Но при этом прошу помощи. При сохранении файлов с одинаковыми именами выдаёт ошибку. Прошу что-то добавить что-бы если такое имя уже существует, то к имени он добавлял (1), (2), (3) и т.д. Пример своего файла приложил. Прошу не смеяться над тем как я соединил макросы и как сделал способ переименования.
Sub Rename_File()
Dim sFilePath As String, LastRow As Long, Cell As Range
sFilePath = Split(Range("A1").Text, " ", 3)(2) 'путь к текущей паке
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
If Right(sFilePath, 1) <> "\" Then sFilePath = sFilePath & "\"
If Application.WorksheetFunction.CountA(Range("A3:A" & LastRow)) <> Application.WorksheetFunction.CountA(Range("B3:B" & LastRow)) Then Exit Sub
For Each Cell In Range("A3:A" & LastRow)
If Dir(sFilePath & Cell.Text, 16) <> "" And ThisWorkbook.FullName <> sFilePath & Cell.Text Then
Name sFilePath & Cell.Text As GetNewName(sFilePath, Cell.Offset(0, 1).Text) 'переименовываем файл
End If
Next Cell
'Update file list
Call ListFilesInFolder(sFilePath)
Shell "explorer.exe " & sFilePath, vbNormalFocus
End Sub
Private Function GetNewName(sFilePath As String, sName As String) As String
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim sBase As String
sBase = fso.GetBaseName(sName)
Dim sExte As String
sExte = "." & fso.GetExtensionName(sName)
Dim sFull As String
Dim sIndx As String
Dim ii As Long
Do
If ii = 0 Then
sIndx = ""
Else
sIndx = "(" & ii & ")"
End If
sFull = sFilePath & sBase & sIndx & sExte
If Dir(sFull, 16) = "" Then Exit Do
ii = ii + 1
Loop
GetNewName = sFull
End Function
Т.е. на самый первый файл номер не ставится, потому что если файл только один, то номер как бы не нужен, у меня такой вариант получился. Решение не универсальное, а исключительно для данного примера от Лилиенталь. Возможно код от уважаемого МатросНаЗебре, решит задачу Лилиенталь одним махом.
Код, может кому интересно
Код
Sub Rename_File()
Dim sFilePath As String, LastRow As Long, i As Long, myDict As Object
Dim Cell As Range, oldName As String, newName As String
sFilePath = Split(Range("A1").Text, " ", 3)(2) 'путь к текущей паке
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
Set myDict = CreateObject("Scripting.Dictionary")
For Each Cell In Range("B3:B" & LastRow)
If Not myDict.Exists(Cell.Value) Then
myDict.Add Cell.Value, WorksheetFunction.CountIf(Range("B3:B" & LastRow), Cell.Value)
End If
Next Cell
If Right(sFilePath, 1) <> "\" Then sFilePath = sFilePath & "\"
If Application.WorksheetFunction.CountA(Range("A3:A" & LastRow)) <> Application.WorksheetFunction.CountA(Range("B3:B" & LastRow)) Then Exit Sub
For i = LastRow To 3 Step -1
If Dir(sFilePath & Cells(i, 1).Text, 16) <> "" And _
ThisWorkbook.FullName <> sFilePath & Cells(i, 1).Text And _
ThisWorkbook.FullName <> sFilePath & Cells(i, 2).Text Then
If myDict.Item(Cells(i, 2).Text) > 1 Then
oldName = Cells(i, 1).Text
newName = Mid(Cells(i, 2).Text, 1, InStrRev(Cells(i, 2).Text, ".")) & "(" & _
myDict.Item(Cells(i, 2).Text) & ")" & _
Mid(Cells(i, 2).Text, InStrRev(Cells(i, 2).Text, "."))
myDict.Item(Cells(i, 2).Text) = myDict.Item(Cells(i, 2).Text) - 1
'переименовываем файл(сo счётчикoм)
Name sFilePath & oldName As sFilePath & newName
Else
'просто переименовываем файл(без счётчика)
Name sFilePath & Cells(i, 1).Text As sFilePath & Cells(i, 2).Text
End If
End If
Next i
'Update file list
Call ListFilesInFolder(sFilePath)
Shell "explorer.exe " & sFilePath, vbNormalFocus
End Sub
В словаре в Key записываем все новые имена файлов и в Item через СЧЁТЕСЛИ их количество в заданном диапазоне...
Спасибо, всё работает. Есть внутренние косяки. Если в имени нет обозначения "КПДМ......" то выдаёт ошибку. Но в данном случае это проблемы личного характера и вопросы к конструктору, который прислал комплект чертежей с файлами без обозначений.