dポイントプレゼントキャンペーン実施中!

テキストを読んで既存の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;

A 回答 (5件)

コマンドライン引数は文字列として受け取るのがデフォルトなのではないでしょうか。

0を足して数値化するのが気持ち悪い場合は、

$wk_i = int($ARGV[1]);

でもいいと思います。
    • good
    • 0

間違っているかもしれませんが、参考までに。


考えられる可能性としては、第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
引数を格納した直後に、長さを確認してみて下さい。
    • good
    • 0

#1 です


ExcelのCellsプロパティでいろいろためしてみたのですが...

たとえばE3セルをあらわすのに Cells(3,5) という表現以外にCells(3,"E") という記述でもうまくいくみたいです。
どうやら Cellsは、第2パラメータの型が数値型なら列番号、文字型なら列名とみなすようで...

Cells(3,"5")という記述では"5"を数値化して5に変換する、ではなく、"5"という列名が与えられたとみなしたようで、結果エラーとなりました
    • good
    • 0

$wk_i の値が数値として認識されていないのが問題のようです。

以下のようにしたら動きました。

$wk_i = $wk_i+0;
$sheet->Cells(3,$wk_i)->{Value} = $aaa;

この回答への補足

SE-1さん
回答ありがとうございます。

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

補足日時:2007/05/30 15:29
    • good
    • 0

こんにちは。



382行目通過時点で $wk_i の値はどうなってますか
もしかして未定義ではありませんか

my $wk_i とか local $wk_i という記述がスクリプトの中にありませんか

この回答への補足

moon_piyoさん
回答していただきありがとうございます。

382行目通過時点で $wk_iの値はパラメータ通り42です。
my $wk_i や local $wk_i は記述していません。
$wk_i = $ARGV[1] を $wk_i = 42 とすると正常に処理されます。
第三パラメータも
 $wk_j = $ARGV[2]
としているのですがこちらは問題なく正常に処理されます。

なぜ第二パラメータだけがエラーになるのか不思議です。
引き続き調べてみますが、何かわかりましたらお教え下さい。
すいませんがよろしくお願いします。

補足日時:2007/05/30 09:23
    • good
    • 0

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