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

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

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

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

HTTP

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

解決済

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

ot2os
ot2os

総合スコア0

VBA

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

HTTP

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

1回答

0評価

0クリップ

163閲覧

投稿2018/01/10 05:53

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

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

lang

Option Explicit Public Sub Sample04() Dim req As Object Dim dat As Variant Const UserName = "User" 'ユーザー名 Const PassWord = "Password" 'パスワード Const AuthUrl = "https://xxxx.jp/login.aspx" '認証ページのURL Const FileUrl = "https://xxxx.jp/logs.csv?start=2017%2f12%2f01&end=2017%2f12%2f31" 'ダウンロード対象のURL Const SaveFilePath = "C:\Users\User01\Documents\MyFiletest.csv" 'ローカルのダウンロード先 Const adTypeBinary = 1 Const adSaveCreateOverWrite = 2 Set req = Nothing '初期化 Set req = CreateHttpRequest() If req Is Nothing Then Exit Sub '認証 req.Open "POST", AuthUrl, False 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" 'パラメーター設定 req.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" req.Send dat '★この段階でタイムアウトエラー発生 If req.Status <> 200 Then MsgBox "認証に失敗しました。" & vbCrLf & _ "処理を中止します。", vbCritical + vbSystemModal Exit Sub End If 'ファイルのダウンロード req.Open "GET", FileUrl, False 'XMLHTTPRequestを考慮してキャッシュ対策 req.setRequestHeader "Pragma", "no-cache" req.setRequestHeader "Cache-Control", "no-cache" req.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT" req.Send Select Case req.Status Case 200 With CreateObject("ADODB.Stream") .Type = adTypeBinary .Open .Write req.responseBody .SaveToFile SaveFilePath, adSaveCreateOverWrite .Close End With Case Else MsgBox "エラーが発生しました。" & vbCrLf & _ "ステータスコード:" & req.Status, _ vbCritical + vbSystemModal Exit Sub End Select MsgBox "処理が終了しました。", vbInformation + vbSystemModal End Sub Private Function CreateHttpRequest() As Object 'WinHttpRequest/XMLHTTPRequestオブジェクト作成 'http://www.f3.dion.ne.jp/~element/msaccess/AcTipsWinHTTP1.html 参考 Dim progIDs As Variant Dim ret As Object Dim i As Long Set ret = Nothing '初期化 progIDs = Array("WinHttp.WinHttpRequest.5.1", _ "WinHttp.WinHttpRequest.5", _ "WinHttp.WinHttpRequest", _ "Msxml2.ServerXMLHTTP.6.0", _ "Msxml2.ServerXMLHTTP.5.0", _ "Msxml2.ServerXMLHTTP.4.0", _ "Msxml2.ServerXMLHTTP.3.0", _ "Msxml2.ServerXMLHTTP", _ "Microsoft.ServerXMLHTTP", _ "Msxml2.XMLHTTP.6.0", _ "Msxml2.XMLHTTP.5.0", _ "Msxml2.XMLHTTP.4.0", _ "Msxml2.XMLHTTP.3.0", _ "Msxml2.XMLHTTP", _ "Microsoft.XMLHTTP") On Error Resume Next For i = LBound(progIDs) To UBound(progIDs) Set ret = CreateObject(progIDs(i)) If Not ret Is Nothing Then Exit For Next On Error GoTo 0 Set CreateHttpRequest = ret End 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でインターネット上のファイルをダウンロードする方法をまとめてみました。」内の下記項目

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

VBA

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

HTTP

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