2016-03-02 4 views
0

Я пытаюсь сделать макрос в VBA, но я новичок в VBA.Excel VBA - читать .txt из .zip-файлов

мне нужно открыть несколько .zip файлов, просмотреть определенную .txt и написать, что внутри этого .txt файла в первенствовать, и имя .zip будет находиться в той же строке в Excel, например:

Первая строка - это имя файла .zip, а в первой строке и втором столбце будет содержимое файла .txt.

enter image description here

Я есть часть кода, но ее не работает его говоря код ошибки 91

Sub Text() 
    Dim FSO As Object 
    Dim oApp As Object 
    Dim Fname As Variant 
    Dim FileNameFolder As Variant 
    Dim DefPath As String 
    Dim strDate As String 
    Dim I As Long 
    Dim num As Long 

    Fname = Application.GetOpenFilename(filefilter:="Zip Files (*.zip), *.zip", _ 
             MultiSelect:=True) 
    If IsArray(Fname) = False Then 
     'Do nothing 
    Else 
     'Root folder for the new folder. 
     'You can also use DefPath = "C:\Users\Ron\test\" 
     DefPath = Application.DefaultFilePath 

     If Right(DefPath, 1) <> "\" Then 
      DefPath = DefPath & "\" 
     End If 

     For Each fileNameInZip In oApp.Namespace(Fname).Items 
      If LCase(fileNameInZip) Like LCase("md5.txt") Then 

       'Open "md5.txt" For Input As #1 
       'Do Until EOF(1) 
       'Line Input #1, textline 
       ' text = text & textline 
       ' Loop 
       ' Close #1 

       ' Range("B1").Value = Mid(text, 1, 32) 
       ' Range("A1").Value = Dir(Fname) 
      End If 
     Next 
    End If 
End Sub 

Я не знаю, если это все не так, или нет, Я стараюсь сделать петлю и открыть каждый файл md5.txt в каждом почтовом ящике, который я должен открыть, и взять то, что находится внутри md5.txt

Можете ли вы мне помочь? Благодарю.

+2

Смотрите здесь для работы с почтовыми файлами с помощью VBA http://www.rondebruin.nl/win/s7/win002.htm –

+1

@TimWilliams Это не то, что мы здесь. * Пожалуйста, не предлагайте полное решение для тех, кто не приложил никаких усилий. Пожалуйста, отправьте ответ на вопрос только с ** основной частью кода ** (т. Е. Основной функцией для чтения txt из zip-файлов). – cybermonkey

+2

Я думаю, нам разрешено индивидуально решать, для чего мы здесь, - по крайней мере, я оставляю этот вариант ... Ссылка, которую я опубликовал, отнюдь не является полным решением, но если она помогает OP, то у меня нет проблема с этим. Однако ссылка, как правило, представляет собой столько же усилий, сколько я готов поставить на вопрос, который не показывает никаких усилий или не включает какой-либо существующий код, если только это то, что я не пытался делать раньше, и мне интересно решить , –

ответ

3

Вот пример цикла в ваших ячейках и получения zip-файла, извлечения содержимого и чтения файла. Вам может потребоваться настроить путь к zip-файлу или по умолчанию будет использоваться тот файл, в котором когда-либо был запущен документ Excel. Если вы поместите весь путь в zip в столбце A, вам не нужно будет корректировать.

Редактировать было сделано, чтобы отобразить имя файла md5.txt и разместить содержимое во втором столбце.

Sub GetData() 
Dim iRow As Integer 'row counter 
Dim iCol As Integer 'column counter 
Dim savePath As String 'place to save the extracted files 
Dim fileContents As String 'contents of the file 
Dim fso As FileSystemObject 'FileSystemObject to work with files 
iRow = 1 'start at first row 
iCol = 1 'start at frist column 
'set the save path to the temp folder 
savePath = Environ("TEMP") 
'create the filesystem object 
Set fso = New FileSystemObject 

Do While ActiveSheet.Cells(iRow, iCol).Value <> "" 
    fileContents = fso.OpenTextFile(UnzipFile(savePath, ActiveSheet.Cells(iRow, iCol).Value, "md5.txt"), ForReading).ReadAll 
    ActiveSheet.Cells(iRow, iCol + 1).Value = fileContents 
    iRow = iRow + 1 
Loop 


'free the memory 
Set fso = Nothing 
End Sub 



Function UnzipFile(savePath As String, zipName As String, fileName As String) As String 
Dim oApp As Shell 
Dim strFile As String 
'get a shell object 
Set oApp = CreateObject("Shell.Application") 
    'check to see if the zip contains items 
    If oApp.Namespace(zipName).Items.Count > 0 Then 
     Dim i As Integer 
     'loop through all the items in the zip file 
     For i = 0 To oApp.Namespace(zipName).Items.Count - 1 
      'check to see if it is the txt file 
      If UCase(oApp.Namespace(zipName).Items.Item(i)) = UCase(filename) Then 
       'save the files to the new location 
       oApp.Namespace(savePath).CopyHere oApp.Namespace(zipName).Items.Item(i) 
       'set the location of the file 
       UnzipFile = savePath & "\" & fileName 
       'exit the function 
       Exit Function 
      End If 
     Next i 
    End If 
'free memory 
Set oApp = Nothing 

End Function 
+0

У меня есть автогенерируемая файлы почтового индекса что мне нужно получить доступ, и они когда-нибудь будут повреждены или увеличены. Я могу проверить их размер, но есть ли способ проверить, доступен ли zip-файл? – Divin3

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