2016-07-27 1 views
0

Я пытаюсь изменить сценарий VBA из другого сообщения (26486871).Ошибка VBA в пространстве имен(). CopyHere ... и ... Namespace(). Items

Сценарий загрузит Zip-файл, извлечет текстовый файл и импортирует данные в Excel.

Я не знаю VBA, поэтому я буду решать каждую из функций один раз.

  1. Создайте временную папку с именем рандомизированного ................................ Полное
  2. Загрузите Zip-файл с общедоступного сервера .......................................... ..... Завершить
  3. Извлечь текстовый файл (20 МБ, с табуляцией) .............................. ................ Ошибка
  4. Импорт данных в открытом листе (затирание) ... Еще не

на Extract части, я перев. ceiving ошибки во время выполнения на следующей строке:

objOApp.Namespace(FileNameToUnzip).CopyHere objOApp.Namespace(varFileNameFolder).items, 256 

«Ошибка выполнения '91: переменная объекта или переменная блока не установлен.»

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

Option Explicit 
'Main Procedure 
Sub DownloadExtractAndImport() 

Dim url As String 
Dim targetFolder As String, targetFileZip As String, targetFileTXT As String 

Dim wkbAll As Workbook 
Dim wkbTemp As Workbook 
Dim sDelimiter As String 
Dim newSheet As Worksheet 

url = "http://www.example.com/data.zip" 
targetFolder = Environ("TEMP") & "\" & RandomString(6) & "\" 
MkDir targetFolder 
targetFileZip = targetFolder & "data.zip" 
targetFileTXT = targetFolder & "data.txt" 

'1 download file 
DownloadFile url, targetFileZip 

'2 extract contents 
Call UnZip(targetFileZip, targetFolder) 


End Sub 

Private Sub DownloadFile(myURL As String, target As String) 

Dim WinHttpReq As Object 
Dim oStream As Object 
Set WinHttpReq = CreateObject("Msxml2.ServerXMLHTTP") 
WinHttpReq.Open "GET", myURL, False 
WinHttpReq.send 

myURL = WinHttpReq.responseBody 
If WinHttpReq.Status = 200 Then 
Set oStream = CreateObject("ADODB.Stream") 
oStream.Open 
oStream.Type = 1 
oStream.Write WinHttpReq.responseBody 
oStream.SaveToFile target, 1 ' 1 = no overwrite, 2 = overwrite 
oStream.Close 
End If 

End Sub 

Private Function RandomString(cb As Integer) As String 

Randomize 
Dim rgch As String 
rgch = "abcdefghijklmnopqrstuvwxyz" 
rgch = rgch & UCase(rgch) & "" 

Dim i As Long 
For i = 1 To cb 
RandomString = RandomString & Mid$(rgch, Int(Rnd() * Len(rgch) + 1), 1) 
Next 

End Function 

Private Function UnZip(PathToUnzipFileTo As Variant, FileNameToUnzip As Variant) 

Dim objOApp As Object 
Dim varFileNameFolder As Variant 
varFileNameFolder = PathToUnzipFileTo 
Set objOApp = CreateObject("Shell.Application") 
objOApp.Namespace(FileNameToUnzip).CopyHere objOApp.Namespace(varFileNameFolder).items, 256 

End Function 
+0

Возможный дубликат [VBA для загрузки, Извлечение и импорта Zip файлов в Excel] (http://stackoverflow.com/questions/38571937/vba-to-download-extract-and-import-zip-file -to-excel) – Comintern

+0

Что такое дубликат [Как импортировать zipped csv, размещенный в Интернете в Excel] (http://stackoverflow.com/questions/26486871/how-to-import-a-zipped-csv-hosted- онлайн-в-Excel). Пожалуйста, отредактируйте свой старый вопрос (http://stackoverflow.com/posts/38571937/edit) с новой информацией, вместо того чтобы публиковать новый вопрос. – Comintern

+0

Я задал вопрос в сообщении вашего второго комментария, но администратор удалил его, потому что он не внес вклад. В другом посте кто-то сказал написать код сам. Я не знаю VBA, поэтому изучаю и изучаю. – Bruce

ответ

0

Comintem прав, вы должны отредактировать свой старый вопрос с добавленным кодом, а не опубликовать почти идентичный новый вопрос. Возможно, сохраните этот вопрос и удалите старый.

Чтобы ответить на ваш вопрос, похоже, что вы передаете свои аргументы в неправильном порядке своей функции UnZip. Попробуйте изменить строку:

Call UnZip(targetFolder, targetFileZip) 

Update

Это трудно диагностировать проблемы, как ваши объекты создаются и его свойства/методы называют все в одной строке. Судя по характеру ваших вопросов, не кажется, что ваши знания VBA особенно обширны и вы пытаетесь построить рабочее решение, объединив различные фрагменты веб-кода. Это не моя позиция, чтобы судить о таком подходе, но мой совет был бы, если вы примете этот подход, создать свои объекты по одному и вызвать его методы по одному за раз. Это значительно упростит диагностику вашего кода.

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

Dim mainFolder As String 
Dim zipFolder As String 
Dim destinationFolder As String 
Dim oShell As Object 
Dim oMainFolder As Object 
Dim oDestinatioFolder As Object 
Dim oZipFolder As Object 
Dim oZipItems As Object 

'Define the folder names 
mainFolder = "C:\Users\User\Downloads\SO\" 'change to your own folder name 
zipFolder = "sqlite-shell-win32-x86-3071700.zip" 'an old sqlite download = change to your name 
destinationFolder = Left(zipFolder, Len(zipFolder) - 4) 'name of zip folder minus the '.zip' 

'Create the new destination folder 
MkDir mainFolder & destinationFolder 

'Acquire the folder items 
'create the shell object 
Set oShell = CreateObject("Shell.Application") 
'create the main folder object as Folder3 item 
Set oMainFolder = oShell.Namespace(CVar(mainFolder)) 'argument must be a variant 
'create the destination folder object as Folder3 item 
Set oDestinatioFolder = oMainFolder.Items.Item(CVar(destinationFolder & "\")).GetFolder 
'create the zip folder object as Folder3 
Set oZipFolder = oMainFolder.Items.Item(CVar(zipFolder)).GetFolder 

'Extract the zip folder items and write to desination folder 
oDestinatioFolder.CopyHere oZipFolder.Items, 256 
+0

Я изменил порядок, но я все еще получаю сообщение об ошибке. Я не знаю, если это имеет значение, но после изучения других скриптов я изменил все objOApp на oApp. – Bruce

+0

спасибо за помощь. Добавляю ли я частную функцию UnZip (mainFolder As Variant, zipFolder As Variant) вверху? – Bruce

+0

Нет, просто 'Sub' с любым именем, например:' Private Sub UnZip() '. – Ambie

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