テキストを読んで既存の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;
No.4ベストアンサー
- 回答日時:
コマンドライン引数は文字列として受け取るのがデフォルトなのではないでしょうか。
0を足して数値化するのが気持ち悪い場合は、$wk_i = int($ARGV[1]);
でもいいと思います。
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
引数を格納した直後に、長さを確認してみて下さい。
No.3
- 回答日時:
#1 です
ExcelのCellsプロパティでいろいろためしてみたのですが...
たとえばE3セルをあらわすのに Cells(3,5) という表現以外にCells(3,"E") という記述でもうまくいくみたいです。
どうやら Cellsは、第2パラメータの型が数値型なら列番号、文字型なら列名とみなすようで...
Cells(3,"5")という記述では"5"を数値化して5に変換する、ではなく、"5"という列名が与えられたとみなしたようで、結果エラーとなりました
No.1
- 回答日時:
こんにちは。
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]
としているのですがこちらは問題なく正常に処理されます。
なぜ第二パラメータだけがエラーになるのか不思議です。
引き続き調べてみますが、何かわかりましたらお教え下さい。
すいませんがよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Perl Perlのエラーについてご教授ください。初心者です。 CGIを別サーバに移したところ、Perlのバー 5 2023/05/31 10:48
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
何時間後を求める。
-
PerlでIPアドレスを取得する方法
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
VBでグローバル変数を宣言するには
-
VBA This Workbookモジュール...
-
VBAで別モジュールへの変数の受...
-
標準モジュールを削除したい。(...
-
ユーザー定義関数に#NAME?が返...
-
エクセルVBAでシートモジュール...
-
VBSがコンパイルエラーになりま...
-
「デバイスは PRN を初期化でき...
-
Excelで時刻になったら知らせて...
-
”:”がいっぱいの文について。
-
印刷後メッセージボックスを表...
-
Excel VBAで、ユーザーフォーム...
-
"use CGI::Session"でエラーが...
-
モジュールとクラスの違いって...
-
エクセルVBA クラスモジュール...
-
Excel VBA 定義されたプロージ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
bashのgrepで複数の検索、かつ...
-
エラー
-
XML::XPathで日本語検索するには
-
実行時パラメータを使用するとE...
-
PerlからSSLのページを読み込み...
-
「CGIプログラムエラー」って何...
-
Pod::Usageで日本語を使用する...
-
$com::VDの意味がわかりません
-
perlでランダムな文字列を作りたい
-
perlスクリプト s/^\\s+//; ...
-
Perlでのルート計算で、小数点...
-
SocketでPOPサーバーから受けた...
-
何時間後を求める。
-
PerlでIPアドレスを取得する方法
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
エクセルVBAでシートモジュール...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
-
VBでグローバル変数を宣言するには
おすすめ情報