Excel VBAを使って指定した名前のシートを削除するは意外と面倒なことを記事にしました。
以前から感じていたことではあったのですが、Excelを操作するPythonの外部ライブラリ「xlwings」を使うようになって、Excel VBAによるシート名を指定したシート削除の面倒さを強く感じています。
xlwingsで指定した名前のワークシート削除は、Excel VBAよりもシンプルなコードで済んでしまいます。
指定した名前のシートを削除するサンプルスクリプト
以下のスクリプトを実行すると、アクティブなブックに「新規シート」という名前のワークシートがあったときに、削除されます。
TGT_SHT = '新規シート'
bk = xw.books.activeif 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よりシンプル