Erreur VBA sur l'espace de noms (). CopyHere … et … Namespace (). Items

Je tente de modifier un script VBA d'un autre article (26486871).

Le script va download un file Zip, extraire un file text et importer datatables dans Excel.

Je ne connais pas VBA, donc je vais aborder chacune des fonctions un à la fois.

  1. Créez un directory temporaire avec un nom random ………………………….. Terminé
  2. Télécharger un file Zip à partir d'un server public …………………………………… …..Achevée
  3. Extrayez le file text (20 Mo, délimité par un onglet) ………………………………… …….Erreur
  4. Importez datatables dans la feuille de calcul ouverte (écraser datatables existantes) … Pas encore

Sur la partie Extraire, je reçois une erreur d'exécution sur la ligne suivante:

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

"Erreur d'exécution" 91: variable d'object ou avec variable de bloc non définie. "

Lorsque je place mon slider sur les variables en mode Débogage, le directory et les noms de files sont corrects. Je ne sais pas ce qui n'est pas défini. J'apprécie toute aide.

 Option Explicit 'Main Procedure Sub DownloadExtractAndImport() Dim url As Ssortingng Dim targetFolder As Ssortingng, targetFileZip As Ssortingng, targetFileTXT As Ssortingng Dim wkbAll As Workbook Dim wkbTemp As Workbook Dim sDelimiter As Ssortingng Dim newSheet As Worksheet url = "http://www.example.com/data.zip" targetFolder = Environ("TEMP") & "\" & RandomSsortingng(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 Ssortingng, target As Ssortingng) 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 RandomSsortingng(cb As Integer) As Ssortingng Randomize Dim rgch As Ssortingng rgch = "abcdefghijklmnopqrstuvwxyz" rgch = rgch & UCase(rgch) & "0123456789" Dim i As Long For i = 1 To cb RandomSsortingng = RandomSsortingng & 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 

Comintem a raison, vous devez modifier votre ancienne question avec le code ajouté plutôt que de publier une nouvelle question identique. Peut-être garder cette question et supprimer l'ancien.

Pour répondre à votre question, il semble que vous UnZip vos arguments dans le mauvais ordre à votre fonction UnZip . Essayez de changer la ligne pour:

 Call UnZip(targetFolder, targetFileZip) 

Mettre à jour

Il est difficile de diagnostiquer les problèmes lorsque vos objects sont créés et que leurs propriétés / methods sont appelées toutes sur une seule ligne. À en juger par la nature de vos questions, il ne semble pas que vos connaissances VBA soient particulièrement vastes et que vous essayez de build une solution de travail en associant set divers composants de code Web. Ce n'est pas ma position de juger ce genre d'approche, mais mon conseil serait, si vous prenez cette approche, de créer vos objects un à la fois et d'appeler ses methods une à la fois. Cela facilitera le diagnostic de votre code.

J'ai essayé de réécrire des éléments de votre code pour vous montrer comment cela pourrait être fait. Cela pourrait être un peu trop, mais au less, cela vous aidera à identifier l'location précis de tout problème. Évidemment, modifiez les noms de dossier à vous-même.

 Dim mainFolder As Ssortingng Dim zipFolder As Ssortingng Dim destinationFolder As Ssortingng 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