win32oleで分析ツール使う方法について、その1

 rubyでwin32oleを用いてexcel操作する場合に
DEC2HEXやHEX2DECにQUOTIENTやMOD等の*1関数が含まれていると
関数の計算結果が#NAME?とエラーになってしまい取得できませんw;


 で、今ではアドホックで対応してたんでが
一寸問題なってきたので、ググって見れば以下のような記事が><


わいえむねっと - 2009/03/31


 ほいほい、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

 ほい、これでアドオンが使われているExcelrubyで操作できスマッシュ><

*1:分析ツールのアドオンなどの

*2:るびまよりコピペw;

*3:詳細忘れたw;

*4:手元にコードないのでうろ覚えwww、多分動くw<