2015-01-08 5 views
3

Я пытаюсь просканировать через определенный диск и извлечь данные из определенных файлов .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. Я ничего не знаю о снарядах, это путь, который я должен взять?

СМОТРИТЕ ТАК, вы все потрясающие!

+1

[Этого ответа] (http://stackoverflow.com/questions/19716587/how-to-open-a-file-from-an-archive-in-vba-without-unzipping-the-archive) может помочь, если вы можете выполнять итерацию через 'objShell .NameSpace (strZipFilename) .Items' – stuartd

+0

Итак, идея состоит в том, чтобы перебирать objShell, подобно использованию итерации Dir()? Думаю, мне придется копать в Application.Shell. Как это будет работать с рытьем в подкаталоги? – ZAR

+1

Как вы траблите каждый подкаталог, когда вы найдете zip-файл, вы можете искать элементы - элементы в zip-файле не имеют структуры каталога до разархивирования. – stuartd

ответ

0

Попробуйте этот код вместо того, чтобы искать через вложенные папки:

Sub SO() 

Dim x, i 

x = GetFiles("C:\Users\SO\Folder", "*.xls*", True) '// x becomes an array of files found 

For Each i In x 
    Debug.Print i 
Next i 

End Sub 

'------------------------------------------------- 

Function GetFiles(StartPath As String, FileType As String, SubFolders As Boolean) As Variant 

StartPath = StartPath & IIf(Right(StartPath, 1) = "\", vbNullString, "\") 'Sanity check 

GetFiles = Split(Join(Filter(Split(CreateObject("WScript.Shell").Exec("CMD /C DIR """ & StartPath & FileType & """ " & _ 
    IIf(SubFolders, "/S", vbNullString) & " /B /A:-D").StdOut.ReadAll, vbCrLf), ":"), "#"), "#") 

End Function 

Но для архивных файлов, есть на самом деле не что-то родное для окон, что позволит вам сделать это, кроме метода CreateObject("Shell.Application").Namespace(zipName).Items.

Я предпочитаю использовать 7-Zip, который является свободным, открытым исходным кодом и имеет большой утилит командной строки, которая означает, что вы можете получить доступ к нему с помощью VBA тоже с помощью метода CreateObject("WScript.Shell") (как выше)

+0

Эй Я пробовал настроить цикл для имен файлов в x. Но он не работает – DeerSpotter

+0

см .: http://pastebin.com/03hcyzys – DeerSpotter

+0

@MaximTeleguz Вы не включили UDF. Но, во-первых, вы должны задать это как новый вопрос, так как ваша проблема - синтаксис, а не функциональность. –

Смежные вопросы