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

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

ただいまの
回答率

90.47%

  • VBA

    1862questions

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

  • Windows 10

    993questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

  • POST

    234questions

    POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

【Windows 10】Access VBAのPOST送信の不具合

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,229

morio12

score 5

前提・実現したいこと

Access VBAでxmlをPOSTし、java側で受け取るという処理があります。

発生している問題・エラーメッセージ

Window 10PCでAccess VBAを動かした場合に、
パラメータ(下記ソースのpostXML)がうまく送られず、
java側で受け取ったときに空文字になっています。

エラーメッセージは特に出ていません。

該当のソースコード

Public Function HttpPOST(strURL As String, postXML As String) As String

Dim objHttp As Object
Dim objDoc As Object
Dim resXML As String
Dim strErrMsg As String

On Error GoTo HttpPOST_Err

HttpPOST = vbNullString

    Set objHttp = CreateObject("MSXML2.ServerXMLHTTP")

    With objHttp
        'タイムアウトの設定
        .setTimeouts 30000, 30000, 30000, 30000
        '定型句
        .Open "POST", strURL, False
        .SetRequestHeader "Content-Type", "application/xml; charset=""Shift_JIS"""
        'Shift-JISにしてPOST
        .send (ChangeChr(postXML))

        '接続NGの場合Exit
        If .Status <> 200 Then GoTo HttpPOST_Err

        '取得内容をユニコードに変換
        resXML = StrConv(.responseBody, vbUnicode)
Debug.Print resXML
        HttpPOST = resXML

    End With
    Set objHttp = Nothing

Exit Function

〜〜途中のソースは省略〜〜

Public Function ChangeChr(strXML As String) As Byte()
Dim objSTREAM As Object
On Error Resume Next
    Set objSTREAM = CreateObject("ADODB.Stream")
    With objSTREAM
        .Open
        .Type = adTypeText
        .Charset = "Shift_JIS"
        .WriteText strXML
        .Position = 0
        .Type = adTypeBinary
        .Position = 0
        ChangeChr = .Read()
    End With

    objSTREAM.Close:    Set objSTREAM = Nothing
End Function

試したこと

課題に対してアプローチしたことを記載してください

送信しているパラメータ(ChangeChr(postXML))には、
問題なく値が設定されていることは確認できています。
また、java側ではパラメータ空文字になってしまっていますが、
受信自体は出来ています。

また、以下を試しています。

・CreateObject("MSXML2.ServerXMLHTTP")の修正
 CreateObject("MSXML2.ServerXMLHTTP.3.0")や、
 CreateObject("MSXML2.ServerXMLHTTP.6.0")に
 変更して動かしてみましたが、改善しませんでした。

・SetRequestHeaderの修正
 "Content-Type", "application/xml; charset=""utf-8"""や、
 "Content-Type", "application/x-www-form-urlencoded; charset=""Shift_JIS"""に
 変更して動かしてみましたが、改善しませんでした。

↓4/26追記
WireSharkにて確認した、パケットキャプチャの結果を載せておきます。
(一部変更し伏せています) 
Win7で実行した場合は、一番下のContent-Lengthが0ではなく、 正しい数値(268)が入っています。

POST /api/httpApiXmlMessageReceive HTTP/1.1
Connection: Keep-Alive
Content-Type: application/xml; charset="Shift_JIS"
Accept: */*
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)
Content-Length: 268
Host: XX.XXX.XXX.XXX

<?xml version="1.0" encoding="Shift_JIS" ?>

~xmlの中身は省略~

</sps-api-request>HTTP/1.1 302 Found
Date: Tue, 26 Apr 2016 03:29:54 GMT
Location: http://XX.XXX.XXX.XXX
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/plain

POST /api/httpApiXmlMessageReceive/ HTTP/1.1
Connection: Keep-Alive
Accept: */*
User-Agent: Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)
Content-Length: 0
Host: XX.XXX.XXX.XXX

補足情報(言語/FW/ツール等のバージョンなど)

VBA 7.0を使用

Windows7のPCでは問題なく動いており、Windows10では使っている
どのPCでも発生しています。
ただ、WIndows10に原因があるのかどうかはわかっていません。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • morio12

    2016/04/26 12:43

    記載し忘れましたが、Win7とWin10の端末は同じ場所に置いてあるため、ネットワークの問題ではないと思います。

    キャンセル

  • eripong

    2016/04/26 14:11

    改行がないと分かりにくいので、質問に追記できませんか?POSTかGETか分かる様にしていただくとありがたいです。それから、最初のリクエストがリダイレクトされてる様に見えますが、Windows7でもこの動きですか?

    キャンセル

  • morio12

    2016/04/26 14:24

    失礼しました。 質問に追記しました。 リダイレクトについては、Windows7でも同様です。

    キャンセル

回答 4

check解決した方法

0

すみません、こちら解決しました。
VBAの方に記述してあるAPI先のURLが一部不足しており、リダイレクトされていたことが原因でした。

回答頂いた方、ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

てきとうですが…
Accessを再インストールしたら?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/18 09:13

    Accessを再インストールしてみましたが、改善しませんでした。

    キャンセル

0

自分のところで動いているExcelVBAのPOSTサンプルです。受け側はphpです。
多分ヘッダのenctypeはapplication/x-www-form-urlencodedかmultipart/form-dataじゃないと
ダメなんじゃないかなーと思います。
あと自分でリクエスト生成する場合、paramStrはvariantじゃないとダメだとどこかで見ました。
参考になるといいですね。

'------------------------------------------------------------------------
Private Sub openPostQuery(url As String, paramStr As String)
      '-----------------
      'リクエスト生成
      '-----------------

      '--------------
      'POST実行
      '--------------
      Dim xmlhttp As Object
      Set xmlhttp = CreateObject("msxml2.xmlhttp")
      xmlhttp.Open "POST", url, False  'オープン
      xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
      xmlhttp.send (paramStr)    'パラメータ送付

      '--------------
      '応答取得
      '--------------
      Dim retCd As String
      retCd = xmlhttp.Status    '結果コード取得

      If retCd <> 200 Then
          Debug.Print "error:" & retCd
      Else
          Dim retHtml As String
          retHtml = StrConv(xmlhttp.responsebody, vbUnicode, 1041)    '結果HTML取得
          Debug.Print retHtml
      End If

End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/18 17:01

    回答ありがとうございます。

    enctypeをapplication/x-www-form-urlencoded、multipart/form-dataの
    両方で試しましたが、改善ありませんでした。

    また、paramStrはvariantにしてみましたが、こちらも改善ありませんでした。

    キャンセル

0

試しにですが

Set objHttp = CreateObject("MSXML2.ServerXMLHTTP")

Set objHttp = CreateObject("MSXML2.XMLHTTP")

に変えてみてやってみるといかがでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/19 00:46

    回答ありがとうございます。

    試してみましたが、こちらも改善しませんでした。

    キャンセル

  • 2016/04/19 12:35

    そうすると、Win10 PCからサーバに対して行なっている通信が、正しくPCから出ていてサーバサイドにたどり着く前のどこかでパラメータが喪失されているのか、PCからでられていないのかを切り分ける必要がありそうです。

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    エクセルVBA   

    Sub ie_test() 'IEテストする。 'IEの起動 Dim objIE As InternetExplorer Dim htdoc As HTMLDocument

  • 受付中

    iuiuiiiiVBA クリック処理

    ①<a href="http://AAAx" target="_blank" data-ylk="slk:itemnm;pos:12" data-rapid_p="23"> パン

  • 解決済

    エクセルのVBAの動作の高速化について

    エクセルのVBAの高速化を行いたいと思い質問させていただきます。 現在、きまった形のデータを作成するために、コピーandペースト作業時のミスをなくすためエクセルとVBAを使い

  • 解決済

    VBAの配列の質問

    VBAの配列で教えてほしい事があります。 同一ブック内に2つのsheetがあります。 ”集計結果”と”一時保管”です。 ”一時保管”はA~D列にデータが入っています。

  • 解決済

    【VBA】特定の文字までを取得する方法

    VBAのことでお聞きしたいことがあります。 ■やりたいこと ・サイトのディレクトリデータが入っている列から最後の「/」以降の文字を除いた文字を取得 例)「/test/tes

  • 受付中

    VBAのexec()について

    外部batファイルをexec()で実行しました。 ですがその際、StdOutには4096バイトしか出力出来ないそうで、結果が途中までしか出力出来ません。 batファイルを複数に分け

  • 解決済

    VBA高速化について

    20個のエクセルファイルを読み込み、特定のシートにあるテーブルから特定の値を探し出し、その右横にあるセルの値を取り出します。 集計用のエクセルのテーブルでも、同じ特定の値をテーブル

  • 解決済

    powerpointでタイトル(文字列+連続変数)をVBAで一括変換

    パワーポイントで、タイトルの位置に テキスト+数字 の形でFor文を使って作りたいです。 例)こんにちは1(スライド1枚目) こんにちは2(スライド2枚目) ...といった形です。

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

  • VBA

    1862questions

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

  • Windows 10

    993questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

  • POST

    234questions

    POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。