小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

Cellsメソッドの第2引数の謎

EXCELオブジェクトでCellsメソッドの第2引数は、普通、列番号を指定します。
しかし、設定に関して、なぜかエラーになったり不思議な動きをするのです。
ネットで調べてもよく分からなかったので、テストをしてみました。

テスト結果

Cellsメソッドの第二引数は、数値指定では列番号で、文字列指定では列名になるのです。
したがって、列番号を文字列で渡すとエラーになるのです。


実はコレ、Perlの常識を超えています。
Perlでは、変数中の数字の値は、数値と文字列の区別がないのです。
したがって、Perl自体が区別つかないものを、Cellsメソッドは内部で判断しているのです。
たとえば、4と'4'を区別して、後者の時はエラーとしているのです。
どうやって、エラーにしているのかは謎です(私にはわかりません)。

テストソース

#!/usr/local/bin/perl
use Win32::OLE;

    my $FilePath = 'D:\test.xls'; # ファイル名
    # EXCEL使用可能かチェック
    eval {
            Win32::OLE->GetActiveObject('Excel.Application');
    };
    if ($@) {
            die "Excelが入っていません。$@";
    }
    #EXCELオブジェクト取得
    my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
             || Win32::OLE->new('Excel.Application', 'Quit');
    my $Book = $Excel->Workbooks->Open($FilePath);
    my $Sheet = $Book->Worksheets(1);
    $row = 4;
#    $col = 4;    #列番号を数値で渡すと大丈夫
#    $col = '4';  #列番号を文字列で渡すとエラーになる
    $col = 'D';   #文字列でも列名なら大丈夫

    my $ColumnCount = $Sheet->Cells($row, $col)->value;

    print $ColumnCount;

    $Book->Close;
    $Excel->Quit();

ちなみに、第1引数(行番号)は、文字列でも数値でも大丈夫です。