oopsの日記: Ruby の WIN32OLE (その2)
というか自分が CVS なり SVN なりで Ruby のソース取ってきてコンパイルすると決まって問題のある時点のものにぶち当たることが多い。運が悪いと言うか。今回のもエラー時に起きた個所の行番号が表示されないというものだった。仕方がないから、ちょっと前のソースを取ってきてコンパイル。
で、Excel から Ruby を呼び出すにはイベント経由してやるんだけど、例えば、ボタンが押されたときのイベントを記述するには、
events = WIN32OLE_EVENT.new( some_sheet.some_button, 'CommandButtonEvents' )
events.on_event('Click') do ||
print "ボタンが押されたよ\n"
end
while true
WIN32OLE_EVENT.message_loop
sleep 0.1
end
とかやればいい。ただ、GUI で Excel 操作中に Ruby の方での操作しようとするとランタイムエラーが出るので、
begin
~
rescue WIN32OLERuntimeError
~
end
とかで囲んでやる必要がある。イベント時に限定して処理を行うようにすれば、イベント中は GUI の方での操作がロックされるので、この問題は回避できる。
後、WIN32OLE_EVENT.new(OLEオブジェクト,インターフェース) とやる場合のインターフェースの文字列を探すのが面倒。Excelのヘルプとかのドキュメントには書いてないし。適当に typelib のすべてのイベントインターフェースを列挙して、それをいちいち、探したい OLE オブジェクト(ボタンとかコンボボックスとか)のWIN32OLE_EVENT.new()でエラーが出ないかどうかチェックするという感じで探した。
うちの環境だと、
Excel→AppEvents
ワークブック→WorkbookEvents
ワークシート→DocEvents
ボタン→CommandButtonEvents
コンボボックス→MdcComboEvents
というふうになった。
Ruby の WIN32OLE (その2) More ログイン