• ベストアンサー

実行時パラメータを使用するとExcelがエラー

テキストを読んで既存のExcelに書き込む処理をしています。 実行時に「perl ruiseki2.pl 0528 42 49 200705」の様にパラメータ を指定して実行すると Win32::OLE(0.1701) error 0x800a03ec in METHOD/PROPERTYGET "Cells" at ruiseki2.pl line 382 Can't use an undefined value as a HASH reference at ruiseki2.pl line 382. の様なエラーが表示されます。 第二パラメータのみ、使用せずにプログラムで直接値をセットする と正常に処理されるのですが、パラメータの指定や使用方法に問題 があるのでしょうか?ご存知の方がいらっしゃいましたらお教え下 さい。下記がソースです。 #第二パラメータを変数にセット。ここは正常にセットされます。 $wk_i = $ARGV[1]; use Win32::OLE; eval {$ex = Win32::OLE->GetActiveObject('Excel.Application')}; die "Excel not installed" if $@; unless (defined $ex) { $ex = Win32::OLE->new('Excel.Application',sub {$_[0]->Quit;}) or die "Oops,cannot start Excel"; } $book = $ex->Workbooks->Open('C:/データ/レポートチェック'.$ARGV[3].'.xls'); $sheet = $book->Worksheets(1); ※エラー箇所(382行目) $sheet->Cells(3,$wk_i)->{Value} = $aaa; $book->SaveAs( 'C:/データ/レポートチェック'.$ARGV[3].'.xls' ); undef $book; undef $ex;

質問者が選んだベストアンサー

  • ベストアンサー
  • SE-1
  • ベストアンサー率57% (26/45)
回答No.4

コマンドライン引数は文字列として受け取るのがデフォルトなのではないでしょうか。0を足して数値化するのが気持ち悪い場合は、 $wk_i = int($ARGV[1]); でもいいと思います。

その他の回答 (4)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.5

間違っているかもしれませんが、参考までに。 考えられる可能性としては、第2引数の末尾に半角スペースとタブ以外の 非表示文字が付着しているケースがあります。非表示文字を '(x)' で表すとして、 perl ruiseki2.pl 0528 42(x) 49 200705 ..... $wk_i = $ARGV[1]; print length($wk_i), "\n"; # 長さが 2 かどうか確認する ..... $wk_i = $wk_i + 0; $sheet->Cells(3,$wk_i)->{Value} = $aaa; この場合、print 文で変数を表示しても確認することはできません。また、 変数に 0 を加算すると先頭の数値以外は切り捨てられます。このため、プ ログラムの実行がうまく行っているものと思われます。まずは、変数に第2 引数を格納した直後に、長さを確認してみて下さい。

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.3

#1 です ExcelのCellsプロパティでいろいろためしてみたのですが... たとえばE3セルをあらわすのに Cells(3,5) という表現以外にCells(3,"E") という記述でもうまくいくみたいです。 どうやら Cellsは、第2パラメータの型が数値型なら列番号、文字型なら列名とみなすようで... Cells(3,"5")という記述では"5"を数値化して5に変換する、ではなく、"5"という列名が与えられたとみなしたようで、結果エラーとなりました

  • SE-1
  • ベストアンサー率57% (26/45)
回答No.2

$wk_i の値が数値として認識されていないのが問題のようです。以下のようにしたら動きました。 $wk_i = $wk_i+0; $sheet->Cells(3,$wk_i)->{Value} = $aaa;

madamadahiyoko
質問者

補足

SE-1さん 回答ありがとうございます。 私の方でも回答していただいた通りにして実行したところ、 正常に処理されました。 ただ、なぜ数値として認識されないのかが謎です。 何かご存知でしたらお教え下さい。

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.1

こんにちは。 382行目通過時点で $wk_i の値はどうなってますか もしかして未定義ではありませんか my $wk_i とか local $wk_i という記述がスクリプトの中にありませんか

madamadahiyoko
質問者

補足

moon_piyoさん 回答していただきありがとうございます。 382行目通過時点で $wk_iの値はパラメータ通り42です。 my $wk_i や local $wk_i は記述していません。 $wk_i = $ARGV[1] を $wk_i = 42 とすると正常に処理されます。 第三パラメータも  $wk_j = $ARGV[2] としているのですがこちらは問題なく正常に処理されます。 なぜ第二パラメータだけがエラーになるのか不思議です。 引き続き調べてみますが、何かわかりましたらお教え下さい。 すいませんがよろしくお願いします。

関連するQ&A