アプリ版:「スタンプのみでお礼する」機能のリリースについて

Ruby(Win32OLE)を利用して、Excelへデータを追加していきたいのですが、Excelのある既存データの最終行がどうしても取得できません。
range("A1").END(XlDown)などを使おうとしてみたのですが、うまくいきません。
何かいい方法があれば教えてください。
よろしくお願いします。

A 回答 (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の数値を入れただけです。それ以外のこと(計算式を入れるとか、セルの書式を変えるとか)は何もしてません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
書き込みをした後、あれこれとやってみて、ターゲットのファイルを一時的な名前にリネームし、Excelで処理したあとオリジナルのファイル名で保存することが対処しました。

お礼日時:2007/02/01 13:51

#1です。

すみません、スクリプトにごみが残ってました。下の2行はいりません。
> def getAbsolutePath(filename)
> end

あと、次の行で指定しているセル番地が違ってました。データ範囲をいくつか変えて実験していたのでそのままになってました。質問文に合わせるならA2ではなくA1です。
> cell = sheet.range("A2").End(ExcelConst::XlDown)
    • good
    • 0

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 …

またデータ範囲の取得はUsedRangeを使ったほうがいい場合もあります。これについては次のページに書かれていますので参考にしてください。
http://www.happy2-island.com/excelsmile/smile03/ …

うまくいかない場合はご自分のスクリプトを補足されたほうがいいと思います。

この回答への補足

教えていただいたスクリプトでは、読み込み専用で開かれます。シートへの書き込みを行って上書き保存をしようとしたのですが、いまくいきませんでした。
いろいろ試行錯誤して、
オリジナルのファイルを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 終わり

補足日時:2007/01/17 12:40
    • good
    • 0
この回答へのお礼

masa_pee様

解決しました。どうもありがとうございました。
module ExcelConst end
WIN32OLE.const_load(xl, ExcelConst)
ここがわかっていませんでした。

お礼日時:2007/01/15 10:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!