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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2013, 16:23   #1
jungo
Форумчанин Подтвердите свой е-майл
 
Аватар для jungo
 
Регистрация: 14.11.2007
Сообщений: 163
По умолчанию Проверка наличия файла в папке по списку в экселе.

Привет всем!

Вот такая полезная задачка...
В папке от 3000 до 15000 файлов pdf.
В столбце А список названий файлов от 180 до максимум 500.
Нужен макрос, который отметит (в столбце Б отметит рядом) Какой из названий не существует в папке.
Все просто, но есть условие: Папки все время разные, поэтому необходимо в начале макроса окошко для выбора папки.

П.С. Совсем забыл... если можно на Английском языке т.к. мой эксель не понимает Русский.

Друзья! Помогите пожалуйста, очень надо!!!
Jungo must die!!! (C) Bill Gates.

Последний раз редактировалось jungo; 28.03.2013 в 16:49.
jungo вне форума Ответить с цитированием
Старый 28.03.2013, 17:28   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Sub FileChecker()
  Dim r As Long
  For r = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    Cells(r, 2) = Dir(Cells(1, 1) & Cells(r, 1))
  Next
End Sub
полные имена файлов - в колонке А, начиная с 2-й строки,
в ячейке А1 - путь к проверяемой папке с системным разделителем в конце.
если в В видно такое же имя, как в А - значит файл есть, если в В пусто - нет такого файла в указанной папке.

Цитата:
Вот такая полезная задачка...
давайте различать "полезные задачи" для Вас с бесполезными для остальных))

Цитата:
П.С. Совсем забыл... если можно на Английском языке т.к. мой эксель не понимает Русский.
не смог пропустить и эту фразу...
все написано на чистом английском (в меру моих познаний). одно не досмотрел - цифры арабские...
Ваш ексель арабские понимает?
а как к ним относится?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 28.03.2013, 18:53   #3
jungo
Форумчанин Подтвердите свой е-майл
 
Аватар для jungo
 
Регистрация: 14.11.2007
Сообщений: 163
По умолчанию

IgorGO Большое спасибо!

За чувство юмора тоже! (Я сам родом из Одессы...)

Дело в том, что В столбце А не полное название файлов, а название до точки (без .pdf).
Я начал решать эту задачку при помощи макроса, который копирует названия всех файлов в папке в столбец В с целью - элементарно сравнить оба столбца, но из за количества файлов в папке макрос бежит 2-4 минуты. Вот начальный мой вариант. Сравнение уже ерунда:

Код:
Dim iRow

Sub ADI_MIZRAHI()
Application.ScreenUpdating = False
With Application.FileDialog(msoFileDialogFolderPicker)
        .InitialFileName = "M:\barscan\13\"
        .Title = "Select folder"
        .Show
        If .SelectedItems.Count = 0 Then
            Exit Sub
        Else
            FilePath = .SelectedItems(1) & "\"
 
        End If
    End With
    
    iRow = 2
    Call ListMyFiles(FilePath, False)
End Sub

Sub ListMyFiles(mySourcePath, IncludeSubfolders)
Application.ScreenUpdating = False
    Set MyObject = New Scripting.FileSystemObject
    Set mySource = MyObject.GetFolder(mySourcePath)
    On Error Resume Next
    For Each myFile In mySource.Files
        iCol = 2
        Cells(iRow, iCol).Value = myFile.Name
        iRow = iRow + 1
    Next
    If IncludeSubfolders Then
        For Each mySubFolder In mySource.SubFolders
            Call ListMyFiles(mySubFolder.Path, True)
        Next
    End If
End Sub
Можно ли это как то упростить?
Jungo must die!!! (C) Bill Gates.
jungo вне форума Ответить с цитированием
Старый 28.03.2013, 20:17   #4
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

из за количества файлов в папке макрос бежит 2-4 минуты
В смысле - получение списка файлов столько занимает?
Тут вряд ли можно сильно ускорить, потому что ~90% времени занимает обращение к файловой системе. Попробуйте в консоли получить список файлов .pdf из папки с подпапками:
Код:
dir /b/s d:\temp\*.pdf
Если получится быстрее - используйте этот способ из макроса: http://www.cyberforum.ru/vba/thread6...ml#post3415664
exceleved@yandex.ru Яндекс.Деньги: 410011500007619

Последний раз редактировалось Казанский; 28.03.2013 в 20:22.
Казанский вне форума Ответить с цитированием
Старый 28.03.2013, 22:43   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я думаю тут в теме уже всё есть - берём код выбора папки и код проверки наличия файлов от Игоря.
Расширение добавляем в процессе.
Зачем перебирать все 15000, если нужно проверить максимум 500?

И кстати думаю что 90% времени занимает не обращение к файлам, а запись этих имён на лист строка за строкой...
P.S. Нет, померил - с записью действительно не намного дольше - но файлов правда нашлось всего 400...
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 28.03.2013 в 22:55.
Hugo121 вне форума Ответить с цитированием
Старый 29.03.2013, 08:19   #6
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

а что мешает получить список файлов в консоли:

shell "dir /A:-D /s %Путь1%\*.pdf > %Путь2%\Список1.lst"
shell "dir /A:-D %Путь1%\*.pdf > %Путь2%\Список2.lst"

потом из двух этих файлов (%Путь2%\Список1.lst и %Путь2%\Список2.lst) сделать справочник, где ключи из списка 1, а значения из списка 2. Дальше только прогнать по справочнику наш текущий список.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 29.03.2013, 09:36   #7
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

DiemonStar, текст, получаемый из программы "cmd" (другое название программы "cmd" - "командная строка"), имеет специфическую кодировку символов. Поэтому, например, названия файлов на русском языке будут искажены. Поэтому результат, полученный из программы "cmd", нельзя сразу использовать, а нужно сделать ещё несколько манипуляций, чтобы разобраться с кодировкой.

Последний раз редактировалось Скрипт; 29.03.2013 в 09:41.
Скрипт вне форума Ответить с цитированием
Старый 04.04.2013, 13:42   #8
jungo
Форумчанин Подтвердите свой е-майл
 
Аватар для jungo
 
Регистрация: 14.11.2007
Сообщений: 163
По умолчанию

Hugo121
А не могли бы вы пожалусйта записать наглядно макрос? Я понимаю о чем вы, но сам к сожелению не в силах это совместить.
Jungo must die!!! (C) Bill Gates.
jungo вне форума Ответить с цитированием
Старый 04.04.2013, 13:58   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Извините, сейчас занят. Может кто другой поможет?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 04.04.2013, 15:22   #10
jungo
Форумчанин Подтвердите свой е-майл
 
Аватар для jungo
 
Регистрация: 14.11.2007
Сообщений: 163
По умолчанию

Я думаю, что самый оптимальный вариант - это искать файлы именно по списку, а не так как в моем варианте - ВСЕ что находится в папке. Может кто сможет подсказать мне именно эту функцию?
Заранее спасибо!
Jungo must die!!! (C) Bill Gates.
jungo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка наличия файла в папке по имени strannick Microsoft Office Excel 6 07.07.2012 18:04
Проверка наличия файла nervniy Работа с сетью в Delphi 4 28.10.2010 19:47
Проверка наличия файла kain151 Microsoft Office Word 3 10.03.2010 14:50
проверка наличия файла Juffin Общие вопросы Delphi 2 18.04.2009 14:17
Проверка наличия файла russian-stalker Общие вопросы Delphi 4 31.08.2008 19:27