win32oleで分析ツール使う方法について、その1
rubyでwin32oleを用いてexcel操作する場合に
DEC2HEXやHEX2DECにQUOTIENTやMOD等の*1関数が含まれていると
関数の計算結果が#NAME?とエラーになってしまい取得できませんw;
で、今ではアドホックで対応してたんでが
一寸問題なってきたので、ググって見れば以下のような記事が><
ほいほい、perlとwin32oleですけど同件っぽいですね^^
で、上記を参考に以下のようなコード*2で実験してみたんですが
require 'win32ole' def getAbsolutePath filename fso = WIN32OLE.new('Scripting.FileSystemObject') return fso.GetAbsolutePathName(filename) end filename = getAbsolutePath("sample.xls") xl = WIN32OLE.new('Excel.Application') xl.RegisterXLL('Analys32.xll') #=> false xl.Quit
と、"xl.RegisterXLL('Analys32.xll')"が失敗。
まあ、これは参考も失敗してるので無視するとして
#省略... filename = getAbsolutePath("sample.xls") xl = WIN32OLE.new('Excel.Application') xl.RegisterXLL(xl.LibraryPath + '\Analysis\Analys32.xll') #=> ... method_missing ... xl.Quit
と、method_missingほげほげ*3となり、
あらあら、こちらも失敗してしまいます。
どうしようw<
と書いていて、参考の最後の方をよく読むと
ただ、$Win32::OLE::Warn が 2以上だと
Win32::OLE(0.1707) error 0x80010105: "サーバーによって例外が返されました。" in METHOD/PROPERTYGET "RegisterXLL" at foo.pl line 7とか例外を吐かれてしまう。
という文面が><。
なんか、こんなエラーだった気もするw
ので、多分その2に続く
はずだったんですが、その2に続くまでもなかったので追記すりゅ><(2011/6/1)
結局、参考記事の通りで問題なかったっぽい。
昨日はxl.RegisterXLLでmethod_missingほげほげとRuntimeError出てた気がしたんですが
今日やってみると "サーバーによって例外が返されました。"でしたw;
で、そのExcelから返された例外で止まっていると
ので、一先ず例外握りつぶして対応しました><
以下サンプルコード*4
require 'win32ole' def getAbsolutePath filename fso = WIN32OLE.new('Scripting.FileSystemObject') return fso.GetAbsolutePathName(filename) end filename = getAbsolutePath("sample.xls") xl = WIN32OLE.new('Excel.Application') begin xl.RegisterXLL(xl.LibraryPath + '\Analysis\Analys32.xll') rescue => e p e #=> WIN32OLERuntimeError ... "サーバーによって例外が返されました。" ... ふがふが end xl.Visible = true xl.Workbooks.Open(filename) sheet = xl.Worksheets.Item("Sheet1") sheet.Cells.Item(1,1).Value = 255 sheet.Cells.Item(1,2).Formula = "=DEC2HEX(A1)" p sheet.Cells.Item(1,1).Value #=> 255.0 p sheet.Cells.Item(1,2).Value #=> "FF" p sheet.Cells.Item(1,1).Formula #=> "255" p sheet.Cells.Item(1,2).Formula #=> "=DEC2HEX(A1)" xl.Workbooks.Close xl.Quit