Коллеги, я тут решил поизучать объект FileSytemObject и просто упражнения ради (и пользы для, чтобы получать ещё и список папок) попробовал переписать знаменитую FilenamesCollection с использованием раннего связывания. И упёрся в то, что никак не возьму в толк, какой же всё-таки конкретно тип возвращает строка[vba]
Код
Set curfold = FSO.GetFolder(FolderPath)
[/vba]Пробовал описывать и как [vba]
Код
Dim curfold As Folders
[/vba] и [vba]
Код
Dim curfold As Folder
[/vba]всё равно ругается при запуске на [vba]
Код
For Each sfol In curfold.SubFolders
[/vba] As Variant и As Object, понятное дело, кушает, но было бы любопытно знать, какой это конкретный Object...
Коллеги, я тут решил поизучать объект FileSytemObject и просто упражнения ради (и пользы для, чтобы получать ещё и список папок) попробовал переписать знаменитую FilenamesCollection с использованием раннего связывания. И упёрся в то, что никак не возьму в толк, какой же всё-таки конкретно тип возвращает строка[vba]
Код
Set curfold = FSO.GetFolder(FolderPath)
[/vba]Пробовал описывать и как [vba]
Код
Dim curfold As Folders
[/vba] и [vba]
Код
Dim curfold As Folder
[/vba]всё равно ругается при запуске на [vba]
Код
For Each sfol In curfold.SubFolders
[/vba] As Variant и As Object, понятное дело, кушает, но было бы любопытно знать, какой это конкретный Object...StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.
Scripting.Folder или просто Folder в Object browser можно проверить, при подключенном референсе Microsoft Scripting Runtime выбираем библиотеку Scripting, в поле поиска пишем getfolder и жмакаем Enter
в референсах случаем нету ничего с пометкой MISSING: ? у мну так без ошибок отрабатывает[vba]
Код
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 ' создаём пустую коллекцию Dim FSO As New 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 As FileSystemObject, _ ByRef FileNamesColl As Collection, ByVal SearchDeep As Long) ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO ' перебор папок осуществляется в том случае, если SearchDeep > 1 ' добавляет пути найденных файлов в коллекцию FileNamesColl Dim curfold As Folder, sfol As Folder, fil As File 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.Path 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
[/vba]
Scripting.Folder или просто Folder в Object browser можно проверить, при подключенном референсе Microsoft Scripting Runtime выбираем библиотеку Scripting, в поле поиска пишем getfolder и жмакаем Enter
в референсах случаем нету ничего с пометкой MISSING: ? у мну так без ошибок отрабатывает[vba]
Код
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 ' создаём пустую коллекцию Dim FSO As New 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 As FileSystemObject, _ ByRef FileNamesColl As Collection, ByVal SearchDeep As Long) ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO ' перебор папок осуществляется в том случае, если SearchDeep > 1 ' добавляет пути найденных файлов в коллекцию FileNamesColl Dim curfold As Folder, sfol As Folder, fil As File 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.Path 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