Я пытаюсь просканировать через определенный диск и извлечь данные из определенных файлов .xls, которые похоронены в подкаталогах. Дисковод превышает TB, а папки не все имеют одну и ту же иерархию, поэтому я просматриваю их все. Пока сценарий отлично работает.Сканирование через ZIP-файлы
Проблема в том, что на диске есть файлы в формате zip. По крайней мере, половина файлов в формате zip. Как я могу просканировать эти файлы?
Вот часть моего кода, который просканирует через подкаталоги. Существует еще одна функция «TrailingSlash», которая просто добавляет «\» к строке, если она еще не имеет ее. Я комментирую автора в своих комментариях.
Public Function recursiveDir(colFiles As Collection, strFolder As String, strFileSpec As String, bIncludeSubfolders As Boolean) as Collection
'From Ammara.com/access_image_faq/recursive_folder_search.html
'Recursive function to search document tree from specific file extension
Dim strTemp As String
Dim colFolders As New Collection
Dim vFolderName As Variant
Dim colFiles As New Collection
Dim counter As Integer
'Add files in strFolder matching strFileSpec to colFiles
strFolder = TrailingSlash(strFolder)
strTemp = Dir(strFolder & strFileSpec)
On Error Resume Next
Do While strTemp <> vbNullString
colFiles.Add (strFolder & strTemp)
counter = counter + 1
Debug.Print ("files found: " & counter)
strTemp = Dir
Loop
If bIncludeSubfolders Then
'Fill colFolders with list of subdirectories of strFolder
strTemp = Dir(strFolder, vbDirectory)
Do While strTemp <> vbNullString
If (strTemp <> ".") And (strTemp <> "..") Then
If (GetAttr(strFolder & strTemp) And vbDirectory) <> 0 Then
colFolders.Add strTemp
End If
End If
strTemp = Dir
Loop
'Call recursiveDir for each subfolder in colFolders
For Each vFolderName In colFolders
Call recursiveDir(colFiles, strFolder & vFolderName, strFileSpec, True)
Next vFolderName
End If
recursiveDir = colFiles
End Function
Функция добавляет все пути строки в коллекции «colFolders», которые я затем использовать для открытия и извлечения данных из. Теперь я думаю, что не может быть простой способ вернуть строковый путь к файлу в ZIP-папке. Возможно, потребуется отдельная функция, которая вызывается, когда эта функция встречает zip, который, в свою очередь, обходит почтовую папку и извлекает конкретный файл в локальный адрес (если мне не нужно извлекать всю папку, мы должны быть хорошими).
Я как бы потерял то, что должен делать. Google вокруг указывает мне на использование shell.Application. Я ничего не знаю о снарядах, это путь, который я должен взять?
СМОТРИТЕ ТАК, вы все потрясающие!
[Этого ответа] (http://stackoverflow.com/questions/19716587/how-to-open-a-file-from-an-archive-in-vba-without-unzipping-the-archive) может помочь, если вы можете выполнять итерацию через 'objShell .NameSpace (strZipFilename) .Items' – stuartd
Итак, идея состоит в том, чтобы перебирать objShell, подобно использованию итерации Dir()? Думаю, мне придется копать в Application.Shell. Как это будет работать с рытьем в подкаталоги? – ZAR
Как вы траблите каждый подкаталог, когда вы найдете zip-файл, вы можете искать элементы - элементы в zip-файле не имеют структуры каталога до разархивирования. – stuartd