エクセル列のアルファベット数字変換のメモ。
Pythonのopenpyxlで遊んでいた時に、連続したセルの選択が[B1:B5]の形式でしかできないようだったので、(1,2)→B1、つまりは2→Bの変換が必要になりました。
目的
・数字を入力するとエクセル列のアルファベットを返す関数を作成する
1→A、2→B、3→C、・・・26→Z
27→AA、28→AB、29→AC、・・・52→AZ、
53→BA、・・・78→BZ、・・・702→ZZ
703→AAA、・・・1378→AZZ、
1379→BAA、・・・2054→BZZ、
2055→CAA、・・・・・・・18278→ZZZ
これぞ車輪の再発明(2018/12追記)
あ、、、あった
普通にあったでござる
ハァ━(-д-;)━ァ...
import openpyxl wb = openpyxl.Workbook() ws = wb.active ws.cell(row=1,column=1000).column # 'ALL' # ってゆーかー ws.cell(row=100,column=100).coordinate # 'CV100'
作っちまったじゃまいか。 別にいいよね、アルゴリズム遊びにだって使えるし他の言語の人もいるだろうし。。。ね?
以下、Openpyxler以外の人々へ
2桁までの場合(A列~ZZ列)
2桁の場合はMicrosoft社が変換手順を公開しています。
このURLから手順を引用したものが↓
1.列番号から 1 引いた数を 26 で割り、結果の整数値を変数 i に代入します。
2.列番号から i に 26 を掛けた数を引き、結果の整数値を変数 j に代入します。
3.整数値を対応する英文字に変換します。i および j は、それぞれ 0 ~ 9 および 1 ~ 26 の値になります。
つまり、こう。
#A列~ZZ列までの場合 def toAlpha2(num): i = int((num-1)/26) j = int(num-(i*26)) Alpha = '' for z in i,j: if z != 0: Alpha += chr(z+64) return Alpha toAlpha2(100) #'CV'
引用文中3の「それぞれ0~9」というのは、恐らくエクセル2003の最大列数256列の話だと思われ。
3桁までの場合(A列~ZZZ列)
次は実際に今のエクセルの上限となる3桁の場合。エクセルは16,384列が最大なので実際はXFD列がMAX。
コード①
#A列~ZZZ列までの場合 def toAlpha31(num): h=int((num-1-26)/(26*26)) i=int((num-1-(h*26*26))/26) j=num-(i*26)-(h*26*26) Alpha='' for k in h,i,j: if k!=0: Alpha+=chr(k+64) return Alpha toAlpha31(1000) #'ALL'
MS社が公開していた2桁パターンから拡張してことりあえず目的は達成できました。 ただホントに合ってるかと図に書いて考えてみたら、もう少しシンプルな計算ができそうだと書いてみたのが↓
コード②
#A列~ZZZ列までの場合 - その2 def toAlpha32(num): h=int((num-1-26)/(26*26)) i=int((num-1)/26)-h*26 j=num-(i*26)-(h*26*26) Alpha='' for k in h,i,j: if k!=0: Alpha+=chr(k+64) return Alpha toAlpha32(1000) #'ALL'
intが入った計算はわかりませんが、数学的には同じことを書いている気がする。
おわり