Создал файл Эксель, в единственном модуле которого написан код
[vba]
Код
Option Compare Text
Sub Кнопка1_Щелчок() Set Files = FilenamesCollection(Cells(2, 2), "Бланк наряда.xls", 1) 'считываем каждый файл и заполняем массив того, что нужно изготовить For Each doc In Files Workbooks.Open Filename:=doc Next doc End Sub
Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _ Optional ByVal SearchDeep As Long = 999) As Collection ' Получает в качестве параметра путь к папке FolderPath, ' маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением) ' и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются). ' Возвращает коллекцию, содержащую полные пути найденных файлов ' (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO) Set FilenamesCollection = New Collection ' создаём пустую коллекцию Set FSO = CreateObject("Scripting.FileSystemObject") ' создаём экземпляр FileSystemObject GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep ' поиск Set FSO = Nothing: Application.StatusBar = False ' очистка строки состояния Excel End Function
Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO, _ ByRef FileNamesColl As Collection, ByVal SearchDeep As Long) ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO ' перебор папок осуществляется в том случае, если SearchDeep > 1 ' добавляет пути найденных файлов в коллекцию FileNamesColl On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath) If Not curfold Is Nothing Then ' если удалось получить доступ к папке
' раскомментируйте эту строку для вывода пути к просматриваемой ' в текущий момент папке в строку состояния Excel ' Application.StatusBar = "Поиск в папке: " & FolderPath
For Each fil In curfold.Files ' перебираем все файлы в папке FolderPath If fil.Name Like "*" & Mask Then FileNamesColl.Add fil.Name Next SearchDeep = SearchDeep - 1 ' уменьшаем глубину поиска в подпапках If SearchDeep Then ' если надо искать глубже For Each sfol In curfold.SubFolders ' перебираем все подпапки в папке FolderPath GetAllFileNamesUsingFSO sfol.Path, Mask, FSO, FileNamesColl, SearchDeep Next End If Set fil = Nothing: Set curfold = Nothing ' очищаем переменные End If End Function
[/vba]
, призванный открывать файлы в папке по заданной маске. Исполнение кода останавливается сообщением, что не удалось найти файл "Бланк наряда.xls", хотя он по указанному в Cells(2, 2) пути присутствует. Скажите, пожалуйста, в чем ошибка?
Здравствуйте!
Создал файл Эксель, в единственном модуле которого написан код
[vba]
Код
Option Compare Text
Sub Кнопка1_Щелчок() Set Files = FilenamesCollection(Cells(2, 2), "Бланк наряда.xls", 1) 'считываем каждый файл и заполняем массив того, что нужно изготовить For Each doc In Files Workbooks.Open Filename:=doc Next doc End Sub
Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _ Optional ByVal SearchDeep As Long = 999) As Collection ' Получает в качестве параметра путь к папке FolderPath, ' маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением) ' и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются). ' Возвращает коллекцию, содержащую полные пути найденных файлов ' (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO) Set FilenamesCollection = New Collection ' создаём пустую коллекцию Set FSO = CreateObject("Scripting.FileSystemObject") ' создаём экземпляр FileSystemObject GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep ' поиск Set FSO = Nothing: Application.StatusBar = False ' очистка строки состояния Excel End Function
Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO, _ ByRef FileNamesColl As Collection, ByVal SearchDeep As Long) ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO ' перебор папок осуществляется в том случае, если SearchDeep > 1 ' добавляет пути найденных файлов в коллекцию FileNamesColl On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath) If Not curfold Is Nothing Then ' если удалось получить доступ к папке
' раскомментируйте эту строку для вывода пути к просматриваемой ' в текущий момент папке в строку состояния Excel ' Application.StatusBar = "Поиск в папке: " & FolderPath
For Each fil In curfold.Files ' перебираем все файлы в папке FolderPath If fil.Name Like "*" & Mask Then FileNamesColl.Add fil.Name Next SearchDeep = SearchDeep - 1 ' уменьшаем глубину поиска в подпапках If SearchDeep Then ' если надо искать глубже For Each sfol In curfold.SubFolders ' перебираем все подпапки в папке FolderPath GetAllFileNamesUsingFSO sfol.Path, Mask, FSO, FileNamesColl, SearchDeep Next End If Set fil = Nothing: Set curfold = Nothing ' очищаем переменные End If End Function
[/vba]
, призванный открывать файлы в папке по заданной маске. Исполнение кода останавливается сообщением, что не удалось найти файл "Бланк наряда.xls", хотя он по указанному в Cells(2, 2) пути присутствует. Скажите, пожалуйста, в чем ошибка?borus
это Collection . набирают через Scripting.FileSystemObject
borus, работали бы с Option Explicit - намного меньше вопросов возникало бы. А вообще-то стиль программирования и код знакомые ... О! Точно, у Игоря (EducatedFool) ЗДЕСЬ списано. И при этом никаких ссылок на первоисточник в файле нет Вот там, где взяли и надо спрашивать, почему позаимствованное не работает так, как Вам надо.
это Collection . набирают через Scripting.FileSystemObject
borus, работали бы с Option Explicit - намного меньше вопросов возникало бы. А вообще-то стиль программирования и код знакомые ... О! Точно, у Игоря (EducatedFool) ЗДЕСЬ списано. И при этом никаких ссылок на первоисточник в файле нет Вот там, где взяли и надо спрашивать, почему позаимствованное не работает так, как Вам надо.Alex_ST
[offtop] Alex_ST, Спокойнее :-). Все "тырят", целиком или адаптируют. Уж незнаю как Option Explicit бы спасло, но просто Filename , FullFileName , Path порой могут запутать, а уж когда код не свой, так тем более не понять, что есть что.
Лучше посмотрите это что-то мне подсказывает что можете помочь и мне пояснить.[/offtop]
[offtop] Alex_ST, Спокойнее :-). Все "тырят", целиком или адаптируют. Уж незнаю как Option Explicit бы спасло, но просто Filename , FullFileName , Path порой могут запутать, а уж когда код не свой, так тем более не понять, что есть что.
Лучше посмотрите это что-то мне подсказывает что можете помочь и мне пояснить.[/offtop]bmv98rus
Замечательный Временно просто медведь , процентов на 20.
VBA не желает открывать файлы, имена которых содержат пробелы. В соответствии с вашим примером, так должно работать. [vba]
Код
Sub ОткрытьФайл() Fail$ = "" & Cells(2, 2) & "\Бланк наряда.xls" & "" If Dir(Fail) <> "" Then Workbooks.Open Filename:=Fail Else MsgBox "Не найден!" End If End Sub
VBA не желает открывать файлы, имена которых содержат пробелы. В соответствии с вашим примером, так должно работать. [vba]
Код
Sub ОткрытьФайл() Fail$ = "" & Cells(2, 2) & "\Бланк наряда.xls" & "" If Dir(Fail) <> "" Then Workbooks.Open Filename:=Fail Else MsgBox "Не найден!" End If End Sub
Уж незнаю как Option Explicit бы спасло, но просто Filename , FullFileName , Path порой могут запутать, а уж когда код не свой, так тем более не понять, что есть что
как раз применение Option Explicit совместно с заданием не только переменных, но и их типов (при наличии возможности) и позволит не допустить глупых ошибок при вводе имён переменных и как следствие - избежать случаев, когда процедура работает, но даёт совершенно не те результаты, на которые Вы рассчитывали. Конечно, ассы класса уважаемого Игоря (EducatedFool) могут позволить себе не использовать Option Explicit. Зато имена, которые он даёт переменным в своих процедурах всегда осмысленны и зачастую позволяют читать код с листа. В этом он без сомнения учитель многих "писателей". Ну как можно запутаться, например, в именах Filename , FullFileName , Path если даже при простом прочтении становится ясно, какова их размерность и что в них хранится? Но пытаться адаптировать чужой код, не понимая как он работает, не декларируя Option Explicit и, соответственно, не будучи уверенным в том, что Ваши процедуры получат от чужих именно то, на обработку чего они "заточены"… [offtop]
bmv98rus, вообще-то я смотрю только то, что меня интересует, а советы даю только о том, в чём достаточно уверен. Да и к тому же программирую только "для души", на работе в свободное время, а с работы файлы с макросами скачать не могу. Дома - только домашние дела.[/offtop]
Уж незнаю как Option Explicit бы спасло, но просто Filename , FullFileName , Path порой могут запутать, а уж когда код не свой, так тем более не понять, что есть что
как раз применение Option Explicit совместно с заданием не только переменных, но и их типов (при наличии возможности) и позволит не допустить глупых ошибок при вводе имён переменных и как следствие - избежать случаев, когда процедура работает, но даёт совершенно не те результаты, на которые Вы рассчитывали. Конечно, ассы класса уважаемого Игоря (EducatedFool) могут позволить себе не использовать Option Explicit. Зато имена, которые он даёт переменным в своих процедурах всегда осмысленны и зачастую позволяют читать код с листа. В этом он без сомнения учитель многих "писателей". Ну как можно запутаться, например, в именах Filename , FullFileName , Path если даже при простом прочтении становится ясно, какова их размерность и что в них хранится? Но пытаться адаптировать чужой код, не понимая как он работает, не декларируя Option Explicit и, соответственно, не будучи уверенным в том, что Ваши процедуры получат от чужих именно то, на обработку чего они "заточены"… [offtop]
bmv98rus, вообще-то я смотрю только то, что меня интересует, а советы даю только о том, в чём достаточно уверен. Да и к тому же программирую только "для души", на работе в свободное время, а с работы файлы с макросами скачать не могу. Дома - только домашние дела.[/offtop]Alex_ST
Я про конкретный случай, когда просто вместо полного пути получено только имя файла. а в целом, даже пояснять не нужно. все то пишите правильно.[/offtop]
Я про конкретный случай, когда просто вместо полного пути получено только имя файла. а в целом, даже пояснять не нужно. все то пишите правильно.[/offtop]bmv98rus
Замечательный Временно просто медведь , процентов на 20.