パスワードを忘れた? アカウント作成
504358 journal

oopsの日記: Ruby の WIN32OLE (その2)

日記 by oops

というか自分が 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

というふうになった。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー

読み込み中...