RubyでCOMを使う

はじめに

WindowsでRubyを使うなら、COMを使わないと損です。

私の理解では、COMというのは、Windows上に散らばっているオブジェクト間通信の機構です。 ExcelやIEなどのアプリケーションだけでなく、Excelの中のワークシートやセルもひとつのオブジェクトです。 COMを使うと、Rubyからこれらのオブジェクトを自由に扱うことができます。

単純な例では、ExcelのセルにRubyから文字を書き込むとか、ワークシートを操作するとかができます。 そんなのExcelのVBAでもできるじゃない、というかもしれませんが、VBの貧弱な言語仕様ではストレスたまりまくりです。 Rubyで楽しくCOMプログラミングをしましょう。

WIN32OLE

RubyでCOMを使う時には、WIN32OLEという拡張ライブラリを使います。 こんな感じで使います。

  • WIN32OLEで制御対象のCOMオブジェクトを手にいれます
  • COMオブジェクトにメソッドを作用させると、制御対象となるアプリがメソッドに応じた動作をします
  • COMオブジェクトに「あのオブジェクト頂戴」をいうメソッドを作用させれば、別のCOMオブジェクトを返してくれる。 その子COMオブジェクトにメソッドを作用させれば、またアプリがそう動く。

Rubyのスクリプトではこんな風に書きます。

以下の例は、InternetExplorerを起動して、Rubyのホームページを開き、5番目のリンクをクリックするというものです。

  # sample_01.rb
  require 'win32ole'
  ie_obj = WIN32OLE.new("InternetExplorer.Application")
  ie_obj.visible = true
  ie_obj.navigate("http://www.ruby-lang.org/")
  while ie_obj.busy == true
    sleep 0.5
  end
  link_obj = ie_obj.document.links(5)
  p link_obj.innerText
  link_obj.click
  
  • "ie_obj = WIN32OLE.new("InternetExplorer.Application")"はIEを起動し、IEにつながるCOMオブジェクトを手に入れてます。 ただし、この時点では、IEのウィンドウは不可視になってます。
  • "ie_obj.visible = true" はIEに用意されている"visible"というプロパティにTRUEを設定します。これでIEのウィンドウが 現れます。
  • ie_objはRuby内のオブジェクトだけど、これにメソッドを作用させると、COMで経由で、"visible=true"というメッセージ がIEに届いて、IEの動作が変わるというわけです。
  • ie_obj.navigate("http://www.ruby-lang.org/") というのも、COM経由でIEのNavigateメソッドを呼び出してます。 Navigateメソッドを送ると、IEは指定されたページを読み込んで表示しようしますが、表示し終わるのにある程度時間がかかります。 しかし、Ruby側では、navigateメソッドを発行すると、すぐに次の制御に移ります。
  • while ie_obj.busy == true 〜 endはIEが読み込み中の間はループで待つ処理です。busyもIEのプロパティです。
  • link_obj = ie_obj.document.links(5) はIEにdocumentオブジェクトを作用させると、IEが現在表示中の文書を示す"HTMLDocument" オブジェクトを返します。このHTMLDocumentオブジェクトにlinksメソッドを引数5で作用させると、5番目のリンクを示す"HTMLAnchorElement" オブジェクトを返します。
  • このようなメソッドはIEの動作を変えるわけではありませんが、IE内部の別のCOMオブジェクトを返してくれます。これらの メソッドで得たCOMオブジェクトにもメソッドを作用させて、IEの動作を制御することができます。
  • link_obj.clickは"HTMLAnchorElement"オブジェクトが持っているメソッドで、リンクをクリックしたのと同じ動作を行います。 具体的には、IEの画面が5番目のリンク先に切り替わります。

 


戻る