「Excelで列番号を英文字に変換する方法 - チキン煮込みチーズミックス4辛」は間違っていた。Excelの列を表すアルファベットは、A〜Zを使った26進数表現ではない。具体的には、次のようになっている。
桁数 | 列番号(0ベース*1) | アルファベット*2 | 場合の数 |
---|---|---|---|
1 | 0〜25 | A〜Z | 通り |
2 | 26〜701 | AA〜ZZ | 通り |
3 | 702〜18278 | AAA〜ZZZ | 通り |
また、上記のURLで紹介したアルゴリズムは、アルファベットが2桁までならば正しく計算できるようだ。アルファベットが3桁になるような列番号を入力すると、間違った値が得られる。ConvertToLetter(702)は"ZZ"で、ConvertToLetter(703)は"[A"となってしまう。
ということで、列番号を英文字に変換するVBA関数ConvertToLetter2を書いてみた。
Option Explicit Function ConvertToLetter2(iCol As Integer) As String 'Excelの列番号は1始まりなので、-1して0始まりにする ConvertToLetter2 = ConvertToLetter2_detail(iCol - 1) End Function Function ConvertToLetter2_detail(iCol As Integer) As String Dim nCases As Long Dim nCasesPrev As Long Dim i As Integer '何桁になるか調べる i = 1 nCases = 0 nCasesPrev = 0 Do While True nCasesPrev = nCases nCases = SumOfPower(1, i, 26) If iCol < nCases Then Exit Do End If i = i + 1 Loop 'i桁のアルファベットであることが確定 'i-1桁の最大値以下ではnCasesPrev通りの場合の数を表現できる Dim rest As Long rest = iCol - nCasesPrev Dim result As String result = ConvertRadix(rest) Dim act_length As Integer act_length = Len(result) 'i桁にする Dim shortage As Integer shortage = i - act_length For i = 0 To shortage - 1 result = "A" & result Next ConvertToLetter2_detail = result End Function Function SumOfPower(lowerLim As Integer, upperLim As Integer, base As Integer) As Long Dim result As Long result = 0 Dim i As Integer For i = lowerLim To upperLim Dim tmp As Long tmp = base ^ i result = result + tmp Next SumOfPower = result End Function Function ConvertRadix(n10 As Long) As String Dim result As String Dim codeA As Integer Dim radix As Integer Dim quotient As Long codeA = Asc("A") radix = 26 Dim r, q As Long quotient = n10 Do q = quotient \ radix r = quotient - (q * radix) quotient = q If q > 0 Then result = Chr(codeA + r) & result End If Loop While q > 0 result = Chr(codeA + r) & result ConvertRadix = result End Function