Home » Python » pywin32・win32comの使い方 » pywin32・win32com.clientを使ってPythonのリスト方式でExcelの最後・右端のシートを取得できるのか

pywin32・win32com.clientを使ってPythonのリスト方式でExcelの最後・右端のシートを取得できるのか

動作検証バージョン:Windows 10 + Python 3.7.3 + pywin32 224 + Excel 1907

本当にExcel VBAに慣れた方の場合、『退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング』などで有名なOpenPyXLよりも、pywin32のほうが使いやすいだろうと、感じています。

OpenPyXLの場合、Excel VBAとはまったく違うオブジェクトモデルを理解しなければ使いこなせませんが、pywin32の場合は書き方が微妙に違うもののオブジェクトモデルはExcel VBAと同じだからです。

[スポンサードリンク]

その上で、Pythonのリストやタプルなどのデータ構造を使えるのなら、pywin32をおすすめする強い動機になると考えています。

で、最後・右端のシートを取得するために、リストのインデックスに「-1」を指定するスタイルが使えるのかを確認しました。

pywin32で最後・右端のシートを取得できるか確認したコード

以下のようなコードで、Cドライブtempフォルダーに存在するfoo.xlsxファイルの、末尾のシートを取得できるかを試しました。

import win32com.client

xl = win32com.client.Dispatch('Excel.Application')
xl.Visible = True

bk = xl.Workbooks.Open(r'C:\temp\foo.xlsx')
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の最後・右端のシートを取得できるのか

「pywin32・win32comの使い方」の記事一覧

検索


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

.