質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

0回答

3057閲覧

win32comでExcel2019の架空のデータをピボットテーブルにしたいがAttributeError: xlDataBaseとエラーが出てしまいます

tomote1

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2021/07/07 05:56

編集2021/07/09 02:32

pythonからExcel2019のデータをピボットテーブルにしたい

Python から Excel を編集し、ピボットテーブルを作成する

こちらを参考にピボットテーブルにできるかどうか調べています。

発生している問題・エラーメッセージAttributeError:xlDataBase

--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-23-09a99b872c36> in <module> 21 wbs2 = wb.Sheets(wbs2_name) 22 pvt_name = 'pvt' ---> 23 pc = wb.PivotCaches().Create(SourceType:=win32c.xlDataBase, SourceData:=wbs1.UsedRange) 24 pc.CreatePivotTable(TableDestination='{sheet}!R3C1'.format(sheet=wbs2_name), TableName=pvt_name) 25 c:\py\python38\lib\site-packages\win32com\client\__init__.py in __getattr__(self, a) 178 if a in d: 179 return d[a] --> 180 raise AttributeError(a) 181 182 # And create an instance. AttributeError: xlDataBase

イメージ説明

該当のソースコード

python

1import pandas as pd 2import random 3from datetime import datetime as dt 4 5#テストデータを作成 6record = [] 7for y in range(2015, 2020): 8 for m in range(1, 13): 9 for shop in ['A', 'B', 'C']: 10 date = dt(year=y, month=m, day=1).strftime('%Y-%m-%d') 11 price = 200 + random.randint(0,100) 12 record.append([date, shop, price]) 13 14df_record = pd.DataFrame(record) 15df_record.columns = ['date', 'shop', 'price'] 16df_record['date'] = pd.to_datetime(df_record['date']) 17df_record.to_excel('test.xlsx', index=None) 18 19 20import win32com.client as win32 21import os 22win32c = win32.constants 23 24excel = win32.gencache.win32com.client.Dispatch('Excel.Application')#EnsureDispatch('Excel.Application') 25excel.Visible = True 26 27fpath = os.path.join(os.getcwd(),'test.xlsx') 28wb = excel.Workbooks.Open(fpath) 29 30## Sheet 1 指定し、フィルターを有効にする 31wbs1 = wb.Sheets('Sheet1') 32wbs1.Columns.AutoFilter(1) 33 34## ピボットテーブルの作成 35wbs2_name = 'pivot' 36wb.Sheets.Add().Name = wbs2_name 37wbs2 = wb.Sheets(wbs2_name) 38pvt_name = 'pvt' 39 40 41pc = wb.PivotCaches().Create(SourceType=win32c.xlDataBase, SourceData=wbs1.UsedRange) 42pc.CreatePivotTable(TableDestination='{sheet}!R3C1'.format(sheet=wbs2_name), TableName=pvt_name) 43 44## ピボットテーブルの設定 45wbs2.PivotTables(pvt_name).PivotFields('date').Orientation = win32c.xlRowField 46wbs2.PivotTables(pvt_name).AddDataField(wbs2.PivotTables(pvt_name).PivotFields('price'), 'Ave/price', win32c.xlAverage).NumberFormat = '0' 47wbs2.PivotTables(pvt_name).PivotFields('price').Orientation = win32c.xlPageField 48 49## 日付のグループの選択 50## Periods=(秒, 分, 時, 日, 月, 四半期, 年) 51wbs2.Cells(4, 1).Select() 52excel.Selection.Group(Start=True, End=True, Periods=(False, False, False, False, True, False, True)) 53 54## ファイルを閉じる 55wb.Close(True) 56excel.Quit() 57

試したこと

当初以下のエラーが出たため 
AttributeError: module 'win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9' has no attribute 'MinorVersion'

python-win32com excel com model started generating errors
こちらを参考にtempフォルダの生成ファイルを取り除き

合わせて
excel = win32.gencache.win32com.client.EnsureDispatch('Excel.Application')
の記述を
excel = win32.gencache.win32com.client.Dispatch('Excel.Application')に変更しました

XlPivotTableSourceType 列挙 (Excel)
MSのVBAリファレンスも参考にしたのですがxlDataBaseをXlDataBaseなど大文字に変えてみたり
=を:=にしたりしましたが変化ありませんでした。

 このようなケースをご存じの方 もしいらっしゃれば ご教授いただけますとありがたいです。

 2021/7/8 追記

 かなり古い記事ですが以下記事を見つけました。
win32comで、makepyを使って COM(AcitveX)の定数をロードさせる手順について

 AttributeError 上記xlDatabaseのみではなくxlAscendingなどの要素も呼び出せないことから
Constant定数の中身がどうなっているかを確認してみることにしました。
constants.__dicts__ だと []のみで空のリストが返されたのでなにも含まれていませんでした。

 win32com 下の client > makepy.pyでMicrosoft Excel ObjectLibraryを読み込む方法もあるようだったので
呼び出しをしてみましたが 
pywintypes.com_error: (-2147319765, '要素が見つかりません。', None, None)
と出現し進むことはかないませんでした。

 Python Programming on Win32: Chapter 12 Advanced Python and COM(O'Reilly Python 2000年版一部)11ページ目
こちらに以下のような記載を見つけたのでなんらか追加の処理をしたらよいのか・・・と思案しているのですが
今のところ良い方法が見つかっていない状況です。【入れ直しなどが必要なものなのか…】

Of course, because these constants are read from a type library, they aren't available when you
use late-bound (or dynamic dispatch) objects. In this case, you must use integer literals, rather
than named constants in your source code.
"<一部goole翻訳>もちろん、これらの定数はタイプライブラリから読み取られるため、次の、遅延バインド(または動的ディスパッチ)オブジェクトを使用する場合は使用できません。 この場合では、ソースコード内の名前付き定数よりも むしろ整数リテラルを使用する必要があります 。"

How to Use the PyIDispatch Object in Pythoncom (YouTube)

こちらも参考になるのかもしれません(エクセルオブジェクトを作成した際にCLSID情報?が.pyで自動生成されるはずですがmakepy.pyが動作できなかったため自分のところではConstantsもカラになったままのようです)

2021/7/9追記

win32com 下のclient ディレクトリから再度makepy.pyでExcelObject 以外のライブラリ(Microsoft ActiveX Data Objects 6.1 Library)をテストで呼び出してみました
すると問題なく
"Building definitions from type library...
Generating...
Importing module"と表示されgen_pyフォルダ内にも問題なく"B691E011-1797-432E-907A-4D8C69339129x0x6x1"ファイルとして反映されていることが確認できました。

 パソコン自体の問題の可能性も考え一通りwindows更新とセキュリティスキャン、ハード診断を行ったあと
再度makepy.pyよりMS Excel Objectをインポートしようとしましたが
今回も"pywintypes.com_error: (-2147319765, '要素が見つかりません。', None, None)"となり
失敗したのを確認しました。

再度同様のエラーで困っている人がいるか
"Could not locate a type library matching 'Microsoft Excel 16.0 Object Library(1.9)' makepy"
などで検索をかけたところ

下記にて
制作元へのissue がすでに二年前に発行されているものであることを確認しました。
GitHub:64ビットのOffice2016(64ビットのPythonを使用)での作業makepyは、アプリケーションオブジェクトライブラリを名前で見つけられないようです。
いまだ問題が閉じられずペンディングとなっていることが確認できました。

残念ですが今回は上記win32com の問題は解決は難しいものと考え
念のため履歴として残しておきます。
気が向きましたら製作元へissue文を投げてみるかもしれません

 ("win32comを使って"というのはあきらめて pythonから"なんらかを使用して"pivottableをエクセル上で作成するという方針に切り替えます)

補足情報(FW/ツールのバージョンなど)

windows10 (64 pro)

Excel 2019

Python 3.8

pywin32 301

Jupyter-lab 3.0.13

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問