Skip to content

Instantly share code, notes, and snippets.

@feo52
Last active May 5, 2024 02:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save feo52/e538a8134112d98166f0cc1ee81f6561 to your computer and use it in GitHub Desktop.
Save feo52/e538a8134112d98166f0cc1ee81f6561 to your computer and use it in GitHub Desktop.
Python pywin32(win32com) : Excel Pivot Table
ID Meta Type Name Date Count
21 hoge 2220 nico 2020/2/22 1
22 fuga 2220 nico 2021/2/22 2
23 piyo 2220 nico 2022/2/22 3
24 hoge 2221 nuko 2020/2/22 4
25 fuga 2221 nuko 2021/2/22 5
26 piyo 2221 nuko 2022/2/22 6
27 hoge 2222 neko 2020/2/22 7
28 fuga 2222 neko 2021/2/22 8
29 piyo 2222 neko 2022/2/22 9
# coding:utf-8
import os
import win32com.client
import win32con
import win32gui
def main():
# ------------------------------------------------------------------
# Excelの定数の設定
# ------------------------------------------------------------------
# https://docs.microsoft.com/en-us/office/vba/api/excel(enumerations)
# https://docs.microsoft.com/ja-jp/office/vba/api/excel(enumerations)
# ------------------------------------------------------------------
# Excelの定数を取得する方法もあるようです。
# https://stackoverflow.com/questions/28264548/
# https://stackoverflow.com/questions/75154736/
# https://stackoverflow.com/questions/50127959/
# https://stackoverflow.com/questions/48257308/
# https://wacky.hatenadiary.com/entry/20091011/1255240572
# win32com.client.gencache.EnsureDispatch("Excel.Application")
# ------------------------------------------------------------------
# Excel Enum XlFindLookIn
# ------------------------------------------------------------------
xlComments = -4144
xlCommentsThreaded = -4184
xlFormulas = -4123
xlValues = -4163
# ------------------------------------------------------------------
# Excel Enum XlLookAt
# ------------------------------------------------------------------
xlPart = 2
xlWhole = 1
# ------------------------------------------------------------------
# Excel Enum XlReferenceStyle
# ------------------------------------------------------------------
xlA1 = 1
xlR1C1 = -4150
# ------------------------------------------------------------------
# Excel Enum XlReferenceType
# ------------------------------------------------------------------
xlAbsolute = 1
xlAbsRowRelColumn = 2
xlRelRowAbsColumn = 3
xlRelative = 4
# ------------------------------------------------------------------
# Excel Enum XlSearchDirection
# ------------------------------------------------------------------
xlNext = 1
xlPrevious = 2
# ------------------------------------------------------------------
# Excel Enum XlSearchOrder
# ------------------------------------------------------------------
xlByColumns = 2
xlByRows = 1
# ------------------------------------------------------------------
# Excel Enum XlConsolidationFunction
# ------------------------------------------------------------------
xlAverage = -4106
xlCount = -4112
xlCountNums = -4113
xlDistinctCount = 11
xlMax = -4136
xlMin = -4139
xlProduct = -4149
xlStDev = -4155
xlStDevP = -4156
xlSum = -4157
xlUnknown = 1000
xlVar = -4164
xlVarP = -4165
# ------------------------------------------------------------------
# Excel Enum XlLayoutRowType
# ------------------------------------------------------------------
xlCompactRow = 0
xlOutlineRow = 2
xlTabularRow = 1
# ------------------------------------------------------------------
# Excel Enum XlPivotFieldOrientation
# ------------------------------------------------------------------
xlColumnField = 2
xlDataField = 4
xlHidden = 0
xlPageField = 3
xlRowField = 1
# ------------------------------------------------------------------
# Excel Enum XlPivotFieldRepeatLabels
# ------------------------------------------------------------------
xlDoNotRepeatLabels = 1
xlRepeatLabels = 2
# ------------------------------------------------------------------
# Excel Enum XlPivotTableMissingItems
# ------------------------------------------------------------------
xlMissingItemsDefault = -1
xlMissingItemsMax = 32500
xlMissingItemsMax2 = 1048576
xlMissingItemsNone = 0
# ------------------------------------------------------------------
# Excel Enum XlPivotTableSourceType
# ------------------------------------------------------------------
xlConsolidation = 3
xlDatabase = 1
xlExternal = 2
xlPivotTable = -4148
xlScenario = 4
# ------------------------------------------------------------------
# Excel Enum XlSlicerCacheType
# ------------------------------------------------------------------
xlSlicer = 1
xlTimeline = 2
# ------------------------------------------------------------------
# Excel Enum XlSlicerSort
# ------------------------------------------------------------------
xlSlicerSortAscending = 2
xlSlicerSortDataSourceOrder = 1
xlSlicerSortDescending = 3
# ------------------------------------------------------------------
# Excel Enum XlSortOrder
# ------------------------------------------------------------------
xlAscending = 1
xlDescending = 2
xlManual = -4135
# ------------------------------------------------------------------
# Excel Enum XlTimelineLevel
# ------------------------------------------------------------------
xlTimelineLevelYears = 0
xlTimelineLevelQuarters = 1
xlTimelineLevelMonths = 2
xlTimelineLevelDays = 3
# ------------------------------------------------------------------
# Excel Enum XlPivotFilterType
# ------------------------------------------------------------------
xlBefore = 31
xlBeforeOrEqualTo = 32
xlAfter = 33
xlAfterOrEqualTo = 34
xlAllDatesInPeriodJanuary = 57
xlAllDatesInPeriodFebruary = 58
xlAllDatesInPeriodMarch = 59
xlAllDatesInPeriodApril = 60
xlAllDatesInPeriodMay = 61
xlAllDatesInPeriodJune = 62
xlAllDatesInPeriodJuly = 63
xlAllDatesInPeriodAugust = 64
xlAllDatesInPeriodSeptember = 65
xlAllDatesInPeriodOctober = 66
xlAllDatesInPeriodNovember = 67
xlAllDatesInPeriodDecember = 68
xlAllDatesInPeriodQuarter1 = 53
xlAllDatesInPeriodQuarter2 = 54
xlAllDatesInPeriodQuarter3 = 55
xlAllDatesInPeriodQuarter4 = 56
xlBottomCount = 2
xlBottomPercent = 4
xlBottomSum = 6
xlCaptionBeginsWith = 17
xlCaptionContains = 21
xlCaptionDoesNotBeginWith = 18
xlCaptionDoesNotContain = 22
xlCaptionDoesNotEndWith = 20
xlCaptionDoesNotEqual = 16
xlCaptionEndsWith = 19
xlCaptionEquals = 15
xlCaptionIsBetween = 27
xlCaptionIsGreaterThan = 23
xlCaptionIsGreaterThanOrEqualTo = 24
xlCaptionIsLessThan = 25
xlCaptionIsLessThanOrEqualTo = 26
xlCaptionIsNotBetween = 28
xlDateBetween = 35
xlDateLastMonth = 45
xlDateLastQuarter = 48
xlDateLastWeek = 42
xlDateLastYear = 51
xlDateNextMonth = 43
xlDateNextQuarter = 46
xlDateNextWeek = 40
xlDateNextYear = 49
xlDateThisMonth = 44
xlDateThisQuarter = 47
xlDateThisWeek = 41
xlDateThisYear = 50
xlDateToday = 38
xlDateTomorrow = 37
xlDateYesterday = 39
xlNotSpecificDate = 30
xlSpecificDate = 29
xlTopCount = 1
xlTopPercent = 3
xlTopSum = 5
xlValueDoesNotEqual = 8
xlValueEquals = 7
xlValueIsBetween = 13
xlValueIsGreaterThan = 9
xlValueIsGreaterThanOrEqualTo = 10
xlValueIsLessThan = 11
xlValueIsLessThanOrEqualTo = 12
xlValueIsNotBetween = 14
xlYearToDate = 52
# ------------------------------------------------------------------
# Excel起動
xlApp = win32com.client.Dispatch("Excel.Application")
# ExcelのWindow最大化
win32gui.ShowWindow(xlApp.hwnd, win32con.SW_MAXIMIZE)
# Excel表示
xlApp.Visible = 1
# Excelファイルオープン
wb = xlApp.Workbooks.Open(f"{os.getcwd()}\\sample.csv")
# Excelシートオブジェクト
ws = wb.Worksheets(1)
# ------------------------------------------------------------------
# 指定したシートを選択
ws.Activate()
# シートの追加
ws = ws.Parent.Worksheets.Add()
# 指定したシートを選択
ws.Activate()
# ------------------------------------------------------------------
# ピボットテーブルの作成
# ------------------------------------------------------------------
# ピボットテーブルのキャッシュの作成
pcache = wb.PivotCaches().Create(SourceType=xlDatabase, SourceData="sample!A:F")
# ピボットテーブルの作成
ptable = pcache.CreatePivotTable(TableDestination=ws.Range("A1"), TableName="ピボットテーブル1")
# ピボットテーブルに集計フィールドを挿入
ptable.CalculatedFields().Add(Name="Twice", Formula="=Count*2")
# ------------------------------------------------------------------
# ピボットテーブルのフィールド
# ------------------------------------------------------------------
# ピボットテーブルのフィルターの設定
ptable.PivotFields("ID").Orientation = xlPageField
# ピボットテーブルのフィルターの設定
ptable.PivotFields("Meta").Orientation = xlPageField
# ピボットテーブルのフィルターの位置の設定
ptable.PivotFields("Meta").Position = 1
# ピボットテーブルのフィールドの行の設定
ptable.PivotFields("Type").Orientation = xlRowField
# ピボットテーブルのフィールドの行の設定
ptable.PivotFields("Name").Orientation = xlRowField
# ピボットテーブルのフィールドの列の設定
ptable.PivotFields("Date").Orientation = xlColumnField
# ピボットテーブルのCountを合計
pfield1 = ptable.AddDataField(Field=ptable.PivotFields("Count"), Caption="SumCount", Function=xlSum)
# ピボットテーブルのTwiceを合計
pfield2 = ptable.AddDataField(Field=ptable.PivotFields("Twice"), Caption="SumTwice", Function=xlSum)
# ------------------------------------------------------------------
# ピボットテーブルのレイアウトとオプションの設定
# ------------------------------------------------------------------
# ピボットテーブルのレイアウト:表形式で表示
ptable.RowAxisLayout(RowLayout=xlTabularRow)
# ピボットテーブルのレイアウト:アイテムのラベルをすべて繰り返す
ptable.RepeatAllLabels(Repeat=xlRepeatLabels)
# ピボットテーブルのオプション:データソースから削除されたアイテムを保持しない
# ptable(PivotTable)ではなくpcache(PivotCache)のプロパティであることに注意
pcache.MissingItemsLimit = xlMissingItemsNone
# ピボットテーブルのオプション:更新時に列幅を自動調整しない
ptable.HasAutoFormat = False
# ピボットテーブルのオプション:更新時にセル書式を保持しない
ptable.PreserveFormatting = False
# ピボットテーブルのオプション:ファイルに元のデータを保持しない
ptable.SaveData = False
# ピボットテーブルのオプション:詳細を表示可能にしない
ptable.EnableDrilldown = False
# ピボットテーブルのオプション:行の総計を表示しない
ptable.RowGrand = False
# ピボットテーブルのオプション:列の総計を表示しない
ptable.ColumnGrand = False
# ------------------------------------------------------------------
# ピボットテーブルの設定
# ------------------------------------------------------------------
# ピボットテーブルの小計を非表示
ptable.PivotFields("Type").Subtotals = tuple(False for _ in range(12))
ptable.PivotFields("Name").Subtotals = tuple(False for _ in range(12))
ptable.PivotFields("Date").Subtotals = tuple(False for _ in range(12))
# ピボットテーブルのIDの単一のアイテムを設定
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").CurrentPage = "(All)"
ptable.PivotFields("ID").CurrentPage = "(blank)"
ptable.PivotFields("ID").CurrentPage = 21
ptable.PivotFields("ID").CurrentPage = 22
ptable.PivotFields("ID").CurrentPage = 23
# ピボットテーブルのIDの複数のアイテムを設定
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").EnableMultiplePageItems = True
ptable.PivotFields("ID").PivotItems("21").Visible = True
ptable.PivotFields("ID").PivotItems("22").Visible = True
ptable.PivotFields("ID").PivotItems("23").Visible = True
ptable.PivotFields("ID").PivotItems("24").Visible = False
ptable.PivotFields("ID").PivotItems("25").Visible = False
ptable.PivotFields("ID").PivotItems("26").Visible = False
ptable.PivotFields("ID").PivotItems("27").Visible = False
ptable.PivotFields("ID").PivotItems("28").Visible = False
ptable.PivotFields("ID").PivotItems("29").Visible = False
ptable.PivotFields("ID").PivotItems("(blank)").Visible = False
# ピボットテーブルのIDの複数のアイテムを設定
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").EnableMultiplePageItems = True
# 全てのPivotItemのVisibleをFalseにするとエラーになるので、
# ひとまずは空欄以外の全てのPivotItemのVisibleをFalseする。
for pi in ptable.PivotFields("ID").PivotItems():
pi.Visible = False if pi.Name != "(blank)" else True
# 必要なPivotItemのVisibleをTrueにする。
ptable.PivotFields("ID").PivotItems("21").Visible = True
ptable.PivotFields("ID").PivotItems("22").Visible = True
ptable.PivotFields("ID").PivotItems("23").Visible = True
# 空欄のPivotItemが不要であれば空欄のPivotItemのVisibleをFalseにする。
ptable.PivotFields("ID").PivotItems("(blank)").Visible = False
# ------------------------------------------------------------------
# ピボットテーブルの設定
# ------------------------------------------------------------------
# ピボットテーブルのIDの複数のアイテムを設定
# 指定のItemはTrue/指定以外のItemはFalse
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").EnableMultiplePageItems = True
for pi in ptable.PivotFields("ID").PivotItems():
pi.Visible = pi.Name in ["21", "22", "23", "29", "(blank)"]
# ピボットテーブルのIDの複数のアイテムを設定
# 指定のItemはFalse/指定以外のItemはTrue
# TrueになるItemが0個になってしまうとError
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").EnableMultiplePageItems = True
for pi in ptable.PivotFields("ID").PivotItems():
pi.Visible = pi.Name not in ["21", "22", "23", "29", "(blank)"]
# ピボットテーブルのIDの複数のアイテムを設定
# 指定のItemはTrue/指定以外のItemは変更しない
# ptable.PivotFields("ID").ClearAllFilters()
# ptable.PivotFields("ID").EnableMultiplePageItems = True
for pi in ptable.PivotFields("ID").PivotItems():
if pi.Name in ["21", "22"]:
pi.Visible = True
# ピボットテーブルのIDの複数のアイテムを設定
# 指定のItemはFalse/指定以外のItemは変更しない
# TrueになるItemが0個になってしまうとError
# ptable.PivotFields("ID").ClearAllFilters()
# ptable.PivotFields("ID").EnableMultiplePageItems = True
for pi in ptable.PivotFields("ID").PivotItems():
if pi.Name in ["25", "26"]:
pi.Visible = False
# ------------------------------------------------------------------
# ピボットテーブルの設定
# ------------------------------------------------------------------
# 上記までの処理方法は
# ピボットテーブルがループ毎に更新されかねない為
# Item数やData量が多い場合は処理に時間が掛かる…
# コンソールに進捗を出力して気を紛らす場合は以下
# ピボットテーブルのIDの複数のアイテムを設定
# 指定のItemはTrue/指定以外のItemはFalse
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").EnableMultiplePageItems = True
for i, pi in enumerate(lst := ptable.PivotFields("ID").PivotItems()):
pi.Visible = pi.Name in ["21", "22", "23", "29", "(blank)"]
print(f"{i+1:04}/{len(lst):04}")
# ピボットテーブルのIDの複数のアイテムを設定
# 指定のItemはFalse/指定以外のItemはTrue
# TrueになるItemが0個になってしまうとError
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").EnableMultiplePageItems = True
for i, pi in enumerate(lst := ptable.PivotFields("ID").PivotItems()):
pi.Visible = pi.Name not in ["21", "22", "23", "29", "(blank)"]
print(f"{i+1:04}/{len(lst):04}")
# ピボットテーブルのIDの複数のアイテムを設定
# 指定のItemはTrue/指定以外のItemは変更しない
# ptable.PivotFields("ID").ClearAllFilters()
# ptable.PivotFields("ID").EnableMultiplePageItems = True
for i, pi in enumerate(lst := ptable.PivotFields("ID").PivotItems()):
if pi.Name in ["21", "22"]:
pi.Visible = True
print(f"{i+1:04}/{len(lst):04}")
# ピボットテーブルのIDの複数のアイテムを設定
# 指定のItemはFalse/指定以外のItemは変更しない
# TrueになるItemが0個になってしまうとError
# ptable.PivotFields("ID").ClearAllFilters()
# ptable.PivotFields("ID").EnableMultiplePageItems = True
for i, pi in enumerate(lst := ptable.PivotFields("ID").PivotItems()):
if pi.Name in ["25", "26"]:
pi.Visible = False
print(f"{i+1:04}/{len(lst):04}")
# ピボットテーブルのIDのフィルターの解除
ptable.PivotFields("ID").ClearAllFilters()
# ------------------------------------------------------------------
# ピボットテーブルの設定とデータソースの変更
# ------------------------------------------------------------------
# 上記までの処理方法は
# ピボットテーブルがループ毎に更新されかねない為
# Item数やData量が多い場合は処理に時間が掛かる…
# ピボットテーブルのみの解決方法が思い付かない為
# データソースにヘルパー列を追加して対応する方法
def PivotFieldSetVisibleItemsListWithDynamicArrayFormula(pf, visible, primary=None, prefix="", suffix="Visible"):
pt = pf.Parent
pc = pt.PivotCache()
ws = pt.Parent
wb = ws.Parent
ap = ws.Application
sd = ap.ConvertFormula(pc.SourceData, xlR1C1, xlA1, xlRelative)
rg = ap.Evaluate(sd)
SourceDataRange = rg
# 数式を作成
rg = SourceDataRange
rg = rg.find(pf.Name, rg.GetResize(1, 1), xlValues, xlWhole, xlByRows, xlNext, True)
rg = rg.EntireColumn
covered = rg.GetAddress(False, False)
rg = SourceDataRange
rg = rg.GetResize(1, 1)
rg = rg.EntireColumn
primary = primary or rg.GetAddress(False, False)
formula = f'=SWITCH(FILTER({covered},NOT(ISBLANK({primary}))),"{pf.Name}","{prefix}{pf.Name}{suffix}",'
formula += "".join([(f"{v},1," if type(v) is not str else f'"{v}",1,') for v in visible])
formula += "0)"
# 数式を入力
rg = SourceDataRange
cc = rg.Columns.Count
rg = rg.GetResize(1, 1)
rg = rg.GetOffset(0, cc)
rg.Formula2 = formula
# ピボットテーブルのキャッシュを変更
rg = SourceDataRange
rc = rg.Rows.Count
cc = rg.Columns.Count
rg = rg.GetResize(rc, cc + 1)
pc = wb.PivotCaches().Create(SourceType=xlDatabase, SourceData=rg)
pt.ChangePivotCache(pc)
# ピボットテーブルのフィルターを追加
pt.PivotFields(f"{prefix}{pf.Name}{suffix}").Orientation = xlPageField
pt.PivotFields(f"{prefix}{pf.Name}{suffix}").Position = 1
# ピボットテーブルのフィルターを設定
pt.PivotFields(f"{prefix}{pf.Name}{suffix}").ClearAllFilters()
pt.PivotFields(f"{prefix}{pf.Name}{suffix}").CurrentPage = 1
return pt, pt.PivotCache()
# データソースにヘルパー列として動的配列数式追加
# ピボットテーブルのフィルターを動的配列数式の結果が1で表示
# 指定のItemは1/指定以外のItemは0
# 指定のItemに(blank)の指定は不可
# 動的配列数式動作環境Excel2021~
pf = ptable.PivotFields("ID")
visible = [21, 22, 23, 29]
# primary = "A:A" # データソースの空欄の無い列を指定。省略すると一番左側の列を使用。
# ptable, pcache = PivotFieldSetVisibleItemsListWithDynamicArrayFormula(pf, visible, primary)
ptable, pcache = PivotFieldSetVisibleItemsListWithDynamicArrayFormula(pf, visible)
ptable.PivotFields("IDVisible").Position = 2
# ピボットテーブルのフィルターを解除
ptable.PivotFields("IDVisible").ClearAllFilters()
# データソースにヘルパー列として動的配列数式追加
# ピボットテーブルのフィルターを動的配列数式の結果が1で表示
# 指定のItemは1/指定以外のItemは0
# 指定のItemに(blank)の指定は不可
# 動的配列数式動作環境Excel2021~
pf = ptable.PivotFields("Meta")
visible = ["hoge", "piyo"]
# primary = "A:A" # データソースの空欄の無い列を指定。省略すると一番左側の列を使用。
# ptable, pcache = PivotFieldSetVisibleItemsListWithDynamicArrayFormula(pf, visible, primary)
ptable, pcache = PivotFieldSetVisibleItemsListWithDynamicArrayFormula(pf, visible)
# ピボットテーブルのフィルターを解除
ptable.PivotFields("MetaVisible").ClearAllFilters()
# ------------------------------------------------------------------
# ピボットテーブルの設定
# ------------------------------------------------------------------
# ピボットテーブルのTypeの順序を昇順に設定
ptable.PivotFields("Type").AutoSort(Order=xlAscending, Field="Type")
# ピボットテーブルのTypeを0より大きいに設定
ptable.PivotFields("Type").PivotFilters.Add2(Type=xlCaptionIsGreaterThan, DataField=None, Value1=0)
# ピボットテーブルのTypeを合計が10より大きいに設定
ptable.PivotFields("Type").PivotFilters.Add2(Type=xlValueIsGreaterThan, DataField=ptable.PivotFields("SumCount"), Value1=10)
# ピボットテーブルのTypeの2222を含まないよう設定
ptable.PivotFields("Type").PivotItems("2222").Visible = False
# ピボットテーブルのTypeのフィルターの解除
ptable.PivotFields("Type").ClearAllFilters()
# ------------------------------------------------------------------
# ピボットテーブルの設定
# ------------------------------------------------------------------
# ピボットテーブルのDateの期間を設定
ptable.PivotFields("Date").PivotFilters.Add2(Type=xlDateBetween, DataField=None, Value1="1900/1/1", Value2="3000/1/1")
# ピボットテーブルのDateに自動的にグループ化を設定
ptable.PivotFields("Date").AutoGroup()
# ピボットテーブルのDateのグループ解除
drange = ptable.PivotFields("Date").DataRange
drange.Cells(1, 1).Ungroup()
# ピボットテーブルのDateに年と月のグループ化を設定
drange = ptable.PivotFields("Date").DataRange
drange.Cells(1, 1).Group(Start=True, End=True, By=None, Periods=tuple([False, False, False, False, True, False, True]))
# ピボットテーブルのDateの年の小計を非表示
ptable.PivotFields("年 (Date)").Subtotals = tuple(False for _ in range(12))
# ピボットテーブルのDateの年を非表示
ptable.PivotFields("年 (Date)").Orientation = xlHidden
# ピボットテーブルのDateのグループ解除
drange.Cells(1, 1).Ungroup()
# ------------------------------------------------------------------
# ピボットテーブルのスライサー
# ------------------------------------------------------------------
# ピボットテーブルのスライサーのキャッシュの作成
scache1 = wb.SlicerCaches.Add2(Source=ptable, SourceField="Type")
# ピボットテーブルのスライサーの作成
slicer1 = scache1.Slicers.Add(SlicerDestination=ws)
# ピボットテーブルのスライサーのキャッシュのフィルターの解除
scache1.ClearAllFilters()
# ピボットテーブルのスライサーのキャッシュの設定
scache1.SlicerItems("2222").Selected = False
# ピボットテーブルのスライサーの順序を昇順に設定
scache1.SortItems = xlSlicerSortAscending
# ピボットテーブルのスライサーの各種設定
slicer1.Name = "Type"
slicer1.Caption = "Type"
# ピボットテーブルのスライサーの位置設定
slicer1.Top = 0
slicer1.Left = 500
slicer1.Width = 100
slicer1.Height = 100
# ピボットテーブルのスライサーの位置設定
slicer1.Top = ws.Range("A20").Top
slicer1.Left = ws.Range("A20").Left
slicer1.Width = ws.Range("D30").Left - ws.Range("A20").Left
slicer1.Height = ws.Range("D30").Top - ws.Range("A20").Top
# ------------------------------------------------------------------
# ピボットテーブルのスライサー
# ------------------------------------------------------------------
# ピボットテーブルのスライサーのキャッシュの作成
scache2 = wb.SlicerCaches.Add2(Source=ptable, SourceField="Name")
# ピボットテーブルのスライサーの作成
slicer2 = scache2.Slicers.Add(SlicerDestination=ws)
# ピボットテーブルのスライサーのキャッシュのフィルターの解除
scache2.ClearAllFilters()
# ピボットテーブルのスライサーのキャッシュの設定
scache2.SlicerItems("nico").Selected = False
# ピボットテーブルのスライサーの順序を降順に設定
scache2.SortItems = xlSlicerSortDescending
# ピボットテーブルのスライサーの各種設定
slicer2.Name = "Name"
slicer2.Caption = "Name"
# ピボットテーブルのスライサーの位置設定
slicer2.Top = 0
slicer2.Left = 600
slicer2.Width = 100
slicer2.Height = 100
# ピボットテーブルのスライサーの位置設定
slicer2.Top = ws.Range("D20").Top
slicer2.Left = ws.Range("D20").Left
slicer2.Width = ws.Range("G30").Left - ws.Range("D20").Left
slicer2.Height = ws.Range("G30").Top - ws.Range("D20").Top
# ------------------------------------------------------------------
# ピボットテーブルのタイムライン
# ------------------------------------------------------------------
# ピボットテーブルのタイムラインのスライサーのキャッシュの作成
scache3 = wb.SlicerCaches.Add2(Source=ptable, SourceField="Date", Name="NativeTimeline_Date", SlicerCacheType=xlTimeline)
# ピボットテーブルのタイムラインのスライサーの作成
slicer3 = scache3.Slicers.Add(SlicerDestination=ws)
# ピボットテーブルのタイムラインのスライサーのキャッシュのフィルターの解除
scache3.ClearAllFilters()
# ピボットテーブルのタイムラインのスライサーのキャッシュの設定
scache3.TimelineState.SetFilterDateRange(StartDate="2020/1/1", EndDate="2030/1/1")
# ピボットテーブルのタイムラインのスライサーのレベルの設定
slicer3.TimelineViewState.Level = xlTimelineLevelMonths
# ピボットテーブルのタイムラインのスライサーの各種設定
slicer3.Name = "Date"
slicer3.Caption = "Date"
# ピボットテーブルのスライサーの位置設定
slicer3.Top = 0
slicer3.Left = 700
slicer3.Width = 300
slicer3.Height = 100
# ピボットテーブルのスライサーの位置設定
slicer3.Top = ws.Range("A30").Top
slicer3.Left = ws.Range("A30").Left
slicer3.Width = ws.Range("G40").Left - ws.Range("A30").Left
slicer3.Height = ws.Range("G40").Top - ws.Range("A30").Top
# ------------------------------------------------------------------
# ピボットテーブルの更新
# ------------------------------------------------------------------
# 指定のピボットテーブルの更新
pcache.Refresh()
# 指定のピボットテーブルの更新
ptable.RefreshTable()
# 指定のピボットテーブルの更新
ptable.Update()
# 全部のピボットテーブルの更新
wb.RefreshAll()
# ------------------------------------------------------------------
# 指定したシートを選択
ws.Activate()
# 指定したシートを選択
ws.Select()
# A1セルを選択
ws.Range("A1").Select()
# ------------------------------------------------------------------
# ブックを保存せずにクローズ
wb.Close(False)
# ------------------------------------------------------------------
# Excel終了
xlApp.Quit()
# ------------------------------------------------------------------
if __name__ == "__main__":
main()
# coding:utf-8
def main():
o = []
with open("sample.with.print.and.input.py", mode="rt", encoding="utf-8") as f:
for line in f:
if "# NO POST #" in line:
continue
line = line.replace('print("#', "#")
line = line.replace(' #")', "")
line = line.replace("#wb.Save()", " wb.Save()")
line = line.replace("#wb.Close(", " wb.Close(")
o.append(line)
with open("sample.py", mode="wt", encoding="utf-8") as f:
f.writelines(o)
if __name__ == "__main__":
main()
# coding:utf-8
import os
import win32com.client
import win32con
import win32gui
def main():
# ------------------------------------------------------------------
# Excelの定数の設定
# ------------------------------------------------------------------
# https://docs.microsoft.com/en-us/office/vba/api/excel(enumerations)
# https://docs.microsoft.com/ja-jp/office/vba/api/excel(enumerations)
# ------------------------------------------------------------------
# Excelの定数を取得する方法もあるようです。
# https://stackoverflow.com/questions/28264548/
# https://stackoverflow.com/questions/75154736/
# https://stackoverflow.com/questions/50127959/
# https://stackoverflow.com/questions/48257308/
# https://wacky.hatenadiary.com/entry/20091011/1255240572
# win32com.client.gencache.EnsureDispatch("Excel.Application")
# ------------------------------------------------------------------
# Excel Enum XlFindLookIn
# ------------------------------------------------------------------
xlComments = -4144
xlCommentsThreaded = -4184
xlFormulas = -4123
xlValues = -4163
# ------------------------------------------------------------------
# Excel Enum XlLookAt
# ------------------------------------------------------------------
xlPart = 2
xlWhole = 1
# ------------------------------------------------------------------
# Excel Enum XlReferenceStyle
# ------------------------------------------------------------------
xlA1 = 1
xlR1C1 = -4150
# ------------------------------------------------------------------
# Excel Enum XlReferenceType
# ------------------------------------------------------------------
xlAbsolute = 1
xlAbsRowRelColumn = 2
xlRelRowAbsColumn = 3
xlRelative = 4
# ------------------------------------------------------------------
# Excel Enum XlSearchDirection
# ------------------------------------------------------------------
xlNext = 1
xlPrevious = 2
# ------------------------------------------------------------------
# Excel Enum XlSearchOrder
# ------------------------------------------------------------------
xlByColumns = 2
xlByRows = 1
# ------------------------------------------------------------------
# Excel Enum XlConsolidationFunction
# ------------------------------------------------------------------
xlAverage = -4106
xlCount = -4112
xlCountNums = -4113
xlDistinctCount = 11
xlMax = -4136
xlMin = -4139
xlProduct = -4149
xlStDev = -4155
xlStDevP = -4156
xlSum = -4157
xlUnknown = 1000
xlVar = -4164
xlVarP = -4165
# ------------------------------------------------------------------
# Excel Enum XlLayoutRowType
# ------------------------------------------------------------------
xlCompactRow = 0
xlOutlineRow = 2
xlTabularRow = 1
# ------------------------------------------------------------------
# Excel Enum XlPivotFieldOrientation
# ------------------------------------------------------------------
xlColumnField = 2
xlDataField = 4
xlHidden = 0
xlPageField = 3
xlRowField = 1
# ------------------------------------------------------------------
# Excel Enum XlPivotFieldRepeatLabels
# ------------------------------------------------------------------
xlDoNotRepeatLabels = 1
xlRepeatLabels = 2
# ------------------------------------------------------------------
# Excel Enum XlPivotTableMissingItems
# ------------------------------------------------------------------
xlMissingItemsDefault = -1
xlMissingItemsMax = 32500
xlMissingItemsMax2 = 1048576
xlMissingItemsNone = 0
# ------------------------------------------------------------------
# Excel Enum XlPivotTableSourceType
# ------------------------------------------------------------------
xlConsolidation = 3
xlDatabase = 1
xlExternal = 2
xlPivotTable = -4148
xlScenario = 4
# ------------------------------------------------------------------
# Excel Enum XlSlicerCacheType
# ------------------------------------------------------------------
xlSlicer = 1
xlTimeline = 2
# ------------------------------------------------------------------
# Excel Enum XlSlicerSort
# ------------------------------------------------------------------
xlSlicerSortAscending = 2
xlSlicerSortDataSourceOrder = 1
xlSlicerSortDescending = 3
# ------------------------------------------------------------------
# Excel Enum XlSortOrder
# ------------------------------------------------------------------
xlAscending = 1
xlDescending = 2
xlManual = -4135
# ------------------------------------------------------------------
# Excel Enum XlTimelineLevel
# ------------------------------------------------------------------
xlTimelineLevelYears = 0
xlTimelineLevelQuarters = 1
xlTimelineLevelMonths = 2
xlTimelineLevelDays = 3
# ------------------------------------------------------------------
# Excel Enum XlPivotFilterType
# ------------------------------------------------------------------
xlBefore = 31
xlBeforeOrEqualTo = 32
xlAfter = 33
xlAfterOrEqualTo = 34
xlAllDatesInPeriodJanuary = 57
xlAllDatesInPeriodFebruary = 58
xlAllDatesInPeriodMarch = 59
xlAllDatesInPeriodApril = 60
xlAllDatesInPeriodMay = 61
xlAllDatesInPeriodJune = 62
xlAllDatesInPeriodJuly = 63
xlAllDatesInPeriodAugust = 64
xlAllDatesInPeriodSeptember = 65
xlAllDatesInPeriodOctober = 66
xlAllDatesInPeriodNovember = 67
xlAllDatesInPeriodDecember = 68
xlAllDatesInPeriodQuarter1 = 53
xlAllDatesInPeriodQuarter2 = 54
xlAllDatesInPeriodQuarter3 = 55
xlAllDatesInPeriodQuarter4 = 56
xlBottomCount = 2
xlBottomPercent = 4
xlBottomSum = 6
xlCaptionBeginsWith = 17
xlCaptionContains = 21
xlCaptionDoesNotBeginWith = 18
xlCaptionDoesNotContain = 22
xlCaptionDoesNotEndWith = 20
xlCaptionDoesNotEqual = 16
xlCaptionEndsWith = 19
xlCaptionEquals = 15
xlCaptionIsBetween = 27
xlCaptionIsGreaterThan = 23
xlCaptionIsGreaterThanOrEqualTo = 24
xlCaptionIsLessThan = 25
xlCaptionIsLessThanOrEqualTo = 26
xlCaptionIsNotBetween = 28
xlDateBetween = 35
xlDateLastMonth = 45
xlDateLastQuarter = 48
xlDateLastWeek = 42
xlDateLastYear = 51
xlDateNextMonth = 43
xlDateNextQuarter = 46
xlDateNextWeek = 40
xlDateNextYear = 49
xlDateThisMonth = 44
xlDateThisQuarter = 47
xlDateThisWeek = 41
xlDateThisYear = 50
xlDateToday = 38
xlDateTomorrow = 37
xlDateYesterday = 39
xlNotSpecificDate = 30
xlSpecificDate = 29
xlTopCount = 1
xlTopPercent = 3
xlTopSum = 5
xlValueDoesNotEqual = 8
xlValueEquals = 7
xlValueIsBetween = 13
xlValueIsGreaterThan = 9
xlValueIsGreaterThanOrEqualTo = 10
xlValueIsLessThan = 11
xlValueIsLessThanOrEqualTo = 12
xlValueIsNotBetween = 14
xlYearToDate = 52
# ------------------------------------------------------------------
print("# Excel起動 #")
xlApp = win32com.client.Dispatch("Excel.Application")
# print("press enter key to continue") # NO POST #
# input() # NO POST #
print("# ExcelのWindow最大化 #")
win32gui.ShowWindow(xlApp.hwnd, win32con.SW_MAXIMIZE)
# print("press enter key to continue") # NO POST #
# input() # NO POST #
print("# Excel表示 #")
xlApp.Visible = 1
# print("press enter key to continue") # NO POST #
# input() # NO POST #
print("# Excelファイルオープン #")
wb = xlApp.Workbooks.Open(f"{os.getcwd()}\\sample.csv")
# print("press enter key to continue") # NO POST #
# input() # NO POST #
print("# Excelシートオブジェクト #")
ws = wb.Worksheets(1)
# print("press enter key to continue") # NO POST #
# input() # NO POST #
# ------------------------------------------------------------------
print("# 指定したシートを選択 #")
ws.Activate()
# print("press enter key to continue") # NO POST #
# input() # NO POST #
print("# シートの追加 #")
ws = ws.Parent.Worksheets.Add()
# print("press enter key to continue") # NO POST #
# input() # NO POST #
print("# 指定したシートを選択 #")
ws.Activate()
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# ピボットテーブルの作成
# ------------------------------------------------------------------
print("# ピボットテーブルのキャッシュの作成 #")
pcache = wb.PivotCaches().Create(SourceType=xlDatabase, SourceData="sample!A:F")
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルの作成 #")
ptable = pcache.CreatePivotTable(TableDestination=ws.Range("A1"), TableName="ピボットテーブル1")
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルに集計フィールドを挿入 #")
ptable.CalculatedFields().Add(Name="Twice", Formula="=Count*2")
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# ピボットテーブルのフィールド
# ------------------------------------------------------------------
print("# ピボットテーブルのフィルターの設定 #")
ptable.PivotFields("ID").Orientation = xlPageField
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのフィルターの設定 #")
ptable.PivotFields("Meta").Orientation = xlPageField
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのフィルターの位置の設定 #")
ptable.PivotFields("Meta").Position = 1
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのフィールドの行の設定 #")
ptable.PivotFields("Type").Orientation = xlRowField
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのフィールドの行の設定 #")
ptable.PivotFields("Name").Orientation = xlRowField
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのフィールドの列の設定 #")
ptable.PivotFields("Date").Orientation = xlColumnField
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのCountを合計 #")
pfield1 = ptable.AddDataField(Field=ptable.PivotFields("Count"), Caption="SumCount", Function=xlSum)
print(pfield1.Caption) # NO POST #
print(pfield1.Name) # NO POST #
print(pfield1.Value) # NO POST #
print(pfield1.SourceName) # NO POST #
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのTwiceを合計 #")
pfield2 = ptable.AddDataField(Field=ptable.PivotFields("Twice"), Caption="SumTwice", Function=xlSum)
print(pfield2.Caption) # NO POST #
print(pfield2.Name) # NO POST #
print(pfield2.Value) # NO POST #
print(pfield2.SourceName) # NO POST #
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# ピボットテーブルのレイアウトとオプションの設定
# ------------------------------------------------------------------
print("# ピボットテーブルのレイアウト:表形式で表示 #")
ptable.RowAxisLayout(RowLayout=xlTabularRow)
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのレイアウト:アイテムのラベルをすべて繰り返す #")
ptable.RepeatAllLabels(Repeat=xlRepeatLabels)
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのオプション:データソースから削除されたアイテムを保持しない #")
# ptable(PivotTable)ではなくpcache(PivotCache)のプロパティであることに注意
pcache.MissingItemsLimit = xlMissingItemsNone
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのオプション:更新時に列幅を自動調整しない #")
ptable.HasAutoFormat = False
print("press enter key to continue") # NO POST #
input() # NO POST #
# NO POST #
print("# 全列の横幅を設定 #") # NO POST #
ws.Cells.ColumnWidth = 12 # NO POST #
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのオプション:更新時にセル書式を保持しない #")
ptable.PreserveFormatting = False
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのオプション:ファイルに元のデータを保持しない #")
ptable.SaveData = False
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのオプション:詳細を表示可能にしない #")
ptable.EnableDrilldown = False
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのオプション:行の総計を表示しない #")
ptable.RowGrand = False
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのオプション:列の総計を表示しない #")
ptable.ColumnGrand = False
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# ピボットテーブルの設定
# ------------------------------------------------------------------
print("# ピボットテーブルの小計を非表示 #")
ptable.PivotFields("Type").Subtotals = tuple(False for _ in range(12))
ptable.PivotFields("Name").Subtotals = tuple(False for _ in range(12))
ptable.PivotFields("Date").Subtotals = tuple(False for _ in range(12))
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのIDの単一のアイテムを設定 #")
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").CurrentPage = "(All)"
ptable.PivotFields("ID").CurrentPage = "(blank)"
ptable.PivotFields("ID").CurrentPage = 21
ptable.PivotFields("ID").CurrentPage = 22
ptable.PivotFields("ID").CurrentPage = 23
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのIDの複数のアイテムを設定 #")
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").EnableMultiplePageItems = True
ptable.PivotFields("ID").PivotItems("21").Visible = True
ptable.PivotFields("ID").PivotItems("22").Visible = True
ptable.PivotFields("ID").PivotItems("23").Visible = True
ptable.PivotFields("ID").PivotItems("24").Visible = False
ptable.PivotFields("ID").PivotItems("25").Visible = False
ptable.PivotFields("ID").PivotItems("26").Visible = False
ptable.PivotFields("ID").PivotItems("27").Visible = False
ptable.PivotFields("ID").PivotItems("28").Visible = False
ptable.PivotFields("ID").PivotItems("29").Visible = False
ptable.PivotFields("ID").PivotItems("(blank)").Visible = False
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのIDの複数のアイテムを設定 #")
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").EnableMultiplePageItems = True
# 全てのPivotItemのVisibleをFalseにするとエラーになるので、
# ひとまずは空欄以外の全てのPivotItemのVisibleをFalseする。
for pi in ptable.PivotFields("ID").PivotItems():
pi.Visible = False if pi.Name != "(blank)" else True
# 必要なPivotItemのVisibleをTrueにする。
ptable.PivotFields("ID").PivotItems("21").Visible = True
ptable.PivotFields("ID").PivotItems("22").Visible = True
ptable.PivotFields("ID").PivotItems("23").Visible = True
# 空欄のPivotItemが不要であれば空欄のPivotItemのVisibleをFalseにする。
ptable.PivotFields("ID").PivotItems("(blank)").Visible = False
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# ピボットテーブルの設定
# ------------------------------------------------------------------
print("# ピボットテーブルのIDの複数のアイテムを設定 #")
print("# 指定のItemはTrue/指定以外のItemはFalse #")
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").EnableMultiplePageItems = True
for pi in ptable.PivotFields("ID").PivotItems():
pi.Visible = pi.Name in ["21", "22", "23", "29", "(blank)"]
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのIDの複数のアイテムを設定 #")
print("# 指定のItemはFalse/指定以外のItemはTrue #")
print("# TrueになるItemが0個になってしまうとError #")
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").EnableMultiplePageItems = True
for pi in ptable.PivotFields("ID").PivotItems():
pi.Visible = pi.Name not in ["21", "22", "23", "29", "(blank)"]
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのIDの複数のアイテムを設定 #")
print("# 指定のItemはTrue/指定以外のItemは変更しない #")
# ptable.PivotFields("ID").ClearAllFilters()
# ptable.PivotFields("ID").EnableMultiplePageItems = True
for pi in ptable.PivotFields("ID").PivotItems():
if pi.Name in ["21", "22"]:
pi.Visible = True
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのIDの複数のアイテムを設定 #")
print("# 指定のItemはFalse/指定以外のItemは変更しない #")
print("# TrueになるItemが0個になってしまうとError #")
# ptable.PivotFields("ID").ClearAllFilters()
# ptable.PivotFields("ID").EnableMultiplePageItems = True
for pi in ptable.PivotFields("ID").PivotItems():
if pi.Name in ["25", "26"]:
pi.Visible = False
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# ピボットテーブルの設定
# ------------------------------------------------------------------
print("# 上記までの処理方法は #")
print("# ピボットテーブルがループ毎に更新されかねない為 #")
print("# Item数やData量が多い場合は処理に時間が掛かる… #")
print("# コンソールに進捗を出力して気を紛らす場合は以下 #")
print("# ピボットテーブルのIDの複数のアイテムを設定 #")
print("# 指定のItemはTrue/指定以外のItemはFalse #")
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").EnableMultiplePageItems = True
for i, pi in enumerate(lst := ptable.PivotFields("ID").PivotItems()):
pi.Visible = pi.Name in ["21", "22", "23", "29", "(blank)"]
print(f"{i+1:04}/{len(lst):04}")
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのIDの複数のアイテムを設定 #")
print("# 指定のItemはFalse/指定以外のItemはTrue #")
print("# TrueになるItemが0個になってしまうとError #")
ptable.PivotFields("ID").ClearAllFilters()
ptable.PivotFields("ID").EnableMultiplePageItems = True
for i, pi in enumerate(lst := ptable.PivotFields("ID").PivotItems()):
pi.Visible = pi.Name not in ["21", "22", "23", "29", "(blank)"]
print(f"{i+1:04}/{len(lst):04}")
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのIDの複数のアイテムを設定 #")
print("# 指定のItemはTrue/指定以外のItemは変更しない #")
# ptable.PivotFields("ID").ClearAllFilters()
# ptable.PivotFields("ID").EnableMultiplePageItems = True
for i, pi in enumerate(lst := ptable.PivotFields("ID").PivotItems()):
if pi.Name in ["21", "22"]:
pi.Visible = True
print(f"{i+1:04}/{len(lst):04}")
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのIDの複数のアイテムを設定 #")
print("# 指定のItemはFalse/指定以外のItemは変更しない #")
print("# TrueになるItemが0個になってしまうとError #")
# ptable.PivotFields("ID").ClearAllFilters()
# ptable.PivotFields("ID").EnableMultiplePageItems = True
for i, pi in enumerate(lst := ptable.PivotFields("ID").PivotItems()):
if pi.Name in ["25", "26"]:
pi.Visible = False
print(f"{i+1:04}/{len(lst):04}")
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのIDのフィルターの解除 #")
ptable.PivotFields("ID").ClearAllFilters()
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# ピボットテーブルの設定とデータソースの変更
# ------------------------------------------------------------------
print("# 上記までの処理方法は #")
print("# ピボットテーブルがループ毎に更新されかねない為 #")
print("# Item数やData量が多い場合は処理に時間が掛かる… #")
print("# ピボットテーブルのみの解決方法が思い付かない為 #")
print("# データソースにヘルパー列を追加して対応する方法 #")
def PivotFieldSetVisibleItemsListWithDynamicArrayFormula(pf, visible, primary=None, prefix="", suffix="Visible"):
pt = pf.Parent
pc = pt.PivotCache()
ws = pt.Parent
wb = ws.Parent
ap = ws.Application
sd = ap.ConvertFormula(pc.SourceData, xlR1C1, xlA1, xlRelative)
rg = ap.Evaluate(sd)
SourceDataRange = rg
print("# 数式を作成 #")
rg = SourceDataRange
rg = rg.find(pf.Name, rg.GetResize(1, 1), xlValues, xlWhole, xlByRows, xlNext, True)
rg = rg.EntireColumn
covered = rg.GetAddress(False, False)
rg = SourceDataRange
rg = rg.GetResize(1, 1)
rg = rg.EntireColumn
primary = primary or rg.GetAddress(False, False)
formula = f'=SWITCH(FILTER({covered},NOT(ISBLANK({primary}))),"{pf.Name}","{prefix}{pf.Name}{suffix}",'
formula += "".join([(f"{v},1," if type(v) is not str else f'"{v}",1,') for v in visible])
formula += "0)"
print("# 数式を入力 #")
rg = SourceDataRange
cc = rg.Columns.Count
rg = rg.GetResize(1, 1)
rg = rg.GetOffset(0, cc)
rg.Formula2 = formula
print("# ピボットテーブルのキャッシュを変更 #")
rg = SourceDataRange
rc = rg.Rows.Count
cc = rg.Columns.Count
rg = rg.GetResize(rc, cc + 1)
pc = wb.PivotCaches().Create(SourceType=xlDatabase, SourceData=rg)
pt.ChangePivotCache(pc)
print("# ピボットテーブルのフィルターを追加 #")
pt.PivotFields(f"{prefix}{pf.Name}{suffix}").Orientation = xlPageField
pt.PivotFields(f"{prefix}{pf.Name}{suffix}").Position = 1
print("# ピボットテーブルのフィルターを設定 #")
pt.PivotFields(f"{prefix}{pf.Name}{suffix}").ClearAllFilters()
pt.PivotFields(f"{prefix}{pf.Name}{suffix}").CurrentPage = 1
return pt, pt.PivotCache()
print("# データソースにヘルパー列として動的配列数式追加 #")
print("# ピボットテーブルのフィルターを動的配列数式の結果が1で表示 #")
print("# 指定のItemは1/指定以外のItemは0 #")
print("# 指定のItemに(blank)の指定は不可 #")
print("# 動的配列数式動作環境Excel2021~ #")
pf = ptable.PivotFields("ID")
visible = [21, 22, 23, 29]
# primary = "A:A" # データソースの空欄の無い列を指定。省略すると一番左側の列を使用。
# ptable, pcache = PivotFieldSetVisibleItemsListWithDynamicArrayFormula(pf, visible, primary)
ptable, pcache = PivotFieldSetVisibleItemsListWithDynamicArrayFormula(pf, visible)
ptable.PivotFields("IDVisible").Position = 2
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのフィルターを解除 #")
ptable.PivotFields("IDVisible").ClearAllFilters()
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# データソースにヘルパー列として動的配列数式追加 #")
print("# ピボットテーブルのフィルターを動的配列数式の結果が1で表示 #")
print("# 指定のItemは1/指定以外のItemは0 #")
print("# 指定のItemに(blank)の指定は不可 #")
print("# 動的配列数式動作環境Excel2021~ #")
pf = ptable.PivotFields("Meta")
visible = ["hoge", "piyo"]
# primary = "A:A" # データソースの空欄の無い列を指定。省略すると一番左側の列を使用。
# ptable, pcache = PivotFieldSetVisibleItemsListWithDynamicArrayFormula(pf, visible, primary)
ptable, pcache = PivotFieldSetVisibleItemsListWithDynamicArrayFormula(pf, visible)
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのフィルターを解除 #")
ptable.PivotFields("MetaVisible").ClearAllFilters()
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# ピボットテーブルの設定
# ------------------------------------------------------------------
print("# ピボットテーブルのTypeの順序を昇順に設定 #")
ptable.PivotFields("Type").AutoSort(Order=xlAscending, Field="Type")
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのTypeを0より大きいに設定 #")
ptable.PivotFields("Type").PivotFilters.Add2(Type=xlCaptionIsGreaterThan, DataField=None, Value1=0)
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのTypeを合計が10より大きいに設定 #")
ptable.PivotFields("Type").PivotFilters.Add2(Type=xlValueIsGreaterThan, DataField=ptable.PivotFields("SumCount"), Value1=10)
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのTypeの2222を含まないよう設定 #")
ptable.PivotFields("Type").PivotItems("2222").Visible = False
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのTypeのフィルターの解除 #")
ptable.PivotFields("Type").ClearAllFilters()
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# ピボットテーブルの設定
# ------------------------------------------------------------------
print("# ピボットテーブルのDateの期間を設定 #")
ptable.PivotFields("Date").PivotFilters.Add2(Type=xlDateBetween, DataField=None, Value1="1900/1/1", Value2="3000/1/1")
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのDateに自動的にグループ化を設定 #")
ptable.PivotFields("Date").AutoGroup()
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのDateのグループ解除 #")
drange = ptable.PivotFields("Date").DataRange
drange.Cells(1, 1).Ungroup()
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのDateに年と月のグループ化を設定 #")
drange = ptable.PivotFields("Date").DataRange
drange.Cells(1, 1).Group(Start=True, End=True, By=None, Periods=tuple([False, False, False, False, True, False, True]))
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのDateの年の小計を非表示 #")
ptable.PivotFields("年 (Date)").Subtotals = tuple(False for _ in range(12))
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのDateの年を非表示 #")
ptable.PivotFields("年 (Date)").Orientation = xlHidden
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのDateのグループ解除 #")
drange.Cells(1, 1).Ungroup()
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# ピボットテーブルのスライサー
# ------------------------------------------------------------------
print("# ピボットテーブルのスライサーのキャッシュの作成 #")
scache1 = wb.SlicerCaches.Add2(Source=ptable, SourceField="Type")
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーの作成 #")
slicer1 = scache1.Slicers.Add(SlicerDestination=ws)
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーのキャッシュのフィルターの解除 #")
scache1.ClearAllFilters()
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーのキャッシュの設定 #")
scache1.SlicerItems("2222").Selected = False
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーの順序を昇順に設定 #")
scache1.SortItems = xlSlicerSortAscending
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーの各種設定 #")
slicer1.Name = "Type"
slicer1.Caption = "Type"
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーの位置設定 #")
slicer1.Top = 0
slicer1.Left = 500
slicer1.Width = 100
slicer1.Height = 100
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーの位置設定 #")
slicer1.Top = ws.Range("A20").Top
slicer1.Left = ws.Range("A20").Left
slicer1.Width = ws.Range("D30").Left - ws.Range("A20").Left
slicer1.Height = ws.Range("D30").Top - ws.Range("A20").Top
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# ピボットテーブルのスライサー
# ------------------------------------------------------------------
print("# ピボットテーブルのスライサーのキャッシュの作成 #")
scache2 = wb.SlicerCaches.Add2(Source=ptable, SourceField="Name")
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーの作成 #")
slicer2 = scache2.Slicers.Add(SlicerDestination=ws)
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーのキャッシュのフィルターの解除 #")
scache2.ClearAllFilters()
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーのキャッシュの設定 #")
scache2.SlicerItems("nico").Selected = False
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーの順序を降順に設定 #")
scache2.SortItems = xlSlicerSortDescending
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーの各種設定 #")
slicer2.Name = "Name"
slicer2.Caption = "Name"
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーの位置設定 #")
slicer2.Top = 0
slicer2.Left = 600
slicer2.Width = 100
slicer2.Height = 100
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーの位置設定 #")
slicer2.Top = ws.Range("D20").Top
slicer2.Left = ws.Range("D20").Left
slicer2.Width = ws.Range("G30").Left - ws.Range("D20").Left
slicer2.Height = ws.Range("G30").Top - ws.Range("D20").Top
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# ピボットテーブルのタイムライン
# ------------------------------------------------------------------
print("# ピボットテーブルのタイムラインのスライサーのキャッシュの作成 #")
scache3 = wb.SlicerCaches.Add2(Source=ptable, SourceField="Date", Name="NativeTimeline_Date", SlicerCacheType=xlTimeline)
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのタイムラインのスライサーの作成 #")
slicer3 = scache3.Slicers.Add(SlicerDestination=ws)
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのタイムラインのスライサーのキャッシュのフィルターの解除 #")
scache3.ClearAllFilters()
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのタイムラインのスライサーのキャッシュの設定 #")
scache3.TimelineState.SetFilterDateRange(StartDate="2020/1/1", EndDate="2030/1/1")
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのタイムラインのスライサーのレベルの設定 #")
slicer3.TimelineViewState.Level = xlTimelineLevelMonths
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのタイムラインのスライサーの各種設定 #")
slicer3.Name = "Date"
slicer3.Caption = "Date"
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーの位置設定 #")
slicer3.Top = 0
slicer3.Left = 700
slicer3.Width = 300
slicer3.Height = 100
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# ピボットテーブルのスライサーの位置設定 #")
slicer3.Top = ws.Range("A30").Top
slicer3.Left = ws.Range("A30").Left
slicer3.Width = ws.Range("G40").Left - ws.Range("A30").Left
slicer3.Height = ws.Range("G40").Top - ws.Range("A30").Top
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# ピボットテーブルの更新
# ------------------------------------------------------------------
print("# 指定のピボットテーブルの更新 #")
pcache.Refresh()
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# 指定のピボットテーブルの更新 #")
ptable.RefreshTable()
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# 指定のピボットテーブルの更新 #")
ptable.Update()
print("press enter key to continue") # NO POST #
input() # NO POST #
print("# 全部のピボットテーブルの更新 #")
wb.RefreshAll()
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
print("# 指定したシートを選択 #")
ws.Activate()
# print("press enter key to continue") # NO POST #
# input() # NO POST #
print("# 指定したシートを選択 #")
ws.Select()
# print("press enter key to continue") # NO POST #
# input() # NO POST #
print("# A1セルを選択 #")
ws.Range("A1").Select()
# print("press enter key to continue") # NO POST #
# input() # NO POST #
# ------------------------------------------------------------------
print("# ブックを保存せずにクローズ #")
wb.Close(False)
# print("press enter key to continue") # NO POST #
# input() # NO POST #
# ------------------------------------------------------------------
print("# Excel終了 #")
xlApp.Quit()
print("press enter key to continue") # NO POST #
input() # NO POST #
# ------------------------------------------------------------------
# NO POST #
print("press enter key to exit") # NO POST #
input() # NO POST #
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment