Добрый день, в папке есть файлы имеющие названия такого типа "Станция Имя 09.2022 (ФРС-2)" нужно чтоб код удалял в имени файла вот этот момент "09.2022" (месяц и год во всех файлах разные). Имеется такая заготовка, пробовал сделать через python re.compile(r'\d\d.\d\d\d\d'), но что-то тоже не получилось.
Идея сделать это скриптом, к примеру формата .vbs, если есть возможность сделать это через VBA - можно им. Т.е чтоб человек мог зайти, в папке нажать на скрипт и чтоб все файлы переименовывались у него
with os.scandir(path=folder) as it: for entry in it: if entry.is_file(): print(entry.name) new_name = entry.name.\ replace( search_for, replace_to) print(new_name) os.system("ren "" + folder + entry.name + "" "" + new_name + """)
В коде не могу додумать именно момент чтоб находило данную часть и удаляло ее "09.2022", т.е если в search_for вставить 2022, а в replace_to 2023 то все файлы в папке поменяют год на 2023.
" Станция Имя Имядва 05.2022 (ФМП-4)" Вид во всех файлах такой, другого не будет Т.е дата только одна, скобки в скобках быть не могут
Индексы символов ведь одинаковые получаются, если концовка у названия одна и та же. Вам нужно удалить символы строки с индексами от -15 до -9 включительно. Шаблон для regexp можно использовать примерно такой: (.*)(\d\d\.\d{4} )(.*) - получаем три группы, в новом имени используем первую и третью.
Создать пустую книгу. Поместить код в модуль эта книга. Сохранить, закрыть. Открыть в папке, в которой нужно переименовать файлы.
Код
Option Explicit
Dim fso As Object
Private Sub Workbook_Open()
RenameInCurrentFolder
Application.Quit
End Sub
Sub RenameInCurrentFolder()
Set fso = CreateObject("Scripting.FileSystemObject")
FolderJob ThisWorkbook.Path
End Sub
Private Sub FolderJob(sFolder As String)
Dim oFolder As Object
On Error Resume Next
Set oFolder = fso.GetFolder(sFolder)
On Error GoTo 0
If Not oFolder Is Nothing Then
Dim oFile As Object
For Each oFile In oFolder.Files
FileJob CStr(oFile)
Next
Dim oSubFolder As Object
For Each oSubFolder In oFolder.SubFolders
FolderJob oSubFolder.Path
Next
End If
End Sub
Private Sub FileJob(sFile As String)
Dim newFull As String
Dim sName As String
sName = fso.GetFileName(sFile)
If Left(sName, 2) = "~$" Then Exit Sub
If sName Like "*##.####*" Then
Dim ii As Long
Do
ii = InStr(ii + 1, sName, ".")
If ii = 0 Then Exit Do
If ii > 2 Then
If Mid(sName, ii - 2, 7) Like "##.####" Then
newFull = fso.GetParentFolderName(sFile) & Application.PathSeparator & Mid(sName, 1, ii - 3) & Mid(sName, ii + 5)
On Error Resume Next
Kill newFull
Name sFile As newFull
If fso.FileExists(newFull) Then Kill sFile
On Error GoTo 0
End If
End If
Loop
End If
End Sub
МатросНаЗебре, здравствуй, может я что-то делаю не так?
создал новый excel файл, alt + f11, insert/module - зашел, вставил данный код, книгу закрыл сохранив в формате excel с макросами, но когда открываю данный файл переименования не происходят
Ігор Гончаренко, МатросНаЗебре, Сейчас в данном коде вместо данных значений ставится двойной пробел, т.е из имени "Станция Имя 02.2022 (ФРС-2)" получается "Станция Имя (ФРС-2)" не подскажите где внести изменения чтоб оставался только один пробел вместо удаленной даты? Момент важный, т.к настроено много связей на данные файлы
'v2
Dim fso As Object
Private Sub Workbook_Open()
RenameInCurrentFolder
Application.Quit
End Sub
Sub RenameInCurrentFolder()
Set fso = CreateObject("Scripting.FileSystemObject")
FolderJob ThisWorkbook.Path
End Sub
Private Sub FolderJob(sFolder As String)
Dim oFolder As Object
On Error Resume Next
Set oFolder = fso.GetFolder(sFolder)
On Error GoTo 0
If Not oFolder Is Nothing Then
Dim oFile As Object
For Each oFile In oFolder.Files
FileJob CStr(oFile)
Next
Dim oSubFolder As Object
For Each oSubFolder In oFolder.SubFolders
FolderJob oSubFolder.Path
Next
End If
End Sub
Private Sub FileJob(sFile As String)
Dim newFull As String
Dim sName As String
sName = fso.GetFileName(sFile)
If Left(sName, 2) = "~$" Then Exit Sub
If sName Like "*##.####*" Then
Dim ii As Long
Dim ss As String
Do
ii = InStr(ii + 1, sName, ".")
If ii = 0 Then Exit Do
If ii > 2 Then
If Mid(sName, ii - 2, 7) Like "##.####" Then
If Right(Mid(sName, 1, ii - 3), 1) = " " And Left(Mid(sName, ii + 5), 1) = " " Then
ss = Mid(sName, 1, ii - 3) & Mid(sName, ii + 6)
Else
ss = Mid(sName, 1, ii - 3) & Mid(sName, ii + 5)
End If
newFull = fso.GetParentFolderName(sFile) & Application.PathSeparator & ss
On Error Resume Next
Kill newFull
Name sFile As newFull
If fso.FileExists(newFull) Then Kill sFile
On Error GoTo 0
End If
End If
Loop
End If
End Sub
Цитата
написал: Сейчас в данном коде вместо данных значений ставится двойной пробел
Неправильно. Вместо данных значений ставилась пустая строка. А двойной пробел получался, потому что пробелы в строке уже были.