2008-05-25 Excel VBAでブログに投稿する
XML-RPCを使うとExcelやAccessからブログに記事を投稿したり,修正したりすることができます。手順をご説明します。
概要
- metaWeblog.newPostのサンプル
- ブログの操作にはXML-RPC(vbXMLRPC.dll)を使う
- Excel,Accessに対応。おそらくWordでも可
注意事項
現在のvbXMLRPC.dll(Ver.0.9.0042)は,DBCS(Double Byte Character Set)に対応していないようです。どういう意味なのかというと,日本語を含む文字列を送受信させるとエラーになります。
「それじゃだめじゃん」ということになるのですが,裏技があるのです。日本語をすべて数値文字参照(&#xxxx;という形式)に置き換えてしまえば,日本語を通すことができます。
投稿された文章は,普通のWWWブラウザであれば問題なく表示されるのですが,携帯電話では文字化けするかもしれません。また,投稿される文章の中身は「&#xxxx;」という記号の羅列です。ブログの管理画面で再編集しようとしたときに,はっきり言って読めませんので途方に暮れることになるかと思います。
これらを考慮した上で以下を読み進めてください。
準備
(1) vbXMLRPC.dllのインストール
「vbXMLRPC Binaries Download」からダウンロードのページに進んで,vbXMLRPCのバイナリをダウンロードします(発電所の画像が出てくるかもしれませんが,気にしないでください)。ZIPファイルを「c:\program files\」以下に解凍しておきましょう。
(2) 参照設定
vbXMLRPCをVBAで使うための設定です。
(i) Excelを起動し「Visual Basic Editor」を起動します。
(ii) <Excel 2007を使っていてVisual Basic Editorの起動方法が分からない場合>Excel 2007ではリボンの「開発」タブから起動することができます。「開発」タブはExcelの標準設定では表示されません。Excelのオプションを開き,「[開発]タブをリボンに表示する」をチェックしておきます。<画像↓>
(iii) Visual Basic Editorの「ツール(T)→参照設定(R)」にて,参照設定ダイアログを開きます。「参照(B)」ボタンをクリックし,vbXMLRPC.dllを選択します。
(iv) 「vbXML - Simple XML Parser」と「vbXMLRPC - XML-RPC Client」の2項目をチェックし,OKをクリックします。<画像↓>
(3) ブログの設定
以下の4点を調べておきましょう。
- APIのエンドポイント(サービスのURI)
- ブログID
- ユーザ名
- パスワード
確認の仕方はお使いのブログによって異なります。また(当然のことですが)XMLRPCに対応していないブログでは使えません。
コード
以下,metaWeblog.newPostのサンプルコードです。実行すると少し待たされます。投稿時にブログが再構築されるからだと思います。ブログの設定を変えれば挙動が変わるのかもしれません。
Public Sub newPost() Dim linsRequest As New XMLRPCRequest Dim linsResponse As XMLRPCResponse Dim linsUtility As New XMLRPCUtility Dim linsStruct As New XMLRPCStruct linsRequest.HostName = "blog.sakura.ne.jp" ' ホスト名 linsRequest.HostPort = 80 ' ポート番号 linsRequest.HostURI = "/rpc/" ' パス linsRequest.MethodName = "metaWeblog.newPost" linsRequest.params.AddString "12345678" ' ブログID linsRequest.params.AddString "example.sakura.ne.jp" ' ユーザ名 linsRequest.params.AddString "password" ' パスワード ' linsStruct.AddString "title", HTMLEntity_encode("タイトル") linsStruct.AddString "description", HTMLEntity_encode("本文") linsStruct.AddString "dateCreated", "2007-04-01T00:00:00" linsRequest.params.AddStruct linsStruct ' content linsRequest.params.AddBoolean True ' publish Set linsResponse = linsRequest.Submit If linsResponse.STATUS = XMLRPC_PARAMSRETURNED Then ' リクエストが成功すると記事IDが返ってくる Debug.Print "id=" & linsResponse.params(1).StringValue Else Select Case linsResponse.STATUS Case XMLRPC_PARAMSRETURNED Debug.Print "Unexpected response from XML-RPC request " & linsResponse.STATUS Case XMLRPC_FAULTRETURNED Debug.Print "Server returned a fault. Code is '" & linsResponse.Fault.FaultCode & "', description is '" & linsResponse.Fault.FaultString & "'." Case XMLRPC_HTTPERROR Debug.Print "HTTP error encountered. Code is '" & linsResponse.HTTPStatusCode & "', description is '"& linsUtility.GetHTTPError(linsResponse.HTTPStatusCode) & "'." Case XMLRPC_XMLPARSERERROR Debug.Print "XML Parsing Error encountered '" & linsResponse.XMLParseError & "'." Case XMLRPC_NOTINITIALISED Debug.Print "Weird, the response claims not to be initialised !!!" Case Else Debug.Print "Double Weird, unknown response status '" & linsResponse.STATUS & "'." End Select End If End Sub Public Function HTMLEntity_encode(str As String) As String Dim ret As String ret = "" Dim i As Long Dim c As String Dim charCode As Integer Dim hexCode As String For i = 1 To Len(str) c = Mid(str, i, 1) charCode = AscW(c) If charCode > 127 Then hexCode = Hex(charCode) ret = ret & "&#x" & hexCode & ";" Else ret = ret & c End If Next HTMLEntity_encode = ret End Function
メモ
- vbXMLRPCを使わない方法 ― いまのところ代替手段を発見していません。Microsoftが正規に配布しているCOMで簡単にできそうなのですが,どうも見当たらないのです。XMLRPCはすでにレガシーな規格だそうで,この先,進展があるのかどうかも不透明です
- Word 2007のブログ機能 ― Word2007にはブログの管理機能が備わっていますが,これをVBAで操作するのは不可能なようです
いずれにしても何か分かったことがあったら,お知らせします。
ExcelとAccessどちらが良いのか
ExcelとAccessのどちらを使えばよいのか悩む人がいるかもしれません。なぜなら,今回のお題はExcelとAccessのどちらからでもできるのです。
Accessではデータに項目(フィールド)とデータ型を指定できますので,データ構造が堅牢になります。操作の不手際で,変なデータになってしまう危険性を低くすることができます。また項目には名前をつけることができるので,VBAの入力補完機能を利用して項目名を入力できるという利点もあります。「できる」ことがたくさんあるというわけですね。
対してExcelですが,仕事を早く片付けたい場合や職場で複数の人と作業している場合には魅力的な選択肢でしょう。「最適」とは言えないものの, Office付きのPCであれば必ずインストールされていますので入手しやすいです。また書籍やネットで入手できる情報量は,Excelの方が多いようです。
Excelであれば「困ったとき」に,だれかが助けてくれる可能性が高いと考えられるのです。