エクセル列番号数値変換 EXCEL ROW Alphabet presentation conv
テーマ:プログラミング
EXCELのセルの指定法は、RANGEだと「A1」つまり縦がCollumで横がRowと呼ばれる。しかしCellsプロパティだとCells(1,"A")で逆配置となる。これはCollumとRowを呼ぶ「視点」が違うことで、EXCELの代々のプログラマーでも見解が違ったことを意味すると思う。私は縦列を「Row]と呼んでいる。また下でも言及している列の番号付け(A,B......Z,AA,AB,,,)は人間の直感でわかりやすい表記法と思う。しかし、これを数値で考えたいときには、イレギュラーな26進法であり、簡単に数に直せない。横列の番号は値なのに縦はアルファベットとは、開発当時の気配りを感じえない。
私の業務ではエクセルで表を見ながらそのデータを処理する必要があるので、CSVファイルにしてテキストで処理すると効率的な場合がある。エクセル内はVBAが使えて結構便利なのだが、数百ものファイルを一括処理するのはCSVファイル(もともとその形式で登録される)がいい。
C言語でCSVテキストを処理するときは1行づつ読み込んで、エクセルの列番号に対応した配列を作らねばならない。しかしここで配列の位置を指定するときは”AA”を27としなければならない(しかも配列は0から始まるので、配列[26]となる)・・・。
簡単にアルファベット番号を数値に出来ると考えたのが間違いだった。「A」は1番目であり、「Z」は26。つまり26進法だが、Zの次は「AA」(27)となり、26までは一桁なのに、「ZZ」(702)まで二桁だ。こんなヘンタイな進法は見たことがない。幸い下に示した たかみんつ さんのブログで対照表があるが、C言語で扱うときこの表を持つのはメモリ的にもプログラマの矜持的にも不本意だ。よってなんとか自力でアルゴリズムを見つけようとした。
下が試行錯誤して作ったC言語での式だ。先人が既に作っているかと思い検索したが、見つからなかった(Githubは見ていない)のでひょっとすると、世界初のマイクロソフトのEXCEL囲い込みへの挑戦となるのかもしれない。誰かのお役に立てば幸いだ。3桁以上は検証が面倒で気力がなくなった。列「AB」なら一桁目の *word は「A」、二桁目は「B」とする。コンパイラによっては日本語の変数は使えないので注意。
char word[]="AB";
char 一桁目,二桁目;
int 桁数;// word の桁数(二桁なら2)を入れる変数
桁数=strlen(word);
switch( 桁数)
{ case 1:
result = 25 * ('A' - 'A') + (*word - 'A');
break;
case 2:
一桁目= (word);
二桁目 = ((word + 1));
result = ( 25 * (一桁目- 'A' + 1) + (一桁目- 'A' + 1) ) + (二桁目- 'A');
break;
default: printf("[VBA_alphabet_to_number]VBA縦配列の3桁には対応してません!誰か作ってね!\n");
return (0);//vba row index starts 1
break;
}
エクセル列番号対応表(たかみんつ さん) のブログ