Страницы: 1 2 3 След.
RSS
Копирование\перемещение файлов по списку
 
Добрый день!
Когда то наткнулся на этот макрос для перемещения файлов с одной папки в другую исходя списка!
Вот сейчас понадобился, а он что то не работает - запускается, указываю данные, а вот в итоге ничего не находит, как я только не крутил!
Подскажите, пожалуйста, в чем может быть причина? Сам в этих делах не силен!(
Заранее спасибо!
Вот сам макрос:
Код
Sub Сортировка2_перенос_файлов_по_перечню2()
'раннее связывание, требуется ссылка на
'модель Windows Script Host Object Model
Dim i As Long
Dim ActWB As Workbook
Dim avInp(), FSO As FileSystemObject, fl As File
Dim Stolbec As Integer
Dim StrokaOtsch As Integer
Dim NameFile() As String
Dim FoldPth, NewFolder1, NewFolder As String
Dim ki As Long
Dim Fiyli() As String

Application.ScreenUpdating = False
i1_n = Cells(Rows.Count, 3).End(xlUp).Row
Set ActWB = ActiveWorkbook

NewFolder = Application.InputBox("Укажите имя папки, в которую необходимо перенести файлы", "Имя новой папки", _
"Файлы из списка")
Stolbec = Application.InputBox("Укажите номер столбца, в котором находятся наименования файлов", "Номер столбца", _
"8")
StrokaOtsch = Application.InputBox("Укажите номер строки, в которой находится шапка таблицы", _
"Номер строки", "1")

With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = "Папка для работы с файлами"
    .ButtonName = "Select": .AllowMultiSelect = False
    If .Show Then FoldPth = .SelectedItems(1) Else Exit Sub
End With

If NewFolder = "" Then
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Папка файлов по списку"
        .ButtonName = "Select": .AllowMultiSelect = False
    If .Show Then NewFolderPath = .SelectedItems(1) Else: Exit Sub
    End With
Else
NewFolderPath = FoldPth & NewFolder
End If

Time_1 = Timer
If Right(NewFolder, 1) <> "\" Then NewFolder = NewFolder & "\"
If Right(FoldPth, 1) <> "\" Then FoldPth = FoldPth & "\"

ReDim NameFile(i1_n - StrokaOtsch)
For i1 = 1 To i1_n - StrokaOtsch
    If Cells(StrokaOtsch + i1, Stolbec) <> "" Then
    n = n + 1
    NameFile(n) = Cells(StrokaOtsch + i1, Stolbec)
    End If
Next i1
ReDim Preserve NameFile(n)
Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO
        If Not .FolderExists(FoldPth & NewFolder) Then .CreateFolder FoldPth & NewFolder
        'создание каталога
    With .GetFolder(FoldPth)
        If .Files.Count = 0 Then MsgBox "Файлов в указанном пути не найдено", 48: Exit Sub
        'проверка наличия файлов
        
        ReDim Fiyly(.Files.Count)
            For Each fl In .Files
                ki = ki + 1
                Fiyly(ki) = fl.Name
            Next fl
        
            For i = 1 To UBound(Fiyly)
            For i1 = 1 To n
                If Fiyly(i) = NameFile(i1) Then
                kol = kol + 1
                FSO.MoveFile FoldPth & NameFile(i1), NewFolderPath
                End If
            Next i1
            Next i
    End With
End With
time_ = Time_1 - Timer
Time_delta = Format(time_ / 24 / 60 / 60, "hh\ч mm\м ss\с")
Application.ScreenUpdating = True
MsgBox ("Выполнено за " & Time_delta & Chr(13) & "Количество перемещённых файлов :" & kol)
End Sub
 
Если я правильно понял код, то, возможно, "собака зарыта" тут:
Код
i1_n = Cells(Rows.Count, 3).End(xlUp).Row
т.е. данные по именам файлов берутся из 3го столбца... Исправить это можно так:
Код
i1_n = Cells(Rows.Count, Stolbec).End(xlUp).Row
и переместрить эту строку после строки, где происходит ввод значения Stolbec:
Код
Stolbec = Application.InputBox("Укажите номер столбца, в котором находятся наименования файлов", "Номер столбца", _
"8")
StrokaOtsch = Application.InputBox("Укажите номер строки, в которой находится шапка таблицы", _
"Номер строки", "1")
i1_n = Cells(Rows.Count, Stolbec).End(xlUp).Row
А, возможно, что я что-то недопонял... и не хватает файлов примеров: "исполнителя" с кодом и списком файлов и архива с двумя папками (типа "Отсюда" и "Сюда") и файлами в папке-источнике...
Изменено: Ренат - 06.07.2016 07:27:40 (поправка оЧеПятки :))
Успехов. И мне того же. Благодарю. :)
 
Пробовал и так, не помогает. Такое чувство что он не то или не там ищет. Вроде и все нормально проходит, а результат - 0!
Изменено: AGuk - 06.07.2016 08:17:08
 
Для отладки кода есть F8, и точки останова - и смотрите что где как, какие пути, еслть ли там такие файлы. Ещё в помощь окно Locals
 
AGuk, делайте так, как написал Hugo, с точками останова и пошагово реально найти проблему.
Код
NewFolderPath = FoldPth & "\" & NewFolder & "\"
 
Проходит до конца, а вот результата нету (
Что может еще быть?
Макрос нужен капец как.
 
На строке
Код
FSO.MoveFile FoldPth & NameFile(i1), NewFolderPath
что в переменных, есть ли файл и путь?
 
Есть и файл и путь!
 
Ну тогда может просто тупо нет прав?
 
См. вариант:
1. макрос просит указать каталоги IN и OUT,
2. макрос копирует файлы ЛЮБОГО ФОРМАТА из IN в OUT,
2.1. макрос "убивает" файлы в IN (от этой команды - KILL File, в случае необходимости, можно избавиться).
Изменено: Мотя - 07.07.2016 14:11:53
 
Спасибо, ну это не то.
Мне нужно из 10000 файлов в одной папке скопировать\переместить только те которые есть у меня в списке - в другую папку!
 
Цитата
AGuk написал:
переместить только те которые есть у меня в списке
А где список?  :D
 
Список в екселе, пускай будет начало A1, каждое имя файла в отдельной ячейки.
 
Нет проблем...
Нужно немного времени для изменения макроса.
Изменено: Мотя - 07.07.2016 16:08:27
 
См.
 
Работает, ну очень медленно, 2 файла в секунду.
Ускорить есть возможность?
Макрос который я выложил, писали что за пару секунд 5000 файлов переместил.
 
Если бы вы начали тогда когда вам дали макрос то к тому моменту когда вы написали "медленно" вы бы уже давно закончили
 
Цитата
VideoAlex написал: Если бы вы начали тогда когда вам дали макрос то к тому моменту когда вы написали "медленно" вы бы уже давно закончили
Я конечно, извиняюсь, но мне нужно перелопать 15к изображений и выбрать из них примерно 9к это примерно получается полтора часа!
Если им пользоваться раз в месяц  то можно и подождать, а я планирую раз в день, то как то многовато времени занимает!
Спасибо большое и за этот макрос!
 
Спасибо большое и за этот макрос!  Ну хотелось бы ускорить!  :)
Изменено: AGuk - 07.07.2016 21:31:53
 
Цитата
AGuk написал: Ускорить есть возможность?
Попытаюсь...
Но Вам придется тестировать на реальной информации, т.к. создавать ее, реальную инфо, мне просто некогда.
 
Кстати, в макросе выполняется обязательный контроль имен файлов из списка на совпадение с именами файлов из каталога IN.
 
Цитата
AGuk написал: Макрос который я выложил, писали что за пару секунд 5000 файлов переместил.
Макрос который выложили вы пока не переместил вам ни одного файла. Кроме того, думаю что: 1 писать можно что угодно, тем более про неработающий макрос. 2. многое зависит и от файлов.

Не ждите улучшения на порядок
 
Цитата
Мотя написал: Вам придется тестировать на реальной информаци
У меня все подготовлено для этого! Я и тестирую уже на реальных рабочих файлах)
Уже перебрал 3700 файлов, полет нормальный.
Изменено: AGuk - 13.07.2016 23:55:02
 
Цитата
VideoAlex написал: Макрос который выложили вы пока не переместил вам ни одного файла
Дело в том что я уже этим макросом раньше пару раз пользовался и он как не странно работал! Тогда 3000 файлов перенес за пару секунд.
Чего сейчас не работает сам не пойму!
Я уже и первоначальный источник нашел от куда я его и брал, все равно не работает.
Файлы (изображения) не большие 150-400 Кб, да и я особо не обращаю на это внимания так как у меся SSD диск)
 
Вот ссылка на источник: ТИЦ
 
Пробуйте. :)
Изменено: Мотя - 08.07.2016 01:03:18
 
всем добрый вечер, если кто может помогите пжлс, срочно надо решить проблему. Есть макрос, который переносит данные с других листов, в которых указаны формулы, а мне необходимо копировать как значения. Макрос прилагаю. Что мне в нем необходимо исправить

Sub St()
'Код рассчитан на то, что вид исходных таблиц сверху
'и снизу меняться не будет. Т.е. жёстко прописано количество
'дополнительных строк сверху и снизу.

Const fldr = "C:\Users\ната\Desktop\макрос\"  ' Путь к папке с файлами, можно добавить
                           ' стандартный диалог выбора папки или диалог
                           ' выбора самих файлов для обработки
                           
Dim strFile As String, wb As Workbook, wsSum As Workbook

Application.ScreenUpdating = False  'нет мелькания на экране
Set wsSum = ThisWorkbook
strFile = Dir(fldr & "*.xlsx")
Do While strFile <> ""          'Цикл по файлам

Set wb = Workbooks.Open(fldr & strFile, ReadOnly:=True)
   
With wsSum.Sheets(1)
   iLastRow = .Cells(.Rows.Count, 2).End(xlUp).Row + 1
   .Cells(iLastRow, 1).Value = Now()
   Set tbl = wb.Sheets(1).Range("A7").CurrentRegion ' определяет именно таблицу
   tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, _
   tbl.Columns.Count).Copy .Range(.Cells(iLastRow, 2), .Cells(iLastRow, 2))
 
кнопка цитирования не для ответа [МОДЕРАТОР]

Выбрал найти 2000 файлов из списка в папке с 10 000 файлов - завис ексель вместе с проводником(
ни одного файла не скопировал.
На первоначальном при таком количестве запросов тоже завис - ну пока снимал задачу скопировал 60 файлов.
 
Цитата
AGuk написал: Выбрал найти 2000 файлов из списка в папке с 10 000 файлов
Это - о чём?
Файлы для копирования много "весят"?
 
Размер файлов 50-300Кб
Весь размер папки с файлами в которой нужно искать - 1,25Гб (9600 файлов)
Изменено: AGuk - 13.07.2016 23:57:10
Страницы: 1 2 3 След.
Наверх