Excelで列番号を英文字に変換する方法

Excelで列番号を英文字に変換する方法 - チキン煮込みチーズミックス4辛」は間違っていた。Excelの列を表すアルファベットは、A〜Zを使った26進数表現ではない。具体的には、次のようになっている。

桁数 列番号(0ベース*1 アルファベット*2 場合の数
1 0〜25 A〜Z 26^1通り
2 26〜701 AA〜ZZ 26^2通り
3 702〜18278 AAA〜ZZZ 26^3通り

また、上記の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

Excel VBAの記事続いてるな...

*1:つまり、COLUMN関数で得られる値よりも1だけ小さい。

*2:ただし、自分が使用しているExcel2007ではXFD列までしか利用できない。