2016-07-27 75 views
0

別のポストからVBAスクリプトを変更しようとしています(26486871)。Namespace()のVBAエラーCopyHere ... and ... Namespace()。items

スクリプトは、Zipファイルをダウンロードしたテキストファイルを抽出し、Excelにデータをインポートします。

私が-時間の関数1のそれぞれに取り組むますので、私はVBAを知りません。

  1. 無作為化名前で一時ディレクトリを作成します................................完全
  2. パブリックサーバからZipファイルをダウンロードする.......................................... .....完了
  3. テキストファイル(20MB、タブ区切り)を抽出してください。.............................. ................エラー
  4. インポート抽出部にはまだ

オープンワークシートへのデータ(既存のデータを上書き)...、I '再

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

「ファイル名を指定して実行時エラー'91::オブジェクト変数またはブロック変数が設定されていないと」次の行に実行時エラーをceiving

デバッグモードでは、ディレクトリとファイル名が正しい間、私は、変数の上に私のカーソルを合わせると。 設定されていないものが不明です。私はどんな助けにも感謝します。

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

[Excelに、ダウンロードし解凍して、インポートのZipファイルにVBA]の可能な重複(http://stackoverflow.com/questions/38571937/vba-to-download-extract-and-import-zip-file – Comintern

+0

[zip形式のcsvをオンラインでホストする方法をExcelにインポートする方法]の複製です(http://stackoverflow.com/questions/26486871/how-to-import-a-zipped-csv-hosted-オンラインからエクセルへ)。新しい質問を掲示する代わりに、あなたの新しい情報で[あなたの古い質問を編集してください](http://stackoverflow.com/posts/38571937/edit)してください。 – Comintern

+0

私はあなたの2番目のコメントの投稿に質問しましたが、それが貢献しなかったので管理者がそれを削除しました。他のポストでは、誰かが自分でコードを書くと言った。私はVBAを知らないので、私は学び、研究しています。 – Bruce

答えて

0

Comintemは正しいですが、ごく近い新しい質問を投稿するのではなく、追加したコードで古い質問を編集する必要があります。多分この質問を残し、古いものを削除してください。あなたはUnZip関数に間違った順序であなたの引数を渡しているかのよう

は、あなたの質問に答えるために、それが見えます。それはあなたのオブジェクトが作成されて、そのプロパティ/メソッドがすべて1行に呼び出されるなどの問題を診断することは困難です

更新

Call UnZip(targetFolder, targetFileZip) 

:に行を変更してみてください。あなたの質問の性質から判断すると、あなたのVBAの知識は特に広大で、Webコードのさまざまな部分を一緒に結び付けて作業ソリューションを構築しようとしているようには見えません。このようなアプローチを判断するのは私の立場ではありませんが、あなたがこのアプローチをとった場合、一度に1つずつオブジェクトを作成し、そのメソッドを1つずつ呼び出すようにアドバイスします。これにより、コードを診断するのがずっと簡単になります。

私はこれを行うことができる方法をお見せするためにあなたのコードの要素を書き換えしようとしました。ちょっと残忍かもしれませんが、少なくとも問題の正確な場所を特定するのに役立ちます。明らかに、自分のフォルダ名を変更してください。

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