xlwings と Python でエクセルの名前の定義からセルの値を取得

xlwingsで「名前の定義」から値を取得する操作方法です。Pythonからエクセルを操作する方です。

エクセルの名前の定義から値を取得するため、xlwingsの公式を見たのですが、値の取得のサンプルが「範囲」がシートのものしかありません。名前の「範囲」は、ブックと各シートに割り当てられるものの2種類があります。

今回使ったエクセルは下のものです。公式のように取得できる「範囲」がシートだけだと、name_sheet1とname_sheet2しか分からなくなってしまいます。

excel 名前の定義

xlwings と Python でエクセルの名前の定義からセルの値を取得

実は「範囲」がブックのものは、クラス構造から容易に想像がつきました。しかし、詳細まで知っておく必要があるので、参考になるよう調べておきました。

名前の範囲がシートの場合のセルの値の取得方法

シート内にある名前の一覧の取得

xlwings.main.Sheetのプロパティ names で、全ての名前の定義が取得できます。

import xlwings as xw

#   エクセルの非表示を設定
xw.App(visible=False)

#   既存のBOOKを開く
book = xw.Book('.\\xlwings.xlsx')

#   左から数えて2番目のシートを選択
sheet = book.sheets[1]

# type(sheet.names) class 'xlwings.main.Names' ※xlwings.main.Nameのコレクション
print(sheet.names)  # [Name 'Sheet2!name_sheet2': =Sheet2!$C$7:$D$7]
print(sheet.names.count)    # 1

セルの値の取り出し方

クラス xlwings.main.Namesの各要素に「名前の定義」のインスタンス(クラス xlwings.main.Name)があるので、そこから値を取り出します。

# type(sheet_name) class 'xlwings.main.Name'
sheet_name: xlwings.main.Name = sheet.names[0]

# シートのセルの値の取り出し
print(sheet_name.refers_to_range.value) # ['s2-c', 's2-d']

シートにある定義の値を出力するものはこのようになります。

sheet = book.sheets[1]

for sheet_name in sheet.names:
	print(sheet_name.refers_to_range.value)

クラス xlwings.main.Nameのプライオリティ一覧

このクラスが定義された名前の「範囲」の制御を行っています。

定義された名前
sheet_name.name  # Sheet2!name_sheet2
名前が参照するRangeを定義している数式 A1形式
sheet_name.refers_to # =Sheet2!$C$7:$D$7
Rangeオブジェクト
sheet_name.refers_to_range # Range [xlwings.xlsx]Sheet2!$C$7:$D$7

名前の範囲がブックの場合のセルの値の取得方法

「範囲」がブックのものは、クラス xlwings.main.Bookから取り出せます。

import xlwings as xw

#   エクセルの非表示を設定
xw.App(visible=False)

#   既存のBOOKを開く
book = xw.Book('.\\xlwings.xlsx')

# class 'xlwings.main.Names' xlwings.main.Nameのコレクション
print(book.names)   # [, , ]

ここから後の値取得は、範囲がシートのものと同じです。

for book_name in book.names:
	print(book_name.refers_to_range.value)

但し、print(book.names)によってコンソール出力されたもので分かる通り、book.namesに格納されている「名前の定義」は、ブック内の全てです。つまり、範囲がシートのものを含みます。

参考サイト

xlwingsの公式サイトです。海外の掲示板で、「範囲がブックのものはどうやってとるの?」と質問があったので、書きました。

コメント

タイトルとURLをコピーしました