ループを使用してA→Z→AA→ZZを順繰りに指定したい

【質問】
1 → A
2 → B
...
26 → Z
27 → AA
28 → AB
といった具合に、A~Z~AA~ZZの順にループしたい。
または、数字から文字に変換したい。そのような方法はあるか。

【回答】
以下のようにすることで、実現可能です。
ASCIIコードの65が大文字の「A」、66が大文字の「B」・・・90が大文字の「Z」にあたります。
そこで、文字コードから文字に変換する関数「Chr」を使用します。
(Basic functions配下にございます)
ループが1から始まるとします。ここで、ループのインデックスを格納する変数を「var_cnt」とおくと、
%Chr(64 + var_cnt)%
のように記述することでA~Zの文字を数字から表現することが出来ます。(var_cntは1~26の間の整数をとる)

ところが、これだけでは「AA」などの列には対応できません。
そこで、英文字2桁まで対応させるには、以下のように記述します。

%If(var_cnt\27 <> 0, Chr(64 + (var_cnt -1)\26) & Chr(64 + If(var_cnt mod 26 = 0, 26, var_cnt mod 26)), Chr(64 + (var_cnt mod 27)))%

少々複雑になってしまうものの、対応は可能です。下記にて説明いたします。
1. If関数にて、var_cntを27で割ったときの商(整数部分)を求め、商が0であるか、そうでないかを判断します。
商が0である(=var_cntが26以下)であれば、var_cntを27で割った余りをそのまま文字として返します。

2. 商が1以上(=var_cntが26よりも大きい)の場合は桁上がりが発生します。26で割った際の商の値だけ桁上がりするため、
上の位の文字列は「var_cnt - 1」を26で割った際の商 + 64に該当する文字を返します。
(ここで「-1」を行っている理由として、「26」「52」のように26の倍数である場合は下1桁をZとせねばならず、桁上がりしてはならないため)
(var_cnt = 27のとき「A」を返し、var_cnt = 53のとき「B」を返す)

3. 商が1以上の場合の下の位の値を設定します。
var_cntが26で割り切れない場合は「64 + 余り」を、割り切れる場合は下1桁がZなので「64 + 26」を返します

以下、デスクトップ上に「ExcelColumns.txt」を作成し、そこに順に列名を書き出すサンプルです。

<AMVARIABLE NAME="var_cnt" VALUE="1" />
<AMLOOP FROM="1" TO="200" RESULTVARIABLE="var_cnt" />
<AMFILESYSTEM ACTIVITY="write_file" FILE="%USERPROFILE%\desktop\ExcelColumns.txt">%If(var_cnt\27 &lt;&gt; 0, Chr(64 + (var_cnt -1)\26) &amp; Chr(64 + If(var_cnt mod 26 = 0, 26, var_cnt mod 26)), Chr(64 + (var_cnt mod 27)))%</AMFILESYSTEM>
<AMLOOP ACTIVITY="end" />

Knowledge記事検索

Knowledge

News・Information