Home » Python » xlwingsの使い方 » 指定した名前のシート削除はxlwingsのほうがVBAよりシンプル

指定した名前のシート削除はxlwingsのほうがVBAよりシンプル

動作検証バージョン:Windows 11 Home + Python 3.10.6(64-bit) + xlwings 0.30.9 + 64bit Excel(バージョン2307 ビルド16626.20000 クイック実行)

Excel VBAを使って指定した名前のシートを削除するは意外と面倒なことを記事にしました。

以前から感じていたことではあったのですが、Excelを操作するPythonの外部ライブラリ「xlwings」を使うようになって、Excel VBAによるシート名を指定したシート削除の面倒さを強く感じています。

[スポンサードリンク]

xlwingsで指定した名前のワークシート削除は、Excel VBAよりもシンプルなコードで済んでしまいます。

指定した名前のシートを削除するサンプルスクリプト

以下のスクリプトを実行すると、アクティブなブックに「新規シート」という名前のワークシートがあったときに、削除されます。

import xlwings as xw

TGT_SHT = '新規シート'

bk = xw.books.active
if TGT_SHT in bk.sheet_names:
    bk.sheets[TGT_SHT].delete()

Exceel VBAで必要だったループ処理やメッセージの制御がないため、シンプルになっています。

xlwingsのほうがExcel VBAよりシンプルになる理由

Excel VBAで必要だった処理が、xlwingsの内部で行われているために、シンプルになっています。

ループ処理がない理由

v0.28.1(Oct 10, 2022)以降のxlwingsであれば、Bookオブジェクトのsheet_namesプロパティで、シート名を要素として持つリストを取得できます。

in演算子を使って、変数TGT_SHTに代入されているシート名が、シート名のリストにあるかを判定しています。

Excel VBAの場合、For Each~Nextループを使う必要がありますが、xlwingsではこのif文で済んでしまうことが、コードをシンプルにする要因になっています。

ただし実際にはxlwings内部でループ処理は行われています。
main.pyモジュールのBookクラス内で、sheet_namesプロパティは以下のように定義されています。

@property
def sheet_names(self):
    return [sheet.name for sheet in self.sheets]

DisplayAlerts制御がない理由

Excel VBAのApplication.DisplayAlertsの制御は、Sheet.delete()メソッドの中で行われているため、

_xlwindows.pyモジュール内のSheetクラスで、以下のように定義されています。

def delete(self):
    app = self.xl.Parent.Application
    alerts_state = app.DisplayAlerts
    app.DisplayAlerts = False
    self.xl.Delete()
    app.DisplayAlerts = alerts_state

Application.DisplayAlertsプロパティの制御が、Sheet.delete()メソッド内で行われているため、Excel VBAのようにマクロ作成者がApplication.DisplayAlertsを制御しなくても済んでいます。

[スポンサードリンク]

Home » Python » xlwingsの使い方 » 指定した名前のシート削除はxlwingsのほうがVBAよりシンプル

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

検索


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

.