Home » Python » xlwingsの使い方 » xlwingsのSheets.activeでグラフシートが取得できてしまう

xlwingsのSheets.activeでグラフシートが取得できてしまう

動作検証バージョン:Windows 11 Home(64-bit)+ 64bit Excel(バージョン2302 ビルド16130.20218 キック実行)+ Python 3.10.6(64-bit) + xlwings 0.29.1

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でグラフシートが取得できてしまう

「xlwingsの使い方」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.