Страница: 1 | 2 |
Вопрос: Программа для выбора файла, не могу найти ошибку
Добавлено: 21.08.08 14:24
Автор вопроса: abv
Написал программу для выбора файла, работает отлично. Но не могу заставить ее открывать нужную папку. Помогите кто чем может. Заранее спасибо.
sub fileseatch()
ActWbk = ActiveWorkbook.Name
ChDir Sheets("Set").Cells(13, 2).Value 'Эта команда не работает, что только не делал - открывает Мои документы
While Msg <> 6
If Application.FindFile = False Then Exit Sub
OpenFileName = ActiveWorkbook.Name
Msg = MsgBox("Этот файл подойдет?", vbYesNoCancel, "Выбор файла")
If Msg = 2 Then
ActiveWorkbook.Close
Exit Sub
End If
If Msg = 7 Then ActiveWorkbook.Close
Wend
end sub
Ответы
Всего ответов: 22
Номер ответа: 1
Автор ответа:
Lion
ICQ: 367220539
Вопросов: 13
Ответов: 55
Web-сайт:
Профиль | | #1
Добавлено: 21.08.08 15:13
Я несколько по другому решаю такие проблемы: Пишем в VB фунцию для выбора файла. Компилируем в .dll. Затем подгружаем в excell. Много плюсов. И ни одного минуса.
Номер ответа: 2
Автор ответа:
abv
Вопросов: 4
Ответов: 16
Профиль | | #2
Добавлено: 21.08.08 15:30
Спасибо за внимание к данному вопросу. Боюсь что совет для меня бесполезен. Мне надо заставить макрос считывать путь к папке из ячейки и открывать ее. Выбор нужного файла производится вручную методом перебора. Это и есть цель автоматизации - найти нужный файл, посмотрев содержимое всех "подозрительных" объектов. Наши девушки менеджеры уже кипятком писают в ожидании этого чуда.
Номер ответа: 3
Автор ответа:
Pavel
Вопросов: 0
Ответов: 36
Профиль | | #3
Добавлено: 21.08.08 15:57
Не знаю, я ввёл в ячейку В13 "C:\Temp\" (без кавычек) и всё заработало. Поменял с C:\Temp\ на C:\Test\ и тоже заработало.
- Может вы в конце слэш не ставите?
- Или C у вас русская?
- или адрес не в ячейке В13 у вас прописан
Номер ответа: 4
Автор ответа:
abv
Вопросов: 4
Ответов: 16
Профиль | | #4
Добавлено: 21.08.08 17:14
Адрес в ячейке сетевой
\\192.168.0.200\s1\ЗАКАЗЫ\Заказы\Пробная\
если слеш не поставить - программа ругается
путь работает точно
Возможно какой-нибудь параметр отключен, или библиотека.
На другом компе проверял, тоже открывает Мои документы. У меня уже мысли закончились.
Номер ответа: 5
Автор ответа:
abv
Вопросов: 4
Ответов: 16
Профиль | | #5
Добавлено: 21.08.08 17:50
На локальной папке проверил после прочтения сообщения. Действительно работает. Это к сожелению не решает проблемы. Спасибо.
Если не составит труда, оцените полезность этого кода. Или подскажите другие пути решения похожих задач.
Номер ответа: 6
Автор ответа:
Pavel
Вопросов: 0
Ответов: 36
Профиль | | #6
Добавлено: 22.08.08 11:41
Может так?
Dim iFileName As String, iPath As String, Result As Long
iPath = "\\192.168.0.200\s1\ЗАКАЗЫ\Заказы\Пробная\" '"C:\Temp\"
iFileName = Dir(iPath & "*.xls"
Do While iFileName$ <> ""
Result = MsgBox(iFileName, 3, "Выбор файла"
If Result = vbCancel Then Exit Sub
If Result = vbYes Then
Workbooks.Open Filename:=iPath & iFileName
Exit Sub
End If
If Result = vbNo Then
iFileName$ = Dir
End If
Loop
End Sub
Номер ответа: 7
Автор ответа:
abv
Вопросов: 4
Ответов: 16
Профиль | | #7
Добавлено: 22.08.08 12:23
Доброго времени суток. Код хороший. Проблема в том, что папок несколько: заказы, договоры, расчеты и т.п., выбрать нужную можно "переключателем" (разультат попадает в B13. В каждой папке больше тысячи файлов. Не трудно представить что может случиться если воспользоваться этим решением. Изначально задача была сформулирована так: менеджеры слегка помнят реквизиты нужного файла, чаще визуальное восприятие содержания указывает на правильный выбор. Названия однотипные, и нужно быстро открыть-закрыть несколько файлов и оставить нужный. С помощью программы операция автоматизируется до 2 щелчков мышом, на каждый файл. Трабл в том что сетевая папка не открывается (подключать сетевой диск пробовал, не помогает. Локальную папку открывает без проблем).
Номер ответа: 8
Автор ответа:
abv
Вопросов: 4
Ответов: 16
Профиль | | #8
Добавлено: 22.08.08 13:20
Попробовал команду:
Sheets("Set".Cells(13, 2).Hyperlinks(1).Follow
Она открывает сетевую папку, но не дает нужный результат как Application.FindFile Как совместить эти две функции?
P.S. Если изменить код msgbox на вопрос удалить/оставить жить - получиться отличная прога для разгребания завалов в папках.
Номер ответа: 9
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #9
Добавлено: 22.08.08 21:28
Вот такой конструкцией пользовалась. В основном на сетевых папках все файлы лежали. Все работает. Но это только для 2003. В 2007 FileSearch не поддерживается из-за некорректности поиска что-ли. Советуют использовать Dir.
With Application.FileSearch
.LookIn = Cells(13, 2).Value
.Filename = "*.xls"
If .Execute > 0 Then
i = 1
Do While i <= .FoundFiles.Count
Result = MsgBox(.FoundFiles(i), 3, "Этот файл подходит ?"
If Result = vbCancel Then Exit Sub
If Result = vbYes Then
Workbooks.Open Filename:=.FoundFiles(i)
Exit Sub
End If
If Result = vbNo Then
i = i + 1
End If
Loop
End If
End With
Номер ответа: 10
Автор ответа:
abv
Вопросов: 4
Ответов: 16
Профиль | | #10
Добавлено: 25.08.08 07:46
Jasmin, спасибо за ответ. Этот код работает также как тот, что прислал Pavel. Это не решает проблему по причине указанной мною в ответе № 7.
День третий. Истина где-то рядом.
Номер ответа: 11
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #11
Добавлено: 25.08.08 10:40
Какая конкретно причина ?
Если сетевой путь, то приведенный код точно работает. Все файлы находились на сетевом диске.
Если про "переключатель", то можно вставлять путь в ячейку B13 программно и потом опять же .LookIn = Cells(13, 2).Value.
Если по поводу, что папок несколько, тоже можно организовать перебор всех подпапок.
Какая причина ?
Номер ответа: 12
Автор ответа:
abv
Вопросов: 4
Ответов: 16
Профиль | | #12
Добавлено: 25.08.08 12:54
В каждой папке больше 1000 файлов и для выбора нужно посмотреть содержание 2-3 отвечающих заданным критериям.
Номер ответа: 13
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #13
Добавлено: 25.08.08 16:42
Тогда можно, чтобы в соседней ячейке задавали часть имени файла, которую помнят. А в .Filename ее читать/составлять, например, так
Номер ответа: 14
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #14
Добавлено: 25.08.08 17:05
Прочитала пояснения. Думаю вот так получится:
With Application.FileSearch
.LookIn = Cells(13, 2).Value
.Filename = "*.xls" 'задаем маску файла, чтобы поменьше перебирать
If .Execute > 0 Then
i = 1
Do While i <= .FoundFiles.Count 'пока не переберем все файлы отвечающие условию
'открываем файл
Workbooks.Open Filename:=.FoundFiles(i)
Result = MsgBox(.FoundFiles(i), 3, "Этот файл подходит ?"
If Result = vbCancel Then
'отказываемся от просмотра - закрываем последний открытый файл и заканчиваем процедуру
ActiveWorkbook.Close SaveChanges:=False
Exit Sub
End If
If Result = vbYes Then
'нашли, что искали - найденный файл остается открытым, заканчиваем процедуру
Exit Sub
End If
If Result = vbNo Then
'файл не подходит - закрываем последний открытый файл и переходим к сдедующему
ActiveWorkbook.Close SaveChanges:=False
i = i + 1
End If
Loop
End If
End With
Номер ответа: 15
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #15
Добавлено: 25.08.08 17:08
Но маску для более быстрого просмотра, когда хоть часть имени известна, все же можно задавать как в ответе 13.
Еще если данные для просмотра (например номер документа или ФИО) находятся на одном и том же месте в разных файлах, можно сразу читать данные, не открывая файл.