[[20100306231938]] 『VBAでPOST送信ができない』(スフレ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAでPOST送信ができない』(スフレ)
 VBAからhttpにPOSTでデータを送信するのをやっているのですが、まったくうまくできなくて困っています。今日1日様々なサイトを見まわりましたがわかりませんでしたので教えてください。

 まず簡単なPOSTをするフォームを作ります
 == http://localhost/input.html =============================================
 <html><head>
 <meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
 </head>
 <body>
 <form name="formInput" method="POST" action="action.php">
 <input type="text" name="inputTest"></input><br>
 <input type="submit" value="送信">
 </form></body></html>
 ============================================================================

 POST後の動作はPHPで適当にやっていますがここは気にしないでください。

 次にVBAでPOSTするためのコードを作りました。
 ============================================================================
 Sub postData()

 Dim xmlhttp As Object
 Set xmlhttp = CreateObject("msxml2.xmlhttp")

 'POSTするURL
 Dim strUrl As String
 strUrl = "http://localhost/input.html"

 xmlhttp.Open "POST", strUrl, False
 Call WinHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")

 '文字列をByte型の文字列に変換
 Dim bPmary() As Byte
 bPmary = StrConv("inputTest=hoge", vbFromUnicode)

 '送信します
 xmlhttp.Send (bPmary)

 '戻ってきたHTMLをそのまま表示
 Dim sHTML As String
 sHTML = xmlhttp.responsebody
 sHTML = StrConv(sHTML, vbUnicode, 1041)
 Debug.Print sHTML

 End Sub
 ============================================================================

 これを実行すると最後のDebug.Printでアクション後(http://localhost/action.php実行後)のページのhtmlが表示されるはずなのですが、
 なぜかhttp://localhost/input.htmlの内容が表示されてしまいます。
 つまり、何もデータがPOST送信されずに単にinput.htmlのコードがxmlhttp.responsebodyで返ってきてしまうだけなのです。

 どうしたらきちんとPOST送信されるのでしょうか?
 Windows7とExcel2007を使用しています。よろしくお願いします。

 参考サイト:
 http://d.hatena.ne.jp/juku-cho/20090429/1240971645
 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_085.html
 http://ie.vba-ken3.jp/Methods/Navigate/(こちらはIEオブジェクトを使ったやり方ですが同じ結果でした)


 中身の詳細を見ていませんが、
 xmlhttp でオブジェクト設定しているのに、 WinHttp.setRequestHeader して
 いるせいじゃないでしょうか。
 (Mook)

 ありがとうございます。

 あ、すみません。そこは質問時に記述を間違えてしまいました。
 正しくはこうでしたね。しかしこれでもダメでした。
 Call xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")

 ちなみに以下の部分ですが、
 Set xmlhttp = CreateObject("msxml2.xmlhttp")

 以下のように変更してみてもダメでした。
 Set WinHttp = CreateObject("WinHttp.WinHttpRequest.5.1")

 (スフレ)

 PHPの部分は手動で動かした場合、問題なく動作するのでしょうか。
 であれば、その部分の文字コードはどうなっていますか。
 当該処理はSJISを想定していますが、その部分は一致していますか?

 処理全体は xmlhttp で行うべきで、 WinHttp は不要です。
 現実と違う内容を見て考えるのは無駄足ですので、上のコードは現在の
 実際のコードに訂正か、再掲ください。
 (Mook)

 ありがとうございます。

 >PHPの部分は手動で動かした場合、問題なく動作するのでしょうか。

 はい。問題なく動作しています。

 >当該処理はSJISを想定していますが、その部分は一致していますか?

 はい。一致しています。

 >実際のコードに訂正か、再掲ください

 大変申し訳ございませんでした。先程の一箇所だけ訂正して再掲させていただきます。

 ============================================================================
 Sub postData()

 Dim xmlhttp As Object
 Set xmlhttp = CreateObject("msxml2.xmlhttp")

 'POSTするURL
 Dim strUrl As String
 strUrl = "http://localhost/input.html"

 xmlhttp.Open "POST", strUrl, False
 Call xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")

 '文字列をByte型の文字列に変換
 Dim bPmary() As Byte
 bPmary = StrConv("inputTest=hoge", vbFromUnicode)

 '送信します
 xmlhttp.Send (bPmary)

 '戻ってきたHTMLをそのまま表示
 Dim sHTML As String
 sHTML = xmlhttp.responsebody
 sHTML = StrConv(sHTML, vbUnicode, 1041)
 Debug.Print sHTML

 End Sub
 ============================================================================

 本当にすみませんでした。
 (スフレ)

 きちんと対応していただいていますので、謝る必要はありませんよ。
 さて、どこがおかしいでしょうか、なかなか分かりませんね。

 >(こちらはIEオブジェクトを使ったやり方ですが同じ結果でした)
 ということは、IE オブジェクトをやってみたのでしょうか。
 こちらは objIE.Visible = True とすれば、実行結果が見れると思いますが
 期待通りの実行結果になっているでしょうか。
 (Mook)

 度々ありがとうございます。

 >こちらは objIE.Visible = True とすれば、実行結果が見れると思いますが
 >期待通りの実行結果になっているでしょうか。

 はい、こちらもやってみてブラウザが立ち上がるのですが、やはりhttp://localhost/input.htmlのページが
 表示されるだけでPOST処理は実行されません。

 コードは以下のような感じです。
 ============================================================================
 Sub ie_postData()
 'IEの起動(参照設定でMicrosoft Internet Controlsにチェックを入れています)
 Dim objIE As InternetExplorer
 Set objIE = CreateObject("InternetExplorer.Application")
 objIE.Visible = True

 '送信先とヘッダー情報の代入
 Dim strURL As String
 Dim strHeaders As String
 strURL = "http://localhost/input.html"
 strHeaders = "Content-Type: application/x-www-form-urlencoded " & vbCrLf

 '文字列をByte型の文字列に変換
 Dim bPmary() As Byte
 bPmary = StrConv("inputTest=hoge", vbFromUnicode)

 '.Navigate メソッドでPost送信
 objIE.Navigate strURL, , , bPmary, strHeaders 

 'ページの表示完了を待つ
 While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True
     DoEvents
 Wend
 End Sub
 ============================================================================

 その後なのですが、自分のPC(localhost)ではなくレンタルしているサーバー上で試してみても
 同じようにinput.htmlが表示されるだけでした。
 結局、このままでは進まないので、こちら↓のサイトを参考にして別の方法でなんとか対処しました。

 「InternetExplorer.application操作 .Clickでクリック」
 http://www.ken3.org/vba/backno/vba097.html

 これはIEのフォームにデータをVBAから入力してSUBMITボタンを押すというものです。
 ただ、これだとPOST結果の表示情報をVBAで取得できないので、ちょっと困っていますが…。
 (スフレ)

 ん?
 POST 結果の表示情報を取得できませんか?

 WEB サーバ側がPOSTに対して、結果を返していればクライアント側で結果を
 取得できるはずですが。
 (Mook)

 あ、最後にこのコードを入れることで表示を取得することができました。

 ============================================================================
 '送信結果のページ読み込みが終わるまでループ
 While (objIE.Busy = True Or objIE.ReadyState <> 4)
     DoEvents
 Wend

 '表示したページの<BODY>部のHTMLを取得
 Dim htmlBody As String
 htmlBody = objIE.Document.Body.InnerHtml
 Debug.Print htmlBody
 ============================================================================

 最初に質問したPOST送信自体がなぜできなかったのかは解決できませんでしたが、
 別の方法で代用できましたのでなんとかなりました。
 Mookさんにはいろいろお教えいただきまして助かりました。
 今後ともよろしくお願いいたします。それでは失礼いたします。
 (スフレ)  

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.