このようなテーマがあったので、挑戦してみた。
AAAの次としてAABを求める。
通常、数字は1から数えれば9の次は10で一桁繰り上がる。
同様にアルファベットでA,B,Cと数えていき、Zの次をAAとする。
例えば、10進法の100をこの方式に当てはめるとき、遠い昔に習った遣り方を思い出してみると、このような計算になる。
逆にACEを10進法で表すと、このようになる。
以上をコード化してみると、↓このようになる。
' 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加えてから、アルファベットに戻している。
AAZの次がABAになっているので、
- ZからAへの循環
- 二桁目のAからBへの繰り上がり
は共に正常動作しているようだ。
なお色々と検索してみると、26進法として「A=0」とするものが多くあった。今回は「A=1」としているため、26進法の明言を避けている。
関数名に「26」が入っているのは、ご愛敬ということで。
参考まで。