カンテラの光の下で

dNaga392's memorandom

Excelのアドレス文字をPythonで組み立てた

概要

  • xlwings のAPIが遅いので、文字列処理でアドレス文字を求めました

動機

皆さんご存知の通り、Excelにはセルのアドレスを表すA1 とか C3 ってありますよね。

これってVBAだと、RangeオブジェクトのAddressプロパティで取得できて、 xlwingsでもxlwings.Range クラスの get_address メソッドで取得できるんです。

ただ、この処理がちょっと遅い。

一回の処理に0.02~0.04秒程度かかるので、頻繁に呼び出すと急激に処理時間が増えていきます。

そこで、多少のリスクはあってもより短い時間で取得できないかと文字列処理を試みました。

コード

作成したコードは次のとおりです:

列名は、A, B, ..., Z, AA, AB, .... というように記述されるため、26進数でも27進数でもありません(A0などはない)。 そのため、桁上げのとこには少し工夫を入れてあります。

速度的には、上述の処理でほぼゼロ秒まで抑えられました(計測時間では、小数点15桁目まで表示しても0が続くほど)。

感想

コードのコメントにもある通り、xlwings でも得られます。 ではこのコードは同等の処理かというと、サポートしていない機能もあります。

  • 引数チェックがない
    • 不正な値が渡されても処理が進む
  • 最大列数/行数を超えた場合も、アドレス文字列は得られる
    • xlwings だと、上限を超えた場合は例外が送出される

とはいえ、この処理の後にxlwings.Rangeクラスを使うならば、そこでエラーが出るので大きな問題はないかなと思ってます。

スマートではないかなと思いつつも、パフォーマンスが向上できたので個人的には満足です!

参考資料