本当にExcel VBAに慣れた方の場合、『退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング』などで有名なOpenPyXLよりも、pywin32のほうが使いやすいだろうと、感じています。
OpenPyXLの場合、Excel VBAとはまったく違うオブジェクトモデルを理解しなければ使いこなせませんが、pywin32の場合は書き方が微妙に違うもののオブジェクトモデルはExcel VBAと同じだからです。
その上で、Pythonのリストやタプルなどのデータ構造を使えるのなら、pywin32をおすすめする強い動機になると考えています。
で、最後・右端のシートを取得するために、リストのインデックスに「-1」を指定するスタイルが使えるのかを確認しました。
pywin32で最後・右端のシートを取得できるか確認したコード
以下のようなコードで、Cドライブtempフォルダーに存在するfoo.xlsxファイルの、末尾のシートを取得できるかを試しました。
xl = win32com.client.Dispatch('Excel.Application')
xl.Visible = True
sht = bk.Sheets[-1]
print(sht.Name)
サンプルコードを実行した結果
結果は残念ながらダメです。
File "C:\Users\Kiyoto ITO\AppData\Local\Programs\Python\Python37\lib\site-packages\win32com\client\dynamic.py", line 252, in __getitem__
return self._get_good_object_(self._enum_.__getitem__(index))
File "C:\Users\Kiyoto ITO\AppData\Local\Programs\Python\Python37\lib\site-packages\win32com\client\util.py", line 37, in __getitem__
return self.__GetIndex(index)
File "C:\Users\Kiyoto ITO\AppData\Local\Programs\Python\Python37\lib\site-packages\win32com\client\util.py", line 53, in __GetIndex
result = self._oleobj_.Next(1)
pywintypes.com_error: (-2147023170, 'リモート プロシージャ コールに失敗しました。', None, None)
とエラーになってしまいます。
もちろん、
sht = bk.Sheets[-1]
ではなく
sht = bk.Sheets[0]
とした場合には、ちゃんと先頭シートを取得できます。
bk.Sheetsのtype()は
Pythonのリストやタプルをtype()関数の引数に指定すれば、
<class 'list'>
<class 'tuple'>
と表示されます。
上記コードの
bk.Sheets
がどのようなデータなのかが気になり
type(bk.Sheets)
を実行したところ
<class 'win32com.client.CDispatch'>
と表示されます。残念。
最終更新日時:2020-08-20 06:23
Home » Python » pywin32・win32comの使い方 » pywin32・win32com.clientを使ってPythonのリスト方式でExcelの最後・右端のシートを取得できるのか