川合孝典@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/
===================================================