• 締切済み

perlでExcelを開くと強制終了してしまう

activeperlでExcelのファイル(200ファイル位)を1ファイルずつ開いて、特定のセルの値を取得して、テキストファイルに出力をしています。 Excelファイルをオープンするときに、以下のエラーが表示されて、perlが強制終了してしまいます。 Can't call method "Worksheets" on an undefined value at hogehoge.pl line 143. 以下は問題の143行目 141 my $excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); 142 my $book = $excel->Workbooks->Open($fp); 143 my $sheet = $book->Worksheets(2); 現象としては、 Excelのファイル(200ファイル位)の特定のファイルで強制終了するわけではない。 よって、全てのファイルを正常に読み込んで終了する場合もある。 対策としては以下を実行していますが、あまり効果はないような感じです。 メモリを増強 1GB→2GB perlでExcelを処理中は他の動作をさせない(例えば、メールソフトを終了させておく) このエラーを回避する方法はあるものなのでしょうか? 完全に回避ができなくても、強制終了することなく、続行してくれるだけでも大変助かります。 以下に実行環境を記載します。 WindowsVista Business Service Pack 2 Intel Pentimum4 3GHz memory 2GB activeperl v5.10.1 Binary bulid 1006 perlでの使用モジュール use File::Find; use File::Basename; use File::Copy; use Date::Simple; use Cwd; use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; use Win32::OLE::Variant; use utf8; use Encode; use File::Copy; use File::Path; 恐れ入りますが、ご回答を宜しくお願いします。

  • swans
  • お礼率66% (2/3)
  • Perl
  • 回答数1
  • ありがとう数0

みんなの回答

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.1

>143 my $sheet = $book->Worksheets(2); エラー通り1シートしかないEXCELファイルがあるのでは。

swans
質問者

補足

ご回答いただきありがとうございます。 最初の質問のところにも記載させていただきましたが、全く同一のExcelファイル(200ファイル位)に対して、perlのスクリプトを実行した場合でも、強制終了する場合もあれば、正常にテキスト出力をして完了する場合もあります。 また、念のため、2つ目のシートが存在していることは確認しています。 なので、ご指摘のような、シートが1シートしかないということはないことをありません。 引き続き、何かエラーの特定になるような情報がございましたら、ご教授を宜しくお願いします。

関連するQ&A

  • EXCELのファイルを別ファイルに保存する

    activeperlを使って、サーバ上のexcelファイルを名前を変更して、 別ファイルに保存したいですが、いい方法はありますでしょうか? 今作成したcgiのソースは下記です。 use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; my $excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit') || die "Excelが起動できません。"; my $book = $excel->Workbooks->Open('c:\Inetpub\excel\temp.xls') || die; my $sheet = $book->Worksheets('temp') || die; $book->SaveAs('C:\Inetpub\\excel\dest.xls'); $book->Close(); よろしくお願いします。

    • ベストアンサー
    • CGI
  • perlからのexcel読み込み

    お世話になります。 win7 ActivePerl 5.16.3 Apache HTTP Server 2.0 perlからエクセルファイルを読み込むプログラムを作成しています。 ---- use Win32::OLE; use Win32::OLE::Const 'Microsoft Excel'; Win32::OLE->Option(Warn => 3); eval{ Win32::OLE->GetActiveObject('Excel.Application'); }; if($@){ die "Excelが使用できません。$@"; } unless (defined $Excel){ $Excel = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;}) or die "Excelが起動できません。"; } my $Book = $Excel->Workbooks->Open("Excelファイルのフルパス") or die Win32::OLE->LastError(); $Book->Close; $Excel->Quit(); ---- 現在は単純に、開いて、閉じるだけの状態です。 ワークシートが1つのエクセルファイルは問題ないのですが、 2つ以上ワークシートがあるエクセルファイルを開くと、$Book->Closeのところで戻ってこなくなります。(ブラウザで待機中の状態) 該当のエクセルファイルは、開いた状態です(直接エクセルで開いてみると編集のためロックされていますと出る)ので、Openは出来ているような気がします。 $Book->Closeを書かなければ下に流れていきますが、 プロセスが残ってしまいます。 ワークシートが1つのときと、複数のときで違いがあるのでしょうか?

    • ベストアンサー
    • Perl
  • ファイル名を正規表現にかける際の文字コードについて

    Windows XP, ActivePerl5.8.8 です。 windows 上にあるファイルの名前に沿ってフォルダに振り分けしたく、 以下のようなコードを書きましたが、 ファイル名に日本語の「ソ」などがある場合に 処理がおかしくなります。 文字コードの問題だと思いますが、どうすれば解決できるでしょうか。 ++++ここからソース++++++ #!c:/perl/bin/perl.exe use 5.008; use strict; use warnings; use File::Basename; use File::Copy; use File::Path; my $newdir = "C:/tmp"; for my $filename ( @ARGV ){ main($filename); print "complete.\n"; } sub main{ my ($filename) = @_; my($basename, $basedir) = fileparse($filename); my($name1, $name2, $ext) = $basename =~ /^(.*) - (.*)(\.[a-zA-Z0-9]+)$/; mkdir "${newdir}/${name1}"; File::Copy::copy( "${filename}", "${newdir}/${name1}/${basename}" ) or die "${filename} : Cannot copy"; } 1;

    • ベストアンサー
    • Perl
  • エクセルのセルからのデータ取り込み

    取り込んだセルのデータを使いたいのですが。。。 特定のセルの指定方法がわるのでしょか? ここが悪いと思ってますが、 ↓ print "$arrary[0][0]\n"; -------------------------------------------------------------- use strict; use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; $Win32::OLE::Warn = 3; # die on errors... my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); # get already active Excel # application or open new my $Book = $Excel->Workbooks->Open("C:\\DOCUMENTS\\test.xls"); # Excelのファイルをオープン my $Sheet = $Book->Worksheets(1); # ワークシート1を選択 my $array = $Sheet->Range("A8:B9")->{'Value'}; # 中身を取り出す $Book->Close; print "$arrary[0][0]\n";

  • perlの自作ライブラリについて

    perlの自作ライブラリについてお聞きしたいのですが use strict;やuse File::Copy;は、 パッケージ宣言でするものでしょうか? それとも関数内で行うものでしょうか? package aaa; sub aaafunc { use strict; use utf8; use File::Copy; use File::Basename; #簡単な設定ファイルクラス use Config::Simple; } 1:

    • ベストアンサー
    • Perl
  • Linuxでブラウザを開くスクリプトを書くには?

    WindowsでPerlからブラウザを開くスクリプトは以下の様にすれば実現できますが、Linuxの場合は、どのようにしたら良いのでしょうか? ブラウザは、Mozila5.0です。 あと、Linuxでは、use Encodingを使うとそのようなモジュールは無いと怒られます。ActivePerl特有のモジュールでしょうか?perlは共に5.8を使っています。 #use Encoding; use Win32::OLE; # オブジェクト生成。 my $ie = Win32::OLE->GetActiveObject('InternetExplorer.Application') || Win32::OLE->new('InternetExplorer.Application',sub {shift->Quit}) || die "InternetExplorer: ".Win32::OLE->LastError; $ie->{Visible} = 1; # Visibleに(見えるように)する。 # リクエストを投げてみる。 $ie->Navigate("http://www.yahoo.co.jp/"); while($ie->Busy){sleep 1; } # 待ちの秒数は適当

    • ベストアンサー
    • Perl
  • エクセルの強制終了

    解決策おしえてください。 エクセルを使用して連続処理をしているのですが、 数時間~数日で"このプログラムは不正な処理を行ったので強制終了されます。終了しない場合は、プログラムの製造元に連絡してください。"というエラーメッセージが出ます。 原因がわからないので対応できないので困っています。 教えてください。 <環境> OS :windows95(仮想マシン) excel:excel97 HD容量:2GB メモリ容量:128MB エクセルのセルに数式を入れて他のソフトと通信しています。 15秒毎にセルの値が更新される感じです。 またエクセルのマクロで30秒毎に自分自身を別のフォルダに保存しています。   手順 (1)自分自身をコピーして特定のフォルダに保存 例)copy.xls     (2)copy.xlsをオープンしてcsvファイルにして保存 例)copy.csv     (3)copy.xlsをクローズ (2)の時点でエクセルファイルは一時的に2つ開いている状態になっています。 自分自身は常に開きっぱなしで上記処理を行っています。 OS、オフィスの再インストールはできません。 よろしくお願いします。  

  • アクティブウィンドウから URL/HTML の取得

    ローカルの(WindowsXP)環境で、アクティブなエクスプローラのウィンドウから URL や HTML を、 Perl (ActivePerl) でそのプログラム中に取り込むにはどのようにしたらよいのでしょうか。LWP, Win32::OLE などウェブで調べてみましたがわかりませんでした。ご教示いただけたら嬉しいです。 調べた限りでは Win32::OLE で以下のように出来そうだったのですがうまく行きませんでした。 use Win32::OLE qw(EVENTS in with valof); my $IE = Win32::OLE->GetActiveObject('InternetExplorer.Application') || Win32::OLE->new('InternetExplorer.Application', 'Quit'); $url = $IE->{Document}->{Url}; print "URL: " . $url . "\n";

    • ベストアンサー
    • Perl
  • 初心者に救いの手を

    perlを覚えてみようと思い立ち55歳で始めて見ました。 エクセルを操作しようと思い、 use Win32::OLE; と入れるとエラーになります。それ以外のコードは動いています。 さくらインターネットのレンタルサーバーを利用していますが、何か関係ありますか? ホームページで調べてもActivePerlをインストールすれば自動的に含まれているとなっていますが?何か大きな勘違いをしているのでしょうか? よろしくお願いします。

  • PerlでMAPIについて

    WindowsのActivePerl5.6を使っています。 OutlookExpressの受信フォルダ内のメールを処理する Perlスクリプトを書こうしていますが、つまずいています。 my $Outlook = Win32::OLE->GetActiveObject('Outlook.Application') or die "なぜかエラー"; ここでエラーが発生します。 また、OutlookExpressの受信フォルダのメールのヘッダやメッセージを読む参考になるスクリプトはありますか?

    • ベストアンサー
    • Perl

専門家に質問してみよう