Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Поиск файлов в каталоге по части имени из столбца таблицы - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Поиск файлов в каталоге по части имени из столбца таблицы
Данилкин Дата: Вторник, 15.12.2015, 08:50 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Доброго дня. Подскажите как правильно решить задачу. Существует таблица описывающая объекты, каждый объект идентифицируется уникальным номером, для каждого объекта имеется фотография, частью имени которой является этот номер, требуется по произвольной выборке уникальных номеров, заданных таблицей excel, найти все файлы в заданном каталоге и его подкаталогах, содержащие в имени этот номер и скопировать их в произвольный каталог.
К сообщению приложен файл: Poisk.xlsx (12.0 Kb)
 
Ответить
СообщениеДоброго дня. Подскажите как правильно решить задачу. Существует таблица описывающая объекты, каждый объект идентифицируется уникальным номером, для каждого объекта имеется фотография, частью имени которой является этот номер, требуется по произвольной выборке уникальных номеров, заданных таблицей excel, найти все файлы в заданном каталоге и его подкаталогах, содержащие в имени этот номер и скопировать их в произвольный каталог.

Автор - Данилкин
Дата добавления - 15.12.2015 в 08:50
SLAVICK Дата: Вторник, 15.12.2015, 11:11 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Так? :
[vba]
Код
Sub d()
Dim f, i&, ii&, ar(), fol$, NewFol$
ar = [a2:a290].Value 'Selection.Value
fol = [c2]
NewFol = [d2]
f = Enlist_Directories(fol)
For i = 1 To UBound(ar)
    For ii = 0 To UBound(f)
       If f(ii) Like "*" & ar(i, 1) & "*" Then Copy_File f(ii), NewFol & Dir(f(ii))
Next ii, i
End Sub
Private Function Copy_File(ByVal sFileName As String, ByVal sNewFileName As String) As Boolean
Dim objFSO As Object
    If sFileName = sNewFileName Then Exit Function
    If Dir(sFileName, 16) = "" Then: Exit Function
    If Not Dir(sNewFileName, 16) = "" Then Kill sNewFileName
Set objFSO = CreateObject("Scripting.FileSystemObject")
Call objFSO.CopyFile(sFileName, sNewFileName)
Copy_File = True
End Function
Function Enlist_Directories(strPath As String)
Dim strFldrList() As String
Dim lngArrayMax, x As Long, lngSheet&
lngSheet = 100 'As Long
lngArrayMax = 0
strFn = Dir(strPath & "*.*", 23)
While strFn <> ""

    If Not (GetAttr(strPath & strFn) And vbDirectory) = vbDirectory Then
      lngArrayMax = lngArrayMax + 1
      ReDim Preserve strFldrList(lngArrayMax)
      strFldrList(lngArrayMax) = strPath & strFn
    End If

  strFn = Dir()
Wend
Enlist_Directories = strFldrList
End Function
[/vba]
К сообщению приложен файл: Poisk.xlsm (23.9 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 15.12.2015, 11:13
 
Ответить
СообщениеТак? :
[vba]
Код
Sub d()
Dim f, i&, ii&, ar(), fol$, NewFol$
ar = [a2:a290].Value 'Selection.Value
fol = [c2]
NewFol = [d2]
f = Enlist_Directories(fol)
For i = 1 To UBound(ar)
    For ii = 0 To UBound(f)
       If f(ii) Like "*" & ar(i, 1) & "*" Then Copy_File f(ii), NewFol & Dir(f(ii))
Next ii, i
End Sub
Private Function Copy_File(ByVal sFileName As String, ByVal sNewFileName As String) As Boolean
Dim objFSO As Object
    If sFileName = sNewFileName Then Exit Function
    If Dir(sFileName, 16) = "" Then: Exit Function
    If Not Dir(sNewFileName, 16) = "" Then Kill sNewFileName
Set objFSO = CreateObject("Scripting.FileSystemObject")
Call objFSO.CopyFile(sFileName, sNewFileName)
Copy_File = True
End Function
Function Enlist_Directories(strPath As String)
Dim strFldrList() As String
Dim lngArrayMax, x As Long, lngSheet&
lngSheet = 100 'As Long
lngArrayMax = 0
strFn = Dir(strPath & "*.*", 23)
While strFn <> ""

    If Not (GetAttr(strPath & strFn) And vbDirectory) = vbDirectory Then
      lngArrayMax = lngArrayMax + 1
      ReDim Preserve strFldrList(lngArrayMax)
      strFldrList(lngArrayMax) = strPath & strFn
    End If

  strFn = Dir()
Wend
Enlist_Directories = strFldrList
End Function
[/vba]

Автор - SLAVICK
Дата добавления - 15.12.2015 в 11:11
Данилкин Дата: Вторник, 15.12.2015, 11:39 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
SLAVICK, огромное спасибо! Сейчас буду разбираться. SLAVICK
 
Ответить
СообщениеSLAVICK, огромное спасибо! Сейчас буду разбираться. SLAVICK

Автор - Данилкин
Дата добавления - 15.12.2015 в 11:39
Данилкин Дата: Вторник, 15.12.2015, 11:56 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
SLAVICK, не понял, зачем в первой колонке имена файлов, это осталось от проверки?
 
Ответить
СообщениеSLAVICK, не понял, зачем в первой колонке имена файлов, это осталось от проверки?

Автор - Данилкин
Дата добавления - 15.12.2015 в 11:56
Данилкин Дата: Вторник, 15.12.2015, 12:04 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
SLAVICK, программа завершает работу ошибкой на первом цикле "For ii = 0 To UBound(f)", взглянете, я не вполне понимаю почему, пути на реальные заменил, файл прилагаю.
 
Ответить
СообщениеSLAVICK, программа завершает работу ошибкой на первом цикле "For ii = 0 To UBound(f)", взглянете, я не вполне понимаю почему, пути на реальные заменил, файл прилагаю.

Автор - Данилкин
Дата добавления - 15.12.2015 в 12:04
Данилкин Дата: Вторник, 15.12.2015, 12:04 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
SLAVICK, файл все-же прилагаю).
К сообщению приложен файл: 0177598.xlsm (22.5 Kb)
 
Ответить
СообщениеSLAVICK, файл все-же прилагаю).

Автор - Данилкин
Дата добавления - 15.12.2015 в 12:04
SLAVICK Дата: Вторник, 15.12.2015, 12:19 | Сообщение № 7
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
зачем в первой колонке имена файлов, это осталось от проверки?

Макрос ищет в папке поиска файлы, имена которых содержат данные из 1-й колонки. Я вставил несколько своих реальных имен для проверки.
цикле "For ii = 0 To UBound(f)"

У Вас в папке "F:\Temp\DataBase\" есть файлы?


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 15.12.2015, 12:20
 
Ответить
Сообщение
зачем в первой колонке имена файлов, это осталось от проверки?

Макрос ищет в папке поиска файлы, имена которых содержат данные из 1-й колонки. Я вставил несколько своих реальных имен для проверки.
цикле "For ii = 0 To UBound(f)"

У Вас в папке "F:\Temp\DataBase\" есть файлы?

Автор - SLAVICK
Дата добавления - 15.12.2015 в 12:19
Данилкин Дата: Вторник, 15.12.2015, 13:54 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
SLAVICK, по поводу первого столбца я так и понял, в папку DataBase я, на момент проверки работоспособности, запустил копирование файлов ~200GB и там что-то уже было, не факт, что с указанными в таблице уникальными номерами.
 
Ответить
СообщениеSLAVICK, по поводу первого столбца я так и понял, в папку DataBase я, на момент проверки работоспособности, запустил копирование файлов ~200GB и там что-то уже было, не факт, что с указанными в таблице уникальными номерами.

Автор - Данилкин
Дата добавления - 15.12.2015 в 13:54
SLAVICK Дата: Вторник, 15.12.2015, 14:39 | Сообщение № 9
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Переделал немного.
Прошлый пример смотрел только в строго указанную папку.
Сейчас во всех вложенных подпапках тоже.
Использовал часть кода отсюда
К сообщению приложен файл: Poisk-1-.xlsm (27.5 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеПеределал немного.
Прошлый пример смотрел только в строго указанную папку.
Сейчас во всех вложенных подпапках тоже.
Использовал часть кода отсюда

Автор - SLAVICK
Дата добавления - 15.12.2015 в 14:39
Данилкин Дата: Вторник, 15.12.2015, 16:30 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
SLAVICK, спасибо), тестирую. После подстановки путей с старта, наблюдается некторая полуторачасовая задумчивость. но данных много, для поиска, ожидаю.
 
Ответить
СообщениеSLAVICK, спасибо), тестирую. После подстановки путей с старта, наблюдается некторая полуторачасовая задумчивость. но данных много, для поиска, ожидаю.

Автор - Данилкин
Дата добавления - 15.12.2015 в 16:30
SLAVICK Дата: Вторник, 15.12.2015, 19:06 | Сообщение № 11
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
наблюдается некторая полуторачасовая задумчивость

ну судя из :
запустил копирование файлов ~200GB
- так и должно быть.
Если эта процедура многоразовая можно добавить вывод в статусную строку сколько % выполнено. А если на один раз то и так сойдет :D


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Вторник, 15.12.2015, 19:07
 
Ответить
Сообщение
наблюдается некторая полуторачасовая задумчивость

ну судя из :
запустил копирование файлов ~200GB
- так и должно быть.
Если эта процедура многоразовая можно добавить вывод в статусную строку сколько % выполнено. А если на один раз то и так сойдет :D

Автор - SLAVICK
Дата добавления - 15.12.2015 в 19:06
Данилкин Дата: Среда, 16.12.2015, 14:15 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
SLAVICK, спасибо! Прекрасно отработала! Да и не полтора часа, в первый раз долго было потому что я цифры короткие не убрал ну и файлов конечно нашлось много. А для того чтобы файлы не скопировать, а переместить в этих строчках кода нужно команду заменить?
[vba]
Код
For i = 1 To UBound(ar)
For ii = 1 To UBound(f)
If f(ii) Like "*" & ar(i, 1) & "*" Then Copy_File f(ii), NewFol & Dir(f(ii))
Next ii, i
End Sub
[/vba]
[vba]
Код
Private Function Copy_File(ByVal sFileName As String, ByVal sNewFileName As String) As Boolean
Dim objFSO As Object
If sFileName = sNewFileName Then Exit Function
If Dir(sFileName, 16) = "" Then: Exit Function
If Not Dir(sNewFileName, 16) = "" Then Kill sNewFileName
Set objFSO = CreateObject("Scripting.FileSystemObject")
Call objFSO.CopyFile(sFileName, sNewFileName)
Copy_File = True
End Function
[/vba]
[moder]Оформляйте коды тегами!
Поправила на первый раз[/moder]


Сообщение отредактировал Manyasha - Среда, 16.12.2015, 14:32
 
Ответить
СообщениеSLAVICK, спасибо! Прекрасно отработала! Да и не полтора часа, в первый раз долго было потому что я цифры короткие не убрал ну и файлов конечно нашлось много. А для того чтобы файлы не скопировать, а переместить в этих строчках кода нужно команду заменить?
[vba]
Код
For i = 1 To UBound(ar)
For ii = 1 To UBound(f)
If f(ii) Like "*" & ar(i, 1) & "*" Then Copy_File f(ii), NewFol & Dir(f(ii))
Next ii, i
End Sub
[/vba]
[vba]
Код
Private Function Copy_File(ByVal sFileName As String, ByVal sNewFileName As String) As Boolean
Dim objFSO As Object
If sFileName = sNewFileName Then Exit Function
If Dir(sFileName, 16) = "" Then: Exit Function
If Not Dir(sNewFileName, 16) = "" Then Kill sNewFileName
Set objFSO = CreateObject("Scripting.FileSystemObject")
Call objFSO.CopyFile(sFileName, sNewFileName)
Copy_File = True
End Function
[/vba]
[moder]Оформляйте коды тегами!
Поправила на первый раз[/moder]

Автор - Данилкин
Дата добавления - 16.12.2015 в 14:15
SLAVICK Дата: Среда, 16.12.2015, 19:22 | Сообщение № 13
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Попробуйте вместо
[vba]
Код
Call objFSO.CopyFile(sFileName, sNewFileName)
[/vba]
написать
[vba]
Код
Call objFSO.MoveFile(sFileName, sNewFileName)
[/vba]Вроде работает - если что завтра смогу проверить.


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеПопробуйте вместо
[vba]
Код
Call objFSO.CopyFile(sFileName, sNewFileName)
[/vba]
написать
[vba]
Код
Call objFSO.MoveFile(sFileName, sNewFileName)
[/vba]Вроде работает - если что завтра смогу проверить.

Автор - SLAVICK
Дата добавления - 16.12.2015 в 19:22
Данилкин Дата: Вторник, 22.12.2015, 09:12 | Сообщение № 14
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
SLAVICK, доброго дня! Спасибо огроменское! Прога работает, все как надо выбирает, еще один небольшой ньюанс выявил в процессе эксплуатации, не всегда оказывается есть файлы, наличие которых в каталогах поиска ожидается, как в исходном файле отметить, какие части имен найдены, а какие нет, идеально - любую отметку в колонку рядом, также можно добавить что-то в содержащую часть имени ячейку. Поможете? Сам пока никак не дойду.
К сообщению приложен файл: 4025460.xlsm (51.4 Kb)
 
Ответить
СообщениеSLAVICK, доброго дня! Спасибо огроменское! Прога работает, все как надо выбирает, еще один небольшой ньюанс выявил в процессе эксплуатации, не всегда оказывается есть файлы, наличие которых в каталогах поиска ожидается, как в исходном файле отметить, какие части имен найдены, а какие нет, идеально - любую отметку в колонку рядом, также можно добавить что-то в содержащую часть имени ячейку. Поможете? Сам пока никак не дойду.

Автор - Данилкин
Дата добавления - 22.12.2015 в 09:12
SLAVICK Дата: Вторник, 22.12.2015, 12:01 | Сообщение № 15
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Рад, что помогло :D
Проще всего добавить массив такой же размерности и там отмечать количество найденных:
[vba]
Код
Sub d()
Dim f(), i&, ii&, ar(), ar1(), fol$, NewFol$, coll As Collection
ar = [a2:a2471].Value 'Selection.Value
ReDim ar1(1 To UBound(ar), 1 To 1)
fol = [c2]
NewFol = [d2]
Set coll = FilenamesCollection(fol)
ReDim f(1 To coll.Count)
For ii = 1 To coll.Count
f(ii) = coll(ii)
Next
For i = 1 To UBound(ar)
    For ii = 1 To UBound(f)
       If f(ii) Like "*" & ar(i, 1) & "*" Then Copy_File f(ii), NewFol & Dir(f(ii)): ar1(i, 1) = ar1(i, 1) + 1
Next ii, i
[b2].Resize(UBound(ar1), 1) = ar1
End Sub
[/vba]
К сообщению приложен файл: 7809360.xlsm (54.1 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеРад, что помогло :D
Проще всего добавить массив такой же размерности и там отмечать количество найденных:
[vba]
Код
Sub d()
Dim f(), i&, ii&, ar(), ar1(), fol$, NewFol$, coll As Collection
ar = [a2:a2471].Value 'Selection.Value
ReDim ar1(1 To UBound(ar), 1 To 1)
fol = [c2]
NewFol = [d2]
Set coll = FilenamesCollection(fol)
ReDim f(1 To coll.Count)
For ii = 1 To coll.Count
f(ii) = coll(ii)
Next
For i = 1 To UBound(ar)
    For ii = 1 To UBound(f)
       If f(ii) Like "*" & ar(i, 1) & "*" Then Copy_File f(ii), NewFol & Dir(f(ii)): ar1(i, 1) = ar1(i, 1) + 1
Next ii, i
[b2].Resize(UBound(ar1), 1) = ar1
End Sub
[/vba]

Автор - SLAVICK
Дата добавления - 22.12.2015 в 12:01
Данилкин Дата: Понедельник, 28.12.2015, 10:56 | Сообщение № 16
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
SLAVICK, урааа, спасибо, всё работает!!!
 
Ответить
СообщениеSLAVICK, урааа, спасибо, всё работает!!!

Автор - Данилкин
Дата добавления - 28.12.2015 в 10:56
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!