ruby/CYGWIN/WIN32OLEでEXCEL制御の罠
これまで、rubyで様々なexcel制御を実施していた。
それらは、excelの指定のセルの値を書き換えるようなものばかりで、
そこそこのサイズの領域を処理しようとすると、時間がかかっていた。
そこで、「txtファイルをエクセルで読み込ませてコピーして貼り付ける。」をしようとした。
すると、openの段階でエラーが解消できずにいた。
openの仕方
初めに試したのは
bk=excel.workbooks.open(txtfile)
⇒ 失敗
次に、
bk=excel.workbooks.open({"FileName"=>txtfile,"Format"=>1})
⇒ 失敗
いろいろ調べてみると、こんなやり方も
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 (コアダンプ)する。