Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2017, 17:02   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
А если файлов в папке > ячеек в А ?
и в ответ — тишина...


ладно. посмотрите пример, который я своим корявыми руками собрал из разных кусков кода (за основу взят код (с) EducatedFool):
rename_jpeg.rar

ВНИМАНИЕ!
ПЕРЕИМЕНОВАНИЕ НЕОБРАТИМО!
Если число заполненных ячеек в столбце А и количество JPG файлов в указанной папке не совпадает, то переименование не выполяется, в противном случае - переименование происходит быстро и бесповоротно.
Будьте осторожны и имейте копию данных.




А код в файле такой:
Код:
Private Sub CommandButton1_Click()
   Dim SourceFolder As String, InitialPath As String
   Dim file_names() As String, NewFilename As String
   Dim cell As Range, i As Long, countFiles As Long
   
   InitialPath = ThisWorkbook.Path: Application.ScreenUpdating = False
   
   SourceFolder = GetFolderPath("Выберите исходную папку для поиска файлов", InitialPath)
   If SourceFolder = "" Then MsgBox "Необходимо указать папку!", vbCritical, "Папка не выбрана": Exit Sub
   
   On Error Resume Next
   file_names = getSortedFiles(SourceFolder & "*.jpg")
   
   countFiles = UBound(file_names, 1) - LBound(file_names, 1) + 1
   MsgBox ("Найдено : " & CStr(countFiles) & "  jpeg файла(ов)")
   
   ' для отладки вывести имена файлов в столбец B
   For i = 1 To countFiles
      Cells(i, 2) = file_names(i)
   Next i
   
   i = 0
   For Each cell In Range([A1], Range("A" & Rows.Count).End(xlUp)).Cells ' перебираем ячейки в столбце А
     If Trim(cell) <> "" Then
       i = i + 1
     End If
   Next cell
   
   MsgBox "Найдено заполненных ячеек в столбце А ровно " & CStr(i) & " штук."
   
   If i <> countFiles Then MsgBox "Не совпадает число файлов с количеством заполненных ячеек!", vbCritical, "Ошибка исходных данных": Exit Sub
   i = 0
   For Each cell In Range([A1], Range("A" & Rows.Count).End(xlUp)).Cells ' перебираем ячейки в столбце А
     If Trim(cell) <> "" Then
        i = i + 1
        NewFilename = Trim(cell) & ".jpg"
        Application.StatusBar = "Обрабатывается файл  " & file_names(i) & " переименовываем в " & NewFilename  ' вывод информации в строку состояния
        'MsgBox "Обрабатывается файл  " & file_names(i) & " переименовываем в " & NewFilename
        Name SourceFolder & file_names(i) As SourceFolder & NewFilename    ' переименовать файл
     End If
   Next cell
   
   Application.StatusBar = "": Application.ScreenUpdating = True
   
End Sub
ну и дополнительные функцию, вызываемые в коде:
Код:
Option Explicit

Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", Optional ByVal InitialPath As String = "c:\") As String
    Dim PS As String
    GetFolderPath = "": PS = Application.PathSeparator
    With Application.FileDialog(msoFileDialogFolderPicker)
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        If .Show = -1 Then GetFolderPath = .SelectedItems(1): If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
    End With
End Function


Public Function getSortedFiles(ByVal dir_path As String) As String()
    Dim Filename As String, file As Variant
    Dim i As Long, j As Long, file_names() As String, coll As New Collection, lngCnt As Long, strBuffer1 As String


    Filename = Dir(dir_path)
    While Filename <> "": coll.Add Filename: Filename = Dir: Wend

    ' Make the list of names.
    'ReDim file_names(1 To fso_folder.Files.Count)
    lngCnt = coll.Count
    ReDim file_names(1 To coll.Count)
    i = 1
    For Each file In coll
        file_names(i) = file
        i = i + 1
    Next

    ' Sort the list of files.
    ' Quicksort file_names, 1, coll.Count
    'sort array by numeric value
    For i = 1 To lngCnt
        For j = (i + 1) To lngCnt
            If UCase(file_names(i)) > UCase(file_names(j)) Then
                strBuffer1 = file_names(j)
                file_names(j) = file_names(i)
                file_names(i) = strBuffer1
            End If
        Next
    Next


    ' Return the sorted list.
    getSortedFiles = file_names
End Function

Последний раз редактировалось Serge_Bliznykov; 15.06.2017 в 17:04.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.06.2017, 17:12   #12
vefer
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 134
По умолчанию

Цитата:
Сообщение от djrec Посмотреть сообщение
Как прописать, что бы имя файла бралось каждый раз не с одной и той же ячейки, а опускалось по столбцу вниз. А1, А2, А3... итд ? новый файл следующая ячейка?
как нибудь так:
Код:
NewFilename = НовоеИмяФайла(sh.Cells(rc, 1))
rc=rc+1
Только где нибудь перед циклом For Each напишите rc=1
vefer вне форума Ответить с цитированием
Старый 15.06.2017, 18:12   #13
djrec
Новичок
Джуниор
 
Регистрация: 15.06.2017
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
А если файлов в папке > ячеек в А ?
Перед запуском я буду проверять, что бы их было столько же. Иначе попереименовует некорректно.
djrec вне форума Ответить с цитированием
Старый 15.06.2017, 18:18   #14
djrec
Новичок
Джуниор
 
Регистрация: 15.06.2017
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
и в ответ — тишина...


ладно. посмотрите пример, который я своим корявыми руками собрал из разных кусков кода (за основу взят код (с) EducatedFool):
Вложение 88584




ВНИМАНИЕ!
ПЕРЕИМЕНОВАНИЕ НЕОБРАТИМО!
Если число заполненных ячеек в столбце А и количество JPG файлов в указанной папке не совпадает, то переименование не выполяется, в противном случае - переименование происходит быстро и бесповоротно.
Будьте осторожны и имейте копию данных.




А код в файле такой:
Код:
Private Sub CommandButton1_Click()
   Dim SourceFolder As String, InitialPath As String
   Dim file_names() As String, NewFilename As String
   Dim cell As Range, i As Long, countFiles As Long
   
   InitialPath = ThisWorkbook.Path: Application.ScreenUpdating = False
   
   SourceFolder = GetFolderPath("Выберите исходную папку для поиска файлов", InitialPath)
   If SourceFolder = "" Then MsgBox "Необходимо указать папку!", vbCritical, "Папка не выбрана": Exit Sub
   
   On Error Resume Next
   file_names = getSortedFiles(SourceFolder & "*.jpg")
   
   countFiles = UBound(file_names, 1) - LBound(file_names, 1) + 1
   MsgBox ("Найдено : " & CStr(countFiles) & "  jpeg файла(ов)")
   
   ' для отладки вывести имена файлов в столбец B
   For i = 1 To countFiles
      Cells(i, 2) = file_names(i)
   Next i
   
   i = 0
   For Each cell In Range([A1], Range("A" & Rows.Count).End(xlUp)).Cells ' перебираем ячейки в столбце А
     If Trim(cell) <> "" Then
       i = i + 1
     End If
   Next cell
   
   MsgBox "Найдено заполненных ячеек в столбце А ровно " & CStr(i) & " штук."
   
   If i <> countFiles Then MsgBox "Не совпадает число файлов с количеством заполненных ячеек!", vbCritical, "Ошибка исходных данных": Exit Sub
   i = 0
   For Each cell In Range([A1], Range("A" & Rows.Count).End(xlUp)).Cells ' перебираем ячейки в столбце А
     If Trim(cell) <> "" Then
        i = i + 1
        NewFilename = Trim(cell) & ".jpg"
        Application.StatusBar = "Обрабатывается файл  " & file_names(i) & " переименовываем в " & NewFilename  ' вывод информации в строку состояния
        'MsgBox "Обрабатывается файл  " & file_names(i) & " переименовываем в " & NewFilename
        Name SourceFolder & file_names(i) As SourceFolder & NewFilename    ' переименовать файл
     End If
   Next cell
   
   Application.StatusBar = "": Application.ScreenUpdating = True
   
End Sub
ну и дополнительные функцию, вызываемые в коде:
Код:
Option Explicit

Function GetFolderPath(Optional ByVal Title As String = "Выберите папку", Optional ByVal InitialPath As String = "c:\") As String
    Dim PS As String
    GetFolderPath = "": PS = Application.PathSeparator
    With Application.FileDialog(msoFileDialogFolderPicker)
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        If .Show = -1 Then GetFolderPath = .SelectedItems(1): If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
    End With
End Function


Public Function getSortedFiles(ByVal dir_path As String) As String()
    Dim Filename As String, file As Variant
    Dim i As Long, j As Long, file_names() As String, coll As New Collection, lngCnt As Long, strBuffer1 As String


    Filename = Dir(dir_path)
    While Filename <> "": coll.Add Filename: Filename = Dir: Wend

    ' Make the list of names.
    'ReDim file_names(1 To fso_folder.Files.Count)
    lngCnt = coll.Count
    ReDim file_names(1 To coll.Count)
    i = 1
    For Each file In coll
        file_names(i) = file
        i = i + 1
    Next

    ' Sort the list of files.
    ' Quicksort file_names, 1, coll.Count
    'sort array by numeric value
    For i = 1 To lngCnt
        For j = (i + 1) To lngCnt
            If UCase(file_names(i)) > UCase(file_names(j)) Then
                strBuffer1 = file_names(j)
                file_names(j) = file_names(i)
                file_names(i) = strBuffer1
            End If
        Next
    Next


    ' Return the sorted list.
    getSortedFiles = file_names
End Function

Большое спасибо за программу, буду пробовать.

Все прекрасно работает. Правда вначале выдало ошибку only comments may appear after end sub end function or end property. Но я ее поборол. Еще раз большое спасибо. Теперь мне не придется вручную 500 файлов переименовывать.

Последний раз редактировалось djrec; 15.06.2017 в 20:56.
djrec вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переименовать файлы в папке FakeGen Общие вопросы Delphi 19 04.08.2011 10:34
как отобразить в таблице (на форме) все файлы которые находятся в определённой папке? mojohead Помощь студентам 10 05.04.2011 10:48
Переименовать файлы в папке (с условием) Gvaridos Microsoft Office Excel 3 01.11.2010 11:31
Как найти все файлы в папке? blackstersl Общие вопросы Delphi 3 24.06.2009 16:52
как определить какие файлы есть в папке и вывести их имена в текстовый файл Tdoctor Паскаль, Turbo Pascal, PascalABC.NET 3 04.11.2008 05:18