いつも頭の中がごっちゃになるのでメモがてら。
phpexcelやVBAなどで1行ずつ処理するプログラムを書くとき、行番号、列番号をA1のような形式で表せたら便利だなーというときがたまーにある。
※VBAの場合はcellとrangeを使い分ければいいだけだけど。
Excelの列番号はA~Z、AA~AZ、BA~・・・ZZ、AAA~AAZ、という風に、26進数で表されている。
1番目=A、26(0+26)番目=Z、27(26+1)番目=AA、・・・702(26*26+26)番目=ZZ、703(26*26*26+1)番目=AAA
これをフローにすると、こうなる。nは列番号。
<ループ n=0になるまで>
↓
(n-1)÷26のあまり・・・0=A、1=B、・・・25=Z を出力
↓
(n-1)÷26の商・・・nに代入
↓
<ループ終了>
こんな感じか。これをロジックにすると、こうなる。
今回はPHPでコードを書いたので、PHPで。
[php]<?php
function getExcelAddress($row,$col) {
$sinsu = 26;
$col_val="";
while($col>0) {
$intval = (($col-1) % $sinsu);
$col_val=chr($intval+65).$col_val;
$col=intval(($col-1) / $sinsu);
}
return $col_val.$row;
}
echo getExcelAddress(1,26); // Z1
echo getExcelAddress(1,27); // AA1
echo getExcelAddress(1,702); // ZZ1
echo getExcelAddress(1,703); // AAA1
?>[/php]