名前定義された範囲の利用
xlwingsでExcelファイルを読み書きする時(特に読む時)には、対象範囲に名前を定義し、その名前でアクセスした方が良い。
こうすることで、python側から$A$1などとセルアドレスを指定する必要が無くなる。また、Excel側で行や列の追加・削除やシート名の変更をしても問題無い状態となる。
なお、名前定義をExcel上だけで行うなら、ここで書いている事項は無関係だが、知識として知っていても良いことだろう。
仕様に書かれていない理由
ここで書くことは、xlwingsの公式ドキュメントに書かれておらず、知らないとうまく使えないことなんだが、これはxlwings側の問題ではない。
Excelの名前定義について、いつのまにか仕様が拡張され、参照範囲に指定するものが、セル範囲ではなく、数式になったためだ。
公式ドキュメント中の説明
xlwingsのNamesクラスのaddメソッドの説明は以下となっている。
add(name, refers_to)
セル範囲に新しい名前を定義します。パラメータ
name (str) -- 名前として使う文字列を指定します。名前にスペースを含めることはできません。またセルを参照することもできません。refers_to (str) -- A1形式で名前の参照先を指定します。
書かれていない仕様
問題は、refers_to
の指定の仕方です。上記とおりに、'A1'
などを指定すると、まともに動きません。
対処方法
-
refers_to
に指定するstrの先頭に=
をつける。
上述のように現状では、参照範囲に指定するものは数式ですので、=
が必要です。
無いと、Excel側で文字列を渡したかったと解釈し、指定したセルアドレスを文字列とした文字列定数が定義されてしまいます。
-
refers_to
に指定するセルアドレスは、$A$1
の様に絶対参照形式とする。
これはExcel上で実行した場合も同じなのですが、行または列、あるいは行と列が相対参照となっているセルアドレス(例:A1、\$A1、A\$1)を指定した場合、名前定義を実行する際のアクティブセルを基準として実際に参照されるセルのアドレスが決まります。このため、大抵の状況では意図しないセルアドレスを参照する名前が定義されてしまう。