ABC+DEF=EGI

このようなテーマがあったので、挑戦してみた。

AAAの次としてAABを求める。

f:id:Infoment:20200519060604j:plain

通常、数字は1から数えれば9の次は10で一桁繰り上がる。
同様にアルファベットでA,B,Cと数えていき、Zの次をAAとする。

例えば、10進法の100をこの方式に当てはめるとき、遠い昔に習った遣り方を思い出してみると、このような計算になる。
f:id:Infoment:20200519065908p:plain

逆にACEを10進法で表すと、このようになる。
f:id:Infoment:20200519061949p:plain

以上をコード化してみると、↓このようになる。

' 10進法 ⇒ アルファベット
Function DecTo26(source As Long) As String
    ' 商
    Dim Quotient As Long
        Quotient = source
    Dim col As Collection
    Set col = New Collection
        Do
            col.Add ((Quotient - 1) Mod 26) + 1
            Quotient = WorksheetFunction.RoundDown((Quotient - 1) / 26, 0)
            If Quotient = 0 Then
                Exit Do
            ElseIf Quotient < 27 Then
                col.Add Quotient
                Exit Do
            End If
        Loop
            
    Dim i As Long
        For i = col.Count To 1 Step -1
            DecTo26 = DecTo26 & Chr(col.Item(i) + 64)
        Next
End Function

' アルファベット ⇒ 10進法
Function DecFrom26(source As String) As Long
    Static Dict As Object
        If Dict Is Nothing Then
            Set Dict = CreateObject("Scripting.Dictionary")
            Dim i As Long
                For i = 65 To 90
                    Dict(Chr(i)) = i - 64
                Next
        End If
        
        Dim iMax As Long
            iMax = Len(source)
        Dim arr() As Variant
        ReDim arr(1 To iMax)
            For i = 1 To iMax
                arr(i) = Dict(Mid(source, i, 1)) * 26 ^ (iMax - i)
            Next
            
            DecFrom26 = WorksheetFunction.Sum(arr)
End Function

試してみた。
一旦10進法に変換し1加えてから、アルファベットに戻している。
f:id:Infoment:20200519064216p:plain

AAZの次がABAになっているので、

  • ZからAへの循環
  • 二桁目のAからBへの繰り上がり

は共に正常動作しているようだ。

なお色々と検索してみると、26進法として「A=0」とするものが多くあった。今回は「A=1」としているため、26進法の明言を避けている。

関数名に「26」が入っているのは、ご愛敬ということで。

参考まで。