質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Q&A

解決済

1回答

14225閲覧

VBAでHttpRequestのSendメソッドを使った際にタイムアウトエラーが起こる

ot2os

総合スコア23

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

0グッド

0クリップ

投稿2018/01/10 05:53

###●やりたいこと
インターネット上のあるサイトにログインして、そこに保存されているcsvファイルを自動でダウンロードできるようにしようと思っています。
さしあたって、一番簡単そうなVBAでHttpRequestを使った方法を検討中です。

###●問題(発生現象)
下記のコードを実行後、タイムアウトエラーが出ます。

lang

1Option Explicit 2 3Public Sub Sample04() 4 Dim req As Object 5 Dim dat As Variant 6 7 Const UserName = "User" 'ユーザー名 8 Const PassWord = "Password" 'パスワード 9 Const AuthUrl = "https://xxxx.jp/login.aspx" '認証ページのURL 10 Const FileUrl = "https://xxxx.jp/logs.csv?start=2017%2f12%2f01&end=2017%2f12%2f31" 'ダウンロード対象のURL 11 Const SaveFilePath = "C:\Users\User01\Documents\MyFiletest.csv" 'ローカルのダウンロード先 12 13 Const adTypeBinary = 1 14 Const adSaveCreateOverWrite = 2 15 16 Set req = Nothing '初期化 17 Set req = CreateHttpRequest() 18 If req Is Nothing Then Exit Sub 19 20 '認証 21 req.Open "POST", AuthUrl, False 22 dat = "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2dwzKFGoOuiYCVzJJPEcC0RavMKGsUBdZNkyy7CiR8fW44tJ4T1HtL3sw2TryxZF3NnFDbKUud8ZxYHRhL41C1htjjdGyPDRScI44wWxYmC1q1rFQmgug&__VIEWSTATEGENERATOR=20B48FBE&__EVENTVALIDATION=%2k6CsmGmvppDJ3c6sFZpiGzl6kovsNmuyTbSSXJZoAA2fZpbp0DjbrvU6LbUS9Av1PeGZj5ymBh&UserId=" & UserName & "&Password=" & PassWord & "&Submit=%30%B8%E2%83%E2%E3%B3%83%AD%A4%E3%83" 'パラメーター設定 23 req.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 24 req.Send dat '★この段階でタイムアウトエラー発生 25 If req.Status <> 200 Then 26 MsgBox "認証に失敗しました。" & vbCrLf & _ 27 "処理を中止します。", vbCritical + vbSystemModal 28 Exit Sub 29 End If 30 31 'ファイルのダウンロード 32 req.Open "GET", FileUrl, False 33 'XMLHTTPRequestを考慮してキャッシュ対策 34 req.setRequestHeader "Pragma", "no-cache" 35 req.setRequestHeader "Cache-Control", "no-cache" 36 req.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT" 37 req.Send 38 Select Case req.Status 39 Case 200 40 With CreateObject("ADODB.Stream") 41 .Type = adTypeBinary 42 .Open 43 .Write req.responseBody 44 .SaveToFile SaveFilePath, adSaveCreateOverWrite 45 .Close 46 End With 47 Case Else 48 MsgBox "エラーが発生しました。" & vbCrLf & _ 49 "ステータスコード:" & req.Status, _ 50 vbCritical + vbSystemModal 51 Exit Sub 52 End Select 53 54 MsgBox "処理が終了しました。", vbInformation + vbSystemModal 55End Sub 56 57Private Function CreateHttpRequest() As Object 58'WinHttpRequest/XMLHTTPRequestオブジェクト作成 59'http://www.f3.dion.ne.jp/~element/msaccess/AcTipsWinHTTP1.html 参考 60 Dim progIDs As Variant 61 Dim ret As Object 62 Dim i As Long 63 64 Set ret = Nothing '初期化 65 progIDs = Array("WinHttp.WinHttpRequest.5.1", _ 66 "WinHttp.WinHttpRequest.5", _ 67 "WinHttp.WinHttpRequest", _ 68 "Msxml2.ServerXMLHTTP.6.0", _ 69 "Msxml2.ServerXMLHTTP.5.0", _ 70 "Msxml2.ServerXMLHTTP.4.0", _ 71 "Msxml2.ServerXMLHTTP.3.0", _ 72 "Msxml2.ServerXMLHTTP", _ 73 "Microsoft.ServerXMLHTTP", _ 74 "Msxml2.XMLHTTP.6.0", _ 75 "Msxml2.XMLHTTP.5.0", _ 76 "Msxml2.XMLHTTP.4.0", _ 77 "Msxml2.XMLHTTP.3.0", _ 78 "Msxml2.XMLHTTP", _ 79 "Microsoft.XMLHTTP") 80 On Error Resume Next 81 For i = LBound(progIDs) To UBound(progIDs) 82 Set ret = CreateObject(progIDs(i)) 83 If Not ret Is Nothing Then Exit For 84 Next 85 On Error GoTo 0 86 Set CreateHttpRequest = ret 87End Function

上記コマンド実行後、20秒ほどしてからreq.Send dat部分で下記エラーが出ます。

「Microsoft Visual Basic」
実行時エラー'-2147012894(80072ee2)'
処理がタイムアウトになりました。

###●確認したこと

1.現象発生時点で変数reqの値は各項目「<この操作を完了するのに必要なデータは、まだ利用できません>」です。

2.Internet Explorer で該当サイトを開き、「F12]キーの開発者ツール → 「ネットワーク」でログイン時の情報を収集した結果は下記

URLプロトコルメソッド結果種類
/login.aspxHTTPSPOST302text/html
/edit_profile.aspxHTTPSPOST200text/html
  • HTTPSのPOSTが2つあり、1行目の結果が302なのも気になりましたが、302は"Found"の応答のようなので特に問題なし?

  • 試しに2行目の「https://xxxx.jp/edit_profile.aspx」をAuthUrlに代入してみましたが、結果は同じくタイムアウト。

  • ちなみに、2行目の「要求本文」も1行目と全く同じ。

  • また、ステータスの確認までコードが進んでいないので、現状req.Send dat部分で引っかかる部分を何とかしたいです。

  • 変数datの内容は「要求本文」で確認した内容を使っています。
    かなり長いのが気になりましたが、送られている要求本文は毎回全く同じでした。

  • 「要求ヘッダー」の「Content-Type」は「application/x-www-form-urlencoded」でした。

  • 「要求」は「POST /login.aspx HTTP/1.1」です。

正直、他にどこを確認すれば良いのかよくわからない状態です。
確認すべき項目があれば補足いたします。

参考情報:

  • 「VBAでインターネット上のファイルをダウンロードする方法をまとめてみました。」内の下記項目

フォーム認証によるアクセス制限がかかったサイトのファイルをダウンロードする方法

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

解決しました。
コード中のSet req = CreateHttpRequest()Set req = CreateObject("Msxml2.XMLHTTP")に変えたところ、あっさり処理完了しました。

中の動作が見えませんが、ここのObject型にたくさん詰め込みすぎるとSendでタイムアウトしてしまうようです。

投稿2018/01/10 06:26

ot2os

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問