Webエンジニア 新人日記

Webエンジニアになりました。元々はCOBOLやらBASICやらでプログラムしてました。C言語やVisualBasicは趣味でやっていましたが、久々に現場復帰ということです。資格はエンベデッドスペシャリスト、DBスペシャリスト、ネットワークスペシャリスト、セキュリティスペシャリスト、システムアーキテクト、プロジェクトマネージャ他を所有

ExcelからWebアプリにPOSTする

ExcelとWebアプリを連動させる。逆はともかく、アップロードする分にはVBAを使うのが簡単。

Sub ボタン1_Click()
    On Error GoTo err
    Dim httpObj
    Dim sendData
    
                '   データセット
    target_url = "http://xxxxxxxx.html"
    sendData = "class=" & Range("B1").Value
    sendData = sendData & "&year=" & Range("B2").Value
    sendData = sendData & "&month=" & Range("B3").Value
    sendData = sendData & "&result=" & Range("B4").Value
                '   POSTで飛ばします
    Set httpObj = CreateObject("Microsoft.XMLHTTP")
    httpObj.Open "POST", target_url, False
    Call httpObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    httpObj.send (sendData)
    
                '   結果表示(デバッグ用)
    MsgBox httpObj.ResponseText
    Exit Sub
err:
    MsgBox "エラー番号:" & err.Number & vbCrLf & _
           "エラーの種類:" & err.Description, vbExclamation
End Sub

データは、"キー"="値" の形で指定する。複数ある場合は&で連結し
"キー1"="値1" & "キー2"="値2" & "キー3"="値3" .....
とする。日本語の時はエンコードとか面倒だけど、英数字だけならそれほどでもない。
httpObj.ResponseTextには、Webアプリからの返事が入ってくる。
例えばHTMLの生データ等。
ちなみに送るデータsendDataはVariant型でないとイケナイらしい。
個人的には少し違和感。

受け取り側では、通常のPOSTと同様に

//実績の更新
$sql = "UPDATE `result` ";
$sql .= "SET `result` = ? ";
$sql .= ", `date` = ? ";
$sql .= "WHERE `year` = " . htmlspecialchars($_POST['year']);
$sql .= " AND `month` = " . htmlspecialchars($_POST['month']);
$sql .= " AND `classid` = " . htmlspecialchars($_POST['class']);
$stmt = $dbh->prepare($sql);
$res  = $stmt->execute(array(htmlspecialchars($_POST['result']), date('Y-m-d H:i:s')));

みたいな感じ。HTMLからでもExcelからでもどちらからでも投げられる。