0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Excelの列数をアルファベットに変換する方法を丁寧に調べた

Posted at

要約

  • 「あ、こいつネットでコピーしてきたな。しかも間違ってるじゃんwww」みたいになったら嫌だなと思ったので気が済むまで考えました。
  • テストの書き方がよく分かりません。
test.py
def number_to_excelABC(n):
    excelABC = ""
    while n > 0:
        n,a =divmod(n-1,26)
        excelABC = chr(a+65) + excelABC
    return excelABC

def test_numbert_to_excelABC_function(func):
    test_list = [1,26,27,52,53,676,677,702,703,1000]
    answer_list = ["A","Z","AA","AZ","BA","YZ","ZA","ZZ","AAA","ALL"]
    compare_list = [func(t) == ans for t,ans in zip(test_list,answer_list)]
    if all(compare_list):
        print("pass the test")
    else:
        print("fail the test")
        print(test_list)
        print(answer_list)
        print(compare_list)
        
test_numbert_to_excelABC_function(number_to_excelABC)

excel10進数を考える

[1, 2, 3, 4, 5, 6, 7, 8, 9, X, 11, 12, ……, 19, 1X, 21, 22]
みたいになっている。数字の0がない代わりに10個目の数字で10を表すXが存在する。
他にも、100と101は「9X,X1」になる。110が「XX」で111が「111」になる。
つまり。。。よくわかんないってこと

気を付けなければいけないポイント

普通のn進変換とは繰り上がるタイミングが異なる

Excel26進数では26はZ、27になって初めてAAとなる
52,53も普通の26進数では20,21と表すところだが、AZ=26+26とBA=52+1のような表し方になっている(数字のゼロが無いので52+0=B0は表現できない)
商が増えるタイミングをずらすために、26で割り算をする前に1を引く。1ずらした分は文字列に変換する際に調整する

具体例

1373→AZUの変換をする

答えから考えるとA=1, Z=26, U=21なので
1373 = 1×26×26 + 26×26 + 21と分解できればOK

  1. 1を引いて26で割る→52余り20
  2. 21番目の文字Uが一桁目となる
    (以降はn=0までループ)
  3. 52-1=51は1余り25
  4. 二桁目は26文字目のZとなる
    (ループ)
  5. 1-1=0は0余り0
  6. 1番目の文字Aが3桁目となる
    商が0となったら終了

謝辞

数字のゼロを考えてくれたインドの何某さん。ありがとうございます

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?