- 締切済み
Rubyを利用してExcelへデータを追加
Ruby(Win32OLE)を利用して、Excelへデータを追加していきたいのですが、Excelのある既存データの最終行がどうしても取得できません。 range("A1").END(XlDown)などを使おうとしてみたのですが、うまくいきません。 何かいい方法があれば教えてください。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
お礼コメントを読んで既に解決済みだと思っておりました。久しぶりにチェックしたら補足が追加されていたので、もう遅いかも知れませんが少し書き足します。 > 教えていただいたスクリプトでは、読み込み専用で開かれます。 とのことですが、私のほうではこのような現象は発生しません。値を書き込んだ後、"book.save"とすれば普通に上書き保存されます。 ところで、「読み込み専用で開かれる」ということはどのように確認されたのでしょう?メッセージボックスでも表示されたんでしょうか。試しにoletest.xlsのプロパティで「読み取り専用」にチェックしてやってみたんですが、そのようなメッセージは出ませんでした("ファイルを置き換えますか"というメッセージは出た)。 ということで、現象が再現できないので今のところは原因を探ることもできません。実行環境の違いとか、ファイルの状態(内容やステータス)の違いが関係しているのかもしれません。もしまだ未解決なら、実行環境とかファイルの状態を補足していただければアドバイスできるかもしれないです。 ちなみに私のほうの環境は次のようになります。 OS: Windows 2000 Ruby: ruby 1.8.3 (2005-09-21) [i386-mswin32] Win32OLE: 上記Ruby標準添付のもの Excelファイルはスクリプトと同じ場所に置いてあります。内容はSheet1のA1:C3に1~9の数値を入れただけです。それ以外のこと(計算式を入れるとか、セルの書式を変えるとか)は何もしてません。
#1です。すみません、スクリプトにごみが残ってました。下の2行はいりません。 > def getAbsolutePath(filename) > end あと、次の行で指定しているセル番地が違ってました。データ範囲をいくつか変えて実験していたのでそのままになってました。質問文に合わせるならA2ではなくA1です。 > cell = sheet.range("A2").End(ExcelConst::XlDown)
WIN32OLEを使ってなかったんですがちょっと試してみました。とりあえず、const_loadメソッドでExcelの定数を読み込まないといけないみたいです。やってますか?やってるとしたら今回の回答は的外れになりますがご容赦ください。 以下がそのスクリプトです。 # oletest.rb require 'win32ole' def getAbsolutePath(filename) end xl = WIN32OLE.new('Excel.Application') # Excelの定数を読み込む module ExcelConst end WIN32OLE.const_load(xl, ExcelConst) fso = WIN32OLE.new('Scripting.FileSystemObject') filename = fso.GetAbsolutePathName('oletest.xls') book = xl.Workbooks.open(filename) sheet = xl.Worksheets.Item('Sheet1') cell = sheet.range("A2").End(ExcelConst::XlDown) p cell.row # これで最終行の番号がわかる book.Close xl.Quit # oletest.rb 終わり 定数の読み込みについては次のページを参考にしました。 http://www.morijp.com/masarl/homepage3.nifty.com/masarl/article/ruby-win32ole/excel-1.html またデータ範囲の取得はUsedRangeを使ったほうがいい場合もあります。これについては次のページに書かれていますので参考にしてください。 http://www.happy2-island.com/excelsmile/smile03/capter00702.shtml うまくいかない場合はご自分のスクリプトを補足されたほうがいいと思います。
お礼
masa_pee様 解決しました。どうもありがとうございました。 module ExcelConst end WIN32OLE.const_load(xl, ExcelConst) ここがわかっていませんでした。
補足
教えていただいたスクリプトでは、読み込み専用で開かれます。シートへの書き込みを行って上書き保存をしようとしたのですが、いまくいきませんでした。 いろいろ試行錯誤して、 オリジナルのファイルをhonmei.xlsとしてスクリプトの頭に File.rename("honmei.xls","oletest.xls") とし、 スクリプトの途中で、 book.saveas("honmei.xls") を入れ、 スクリプトの最後に File.delete("oletest.xls") として希望のことはできたのですが、あまりスマートではないような気がします。 他にもっとよい方法があれば教えてください。 # oletest.rb require 'win32ole' File.rename("honmei.xls","oletest.xls") xl = WIN32OLE.new('Excel.Application') # Excelの定数を読み込む module ExcelConst end WIN32OLE.const_load(xl, ExcelConst) fso = WIN32OLE.new('Scripting.FileSystemObject') filename = fso.GetAbsolutePathName('oletest.xls') book = xl.Workbooks.open(filename) sheet = xl.Worksheets.Item('Sheet1') cell = sheet.range("A2").End(ExcelConst::XlDown) p cell.row # これで最終行の番号がわかる sheet.range(cell.address).vaule="なにか書き込み" book.saveas("honmei.xls") book.Close xl.Quit File.delete("oletest.xls") # oletest.rb 終わり
お礼
ご回答ありがとうございました。 書き込みをした後、あれこれとやってみて、ターゲットのファイルを一時的な名前にリネームし、Excelで処理したあとオリジナルのファイル名で保存することが対処しました。