Excelを操作するPythonの外部ライブラリxlwingsのSheetオブジェクトは、Excel VBAのWorksheetオブジェクトに相当します。xlwingsのSheetは、ワークシートを表すオブジェクトだということです。
また、SheetオブジェクトのコレクションがSheetsです。
ですから、Bookオブジェクトのapiプロパティを使わなければxlwingsでグラフシートを参照することはなさそうなのですが、意図せずグラフシートを取得してしまう場合があり、注意喚起のため記事にしておきます。
Sheets.activeでグラフシートが取得できてしまう
Sheetsコレクションに用意されているactiveプロパティで、グラフシートが取得できてしまうときがあるのです。
拙著『VBAユーザーのためのPython超入門』でも多用している、IDLEのShellウィンドウを使って、グラフシートを取得してしまうケースを確認しましょう。
グラフシートの含まれるsamp.xlsxブックをCドライブtempフォルダーに用意しておいてから、
>>> import xlwings as xw
>>> bk = xw.Book(r'c:\temp\samp.xlsx')
を実行すると、samp.xlsxブックがExcelで開かれます。
次にExcelで、下図のようにグラフシートをアクティブな状態にして、
>>> sht = bk.sheets.active
の実行です。
この時点でエラーは発生しません。
つづいて、
>>> sht.name
を実行すると「グラフ1」と出力されます。
つまり、先に実行した「sht = bk.sheets.active」で、グラフシートが取得できていたということです。
グラフシートがアクティブなときもSheets.activeの戻り値はSheet
ここで
>>> type(sht)
を実行すると、
<class 'xlwings.main.Sheet'>
と出力されます。「bk.sheets.active」で取得できたのは、xlwingsのSheetオブジェクトだということです。
xlwingsのSheetはExcelのワークシートを表すオブジェクトですから、
>>> dir(sht)
で確認すると、
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'activate', 'api', 'autofit', 'book', 'cells', 'charts', 'clear', 'clear_contents', 'clear_formats', 'copy', 'delete', 'impl', 'index', 'name', 'names', 'page_setup', 'pictures', 'range', 'render_template', 'select', 'shapes', 'tables', 'to_html', 'to_pdf', 'used_range', 'visible']
とワークシートを表すSheetオブジェクトに用意されている属性やメソッドが出力されます。
試しに
>>> rng = sht.range("A1")
を実行してみると、エラーになります。
グラフシートがアクティブな状態でSheets.activeプロパティを実行すると、グラフシートがSheetオブジェクトとして取得できてしまうので、注意が必要です。
Sheets.activeのソースコード
Sheets.activeプロパティは、xlwings._xlwindows.pyモジュールに以下のように定義されています。
@property
def active(self):
return Sheet(self.xl.Parent.ActiveSheet)
Excel VBAのWorkbook.ActiveSheetプロパティを呼んでいるだけです。
最終更新日時:2023-04-09 04:22
Home » Python » xlwingsの使い方 » xlwingsのSheets.activeでグラフシートが取得できてしまう