作者: KAWAI,Takanori
日時: 2003/10/22(01:07)
川合孝典@Excel使い(?)です。

----- Original Message ----- 
From: <kusunoki@...-inet.or.jp>
To: <TSabc@...>
Sent: Tuesday, October 21, 2003 3:22 PM
Subject: [TSabc:324] Re: アルファベットの列番号を数値に変換


> くすのきです。
> 廣島 さまこんにちは
>
> excel2000 では A - IV まででした。
> Aを 1 として、IV = 256 ですよね。1 2 3 ... と番号を振って確認しました。
Excelの仕様として
      ワークシートのサイズ 65,536 行、256 列

と決められています。
Excel95までは行の数が32768行でしたが。

と、それだけで終わるのもなんなので...

VBScript (苦し紛れ)
'結果はMsgBoxで
Option Explicit
Function calcCol(sObj)
   Dim i
   calcCol=0
   sObj = UCase(sObj)
   For i = 1 to Len(sObj)
        calcCol = calcCol * 26 + ((Asc(Mid(sObj, i, 1)) - Asc("A")) + 1)
   Next
End Function
MsgBox "RESULT:" & calcCol("A")
MsgBox "RESULT:" & calcCol("AB")
MsgBox "RESULT:" & calcCol("EF")


PS.
ちなみにPerlのSpreadsheet::WriteExcelでは
Worksheet.pmの中のsub _cell_to_rowcol  という関数の中で
 '$cellには'A12'のようなセルの表記がはいってくるとして
   $cell =~ /\$?([A-I]?[A-Z])\$?(\d+)/;

    my $col     = $1;
    my $row     = $2;

    # Convert base26 column string to number
    # All your Base are belong to us.
    my @chars = split //, $col;
    my $expn  = 0;
    $col      = 0;

    while (@chars) {
        my $char = pop(@chars); # LS char first
        $col += (ord($char) -ord('A') +1) * (26**$expn);
        $expn++;
    }

といったことをしています。さらについでに自分でPerlで書くなら...

use strict;
use constant DIFF => ord('A') - 1;
use constant BASE => ord('Z') - ord('A') + 1;
#ちょっとオスマシ
sub calcCol($) {
    my $iCol = 0;
    map { $iCol = $iCol * BASE + (ord($_) - DIFF )}
              (split//, uc(shift(@_)));
    return $iCol;
}
#いつもの書き方に近いもの
sub calcCol2($) {
    my ($sObj) = @_;
    my $iCol = 0;
    foreach my $sWk (split//, uc($sObj)) {
        $iCol = $iCol * BASE + (ord($sWk) - DIFF);
    }
    return $iCol;
}
といったところかなと
===================================================
川合 孝典 (Hippo2000)
   DBI日本語メーリングリスト管理人、Kansai.pm所属
   kwitknr@... GCD00051@...
   http://member.nifty.ne.jp/hippo2000、http://www.hippo2000.info/
perldocの日本語情報ならperldocjp:翻訳してみませんか?
  http://perldocjp.sourceforge.jp/
===================================================