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のオプションを開き,「[開発]タブをリボンに表示する」をチェックしておきます。<画像↓>

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であれば「困ったとき」に,だれかが助けてくれる可能性が高いと考えられるのです。