ruby-robotの夢

cygwin-ruby,qgisの達人を目指す奮闘記

ruby/CYGWIN/WIN32OLEでEXCEL制御の罠

これまで、rubyで様々なexcel制御を実施していた。
それらは、excelの指定のセルの値を書き換えるようなものばかりで、

そこそこのサイズの領域を処理しようとすると、時間がかかっていた。
そこで、「txtファイルをエクセルで読み込ませてコピーして貼り付ける。」をしようとした。
すると、openの段階でエラーが解消できずにいた。

openの仕方

初めに試したのは
bk=excel.workbooks.open(txtfile)

⇒ 失敗

次に、
bk=excel.workbooks.open({"FileName"=>txtfile,"Format"=>1})

⇒ 失敗

いろいろ調べてみると、こんなやり方も

jitte.hatenadiary.org

bk=excel.workbooks.add();st=bk.sheets(1).;st.
  qt = st.queryTables.add( 'Connection' => "TEXT;#{txtfile}",    'Destination' => st.range('A1'))
  qt.adjustColumnWidth = true
  qt.textFileTabDelimiter = true
  qt.textFileCommaDelimiter = true
  qt.textFileColumnDataTypes = Array.new(256, 2)
  qt.refresh
  qt.delete

⇒これでも、失敗
「*** buffer overflow detected ***: terminated
Aborted (コアダンプ)」

解決への道

さらに、これを検索すると、
seesaawiki.jp
という解決方法を示した記事がみつかった。助かった。ありがとう。

私の場合は、「①環境変数」が該当していた。

wso = WIN32OLE.new('WScript.Shell')
["USERPROFILE", "HOMEDRIVE", "HOMEPATH"].each{|k|wso.Environment("Process").setproperty("item", k, (["Process", "Volatile", "User", "System"].map{|t|wso.Environment(t).Item(k)} << ENV[k]).bsearch{|x|x!=""})}

をエクセル起動前に入れることで解決した。
他にも、以下の例が挙げられていた。
②既存のファイルへの SaveAs
Application.Workbook.SaveAs メソッド
既存ファイルがあると上書きして良いか確認されるが、
「いいえ」「キャンセル」を選んでも関数から戻って来ず、3 回繰り返すと Aborted (コアダンプ)する。
③ColorIndex の許容値
Application.Workbook.Worksheet.Range.Interior.ColorIndex プロパティへの代入
0..56 までは大丈夫だが 57 を代入すると Aborted (コアダンプ)する。
④最終版
最終版になっているワークブックの開きセルから値を読もうとすると Aborted (コアダンプ)する。