Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10全般 : Excel 2016)
HTTPリクエストエラー
投稿日時: 22/09/16 04:18:47
投稿者: シミスケ

お分かりになる方がおりましたら、アドバイスをお願い致します。
 
WinHttpRequestオブジェクトを生成して、HTTP通信を行うクラスモジュールがあるのですが、下記の赤文字の部分(Send)でエラー(Err文言:無効または認識されない応答をサーバーが返しました)が発生して困っています。
そして、自宅環境で自宅するとエラーは起こらないのですが、会社環境で実行すると時々エラーが発生する(毎回ではない。クラスの用途は同じなのに)という状況です。
 
いろいろと確認したところ、WinHTTPプロキシが関係していそうなことが分かっています。
と言うのもエラー発生後に以下を行って、再実行するとほとんどの場合、改善するからです。
 ・Edgeブラウザを終了する
 ・PowerShellでWinHTTPプロキシ設定を確認するコマンドを実行する(netsh winhttp show proxy)
 
以上よりSendコマンド実行前にWinHTTPプロキシ設定を認識させるコードを追加すればよいのかなと想像しています(WinHTTPプロキシ設定はされているが、何かの拍子に認識されなくなっているため、再認識させる?)。
 
何かよい方法がありましたら、ご教授いただけますと幸いです。
よろしくお願い致します。
 
 
<クラスモジュール抜粋>
---------------------------------------------
Option Explicit
 
Public HttpReq As Object
Public Cookie As String
Public RspTxt As String
Public AllRspHeaders As String
 
Const REQ_INTVL_MS As Long = 1000 ' リクエストの送信間隔(ミリ秒)
Const RSP_STS_SUCC As Long = 200 ' ステータスコード(成功)
 
Private Sub Class_Initialize()
    Set HttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
End Sub
 
Private Sub Class_Terminate()
    Set HttpReq = Nothing
End Sub
 
Public Function SendReq(ByVal url As String, _
                        Optional loginData As Variant = vbEmpty) As Boolean
                      
    Sleep REQ_INTVL_MS ' 標準モジュールで定義したスリープ関数でリクエスト間隔を空ける
    On Error GoTo HasErr
     
    With HttpReq
        If loginData = vbEmpty Then ' リクエストメソッドを設定
            .Open "GET", url, False
        Else
            .Open "POST", url, False
        End If
         
        Call SetRequestHeader ' リクエストヘッダーを設定
         
        If loginData <> vbEmpty Then
            loginData = MakeRequestBody(loginData) ' リクエストボディ(ログイン情報)を生成する関数
        End If
                 
        .Send loginData
         
        DoEvents
         
        If .Status <> RSP_STS_SUCC Then GoTo HasErr
         
        RspTxt = .responseText
        AllRspHeaders = .getAllResponseHeaders
         
        Cookie = .GetResponseHeader("Set-Cookie")
    End With
     
    SendReq = True
    Exit Function
     
HasErr:
    SendReq = False
     
End Function
 
Private Sub SetRequestHeader()
    With HttpReq
        .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .SetRequestHeader "Connection", "Keep-Alive"
        .SetRequestHeader "Accept-encoding", "identity"
        .SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
        If Cookie <> vbNullString Then
            .SetRequestHeader "Cookie", Encode(Cookie)
        End If
    End With
End Sub

回答
投稿日時: 22/09/16 07:00:15
投稿者: simple

このあたりの記事は参考になりませんか?
 
【Excel VBA】プロキシ環境でHttprequestのSendでエラーが出たので対応した話
https://papasensei365.com/excel-httprequest-proxy/

投稿日時: 22/09/16 08:22:40
投稿者: シミスケ

simple様
 
コメントありがとうございます。
ご提示いただいたWEBページは確認済みでした。
 
setProxyを追加して、プロキシ設定を指定してからSendするようにしたのですが、改善しませんでした。
setProxyCredentialsはネットワークを知識が足りず、試していません(認証が必要か不明)。該当のツールは複数端末で使うため、個別の認証処理をプログラムに含ませたくない、ということもあって、ここは追求しませんでした。

回答
投稿日時: 22/09/17 09:22:39
投稿者: simple

返信拝見しました。
私もネットワーク管理の経験がないのでよくわかりません。
どなたかからコメントがあるとよいですね。
 
なお、まずは、御社のネットワーク管理者に確認して、助言を求めるのがよいと思います。
固有の状況があるかもしれませんし、第三者にはわからないこともあると思います。

投稿日時: 22/09/21 08:08:11
投稿者: シミスケ

simple様
 
メッセージありがとうございます。
 
会社のシステム部門に照会してみました。
プロキシサーバーにて、何かしらのブロックがされていないかについては、
確認してもらい、そもそも、リクエストがきていないという回答が得られました。
 
やはり、クライアント側の問題のようですが、
残念ながら、これ以上のフォローは難しい、ということでした。。
 
もう少しだけ質問の掲載を続けてみて、
他にコメントが得られないようであれば、質問を閉じようと思います。
 
ありがとうございました。

回答
投稿日時: 22/09/22 19:19:26
投稿者: simple

コメント拝見しました。
ネットワーク管理者さんに、コードベースで情報を提供して相談されたのでしょうか。
そのうえでの結論ならよいですが、情報がすれ違っているのではないかと懸念します。
当然そんなことはやっています、ということでの結論なら杞憂ですね。
お力になれず残念でした。

トピックに返信