Excel 表記の変換方法です。
R1C1表記 から A1表記 へ、 そして A1表記 から R1C1表記 への変換ができます。
Codeforge の 1B がこれに似た問題です。 最近は Excel での作業もそこそこあり、 たまに使いたくなることがあります。
関数・定数定義
RC_PATTERN = /\AR(\d+)C(\d+)/
ABC_PATTERN = /\A([A-Z]+)(\d+)\z/
def cv_rc(value)
v = 0
for c in value.split('')
v *= 26
v += (c.ord - 'A'.ord + 1)
end
v
end
def cv_a(value)
('A'.ord + value - 1).chr
end
def cv_ab(value)
return '' if value == 0
cv_ab((value - 1) / 26) + cv_a((value - 1) % 26 + 1)
end
def cv(pattern)
if pattern =~ RC_PATTERN
m = RC_PATTERN.match(pattern)
puts cv_ab(m[2].to_i) + m[1]
else
m = ABC_PATTERN.match(pattern)
puts 'R' + m[2] + 'C' + cv_rc(m[1]).to_s
end
end
A1表記のアルファベット部分は、 27進数のように思うかもしれませんが、 ちょっと違います。
27進数では、
A
を 0 とすると AA
= A
になりますし、
A
を 1 とすると 26 (Z
) の次が 28 (AA
) になります。
実行
cv('AS1') # R1C45
cv('R1C45') # AS1
参考
マイクロソフトがやり方を公開しています。
Excel の列番号をアルファベット順に変換する方法