Symfoware

Symfowareについての考察blog

ExcelのVBAからWebアプリケーションにPOSTを実行する

Excelのマクロを使用して、データの取得を試してみました。

ExcelのVBAでJSON形式のデータを解析する
Pythonフレームワーク「Tornado」を使用し、JSON形式のデータを公開する

本来の目的は、マスタデータの保守用なので、更新が出来ないと・・・
ということで、マクロからPOSTを実行し、データの更新を行ってみます。



マクロからPOST



サンプルとして、ボタンを押したら「sample」というキーで「日本語データ」という
データをPOSTしてみます。


■ボタンクリック処理部分

Sub Update_Click()
    Call PostData("", "sample", "日本語データ")
End Sub




■通信部分

'接続するURLのベース部分を指定
Private Const TARGET_URL As String = "http://www.example.com:8888/"

Public Function CreateHttpObject() As Object
    Dim objweb As Object
    
    '各種名称でHTTPオブジェクトの生成を試みる
    Err.Clear
    Set objweb = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    If Err.Number = 0 Then
        Set CreateHttpObject = objweb
        Exit Function
    End If
    
    
    Err.Clear
    Set objweb = CreateObject("MSXML2.ServerXMLHTTP")
    If Err.Number = 0 Then
        Set CreateHttpObject = objweb
        Exit Function
    End If

    
    Err.Clear
    Set objweb = CreateObject("MSXML2.XMLHTTP")
    If Err.Number = 0 Then
        Set CreateHttpObject = objweb
        Exit Function
    End If
    
    Set CreateHttpObject = Nothing

End Function


Public Function PostData(ByVal url As String, ByVal key As String, ByRef data As String) As String

    Dim call_data As Variant
    Dim objweb As Object
    
    'XMLHTTPオブジェクトを生成
    Set objweb = CreateHttpObject()
    
    'オブジェクトの生成に失敗していれば処理終了
    If objweb Is Nothing Then
        PostData = ""
        Exit Function
    End If
    
    call_data = key & "=" & data
    
    Call objweb.Open("POST", TARGET_URL & url, False)
    Call objweb.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    Call objweb.SetRequestHeader("Content-Length", Len(call_data))
    Call objweb.Send(call_data)
    
    PostData = objweb.responseText
    
    Set objweb = Nothing
End Function




ここではまったのですが、

Call objweb.Send(call_data)



ここに渡す引数「call_data」にはStringオブジェクトを指定してはいけません。
Variantにする必要があります。

最初、Stringオブジェクトを渡していたのですが・・・


システムエラーです:&H80070057(-2147024809) パラメータが間違っています。


08_001_20100917172530.png


というエラーが表示されます。




Postを受け取るサーバープログラム



Tornadoで実装しました。
受け取ったデータをid=1のデータに上書きしています。


# -*- coding: utf-8 -*-

import os
import sqlite3
import json
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.autoreload


from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)
class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r"/", JSONHandler),
        ]
        settings = dict(
            template_path=os.path.join(os.path.dirname(__file__), "templates"),
            static_path=os.path.join(os.path.dirname(__file__), "static"),
        )
        tornado.web.Application.__init__(self, handlers, **settings)

        # Have one global connection to the blog DB across all handlers
        self.db = sqlite3.connect(r"C:\sample\test.db")


class JSONHandler(tornado.web.RequestHandler):
    @property
    def db(self):
        return self.application.db

    def post(self):
        print 'post called'
        print self.get_argument('sample')
        
        self.db.execute("update master set name = '%s' where id = 1" % (self.get_argument('sample')))
        self.db.commit()
        
        self.write("ok")

def main():
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()




Excelの更新ボタンを押した後、データの内容を確認してみると・・・

08_002_20100917172530.png


絶対文字化けすると思っていたのですが、すんなり登録できました。










関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2010/09/22(水) 12:24:12|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
前のページ 次のページ