# pivot03.rb.txt: ruby script (encoding: Windows-31J) # ExcelのPivotTable操作 data03.xls を素材にして z_pivot03.xls を出力 # 「都道府県, 人口」のデータ(人口の多い順)を素材にして # 地方ブロック別の人口の合計を算出 # 都道府県名を非表示にする表と、表示する表の2種類を別々のシートに作成 require "exlap" # 地方ブロックと都道府県の分類に関する情報 area_csv = <XlDatabase, 'SourceData'=>src_rng) ptname = "地方ブロック別の人口" # ピボットテーブルの名前 pvc.CreatePivotTable( 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname) pt = ss.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # レイアウト枠の調整 # ↓ 項目分類の注目欄として都道府県を指定。縦方向(行)に広げる形に設定 ptf1 = pt.PivotFields("都道府県") ptf1.Orientation = XlRowField # 「行」方向に並べるフィールドとする # ↓ 「人口」を計算・集計の材料にする ptf2 = pt.PivotFields("人口") ptf2.Orientation = XlDataField # 計算・集計の材料にするとの指定 ptf2.Function = XlSum # 合計を算出 # ↓ 地方ブロックごとにグループ化する app = pt.Application # Excel.Application area_hs.values.each do |prefecture_names| param = [] prefecture_names.each do |prefecture| param << ptf1.PivotItems(prefecture).LabelRange end app.Union(*param).Group end ptfp = ptf1.ParentField # 親フィールド(グループ分類したものの全体) ptfp.Name = "地方ブロック" # ↓ 各グループの名前と順番を変更・調整 i = 0 area_hs.keys.each do |area| i += 1 pvi = ptfp.PivotItems("グループ#{i}") pvi.Name = area pvi.Position = i end ptf1.Orientation = XlHidden # 都道府県名を非表示に ## 地方ブロックごとの人口を算出(都道府県名を表示) ss = wb2.fes # 空のワークシートを選択 ss.Name = "地方ブロック別・都道府県別の集計" ss.Activate # ピボットテーブルのシートに焦点を当てる pvc = wb2.PivotCaches.Add('SourceType'=>XlDatabase, 'SourceData'=>src_rng) ptname = "地方ブロック別・都道府県別の人口" # ピボットテーブルの名前 pvc.CreatePivotTable( 'TableDestination'=>ss.Range("A1"), # ピボットテーブルの始点 'TableName'=>ptname) pt = ss.PivotTables(ptname) # ピボットテーブルオブジェクトをptに pt.SmallGrid = false # レイアウト枠の調整 # ↓ 項目分類の注目欄として都道府県を指定。縦方向(行)に広げる形に設定 ptf1 = pt.PivotFields("都道府県") ptf1.Orientation = XlRowField # 「行」方向に並べるフィールドとする # ↓ 「人口」を計算・集計の材料にする ptf2 = pt.PivotFields("人口") ptf2.Orientation = XlDataField # 計算・集計の材料にするとの指定 ptf2.Function = XlSum # 合計を算出 # ↓ 地方ブロックごとにグループ化する app = pt.Application # Excel.Application area_hs.values.each do |prefecture_names| param = [] prefecture_names.each do |prefecture| param << ptf1.PivotItems(prefecture).LabelRange end app.Union(*param).Group end ptfp = ptf1.ParentField # 親フィールド(グループ分類したものの全体) ptfp.Name = "地方ブロック" # ↓ 各グループの名前と順番を変更・調整 i = 0 area_hs.keys.each do |area| i += 1 pvi = ptfp.PivotItems("グループ#{i}") pvi.Name = area pvi.Position = i end # その他の調整 ptfp.Subtotals = [true] + [false]*11 # 地方ブロック単位の合計を表示 ptfp.SubtotalName = "地方ブロック合計" # 地方ブロック単位の合計欄の名前 i = 0 area_hs.values.each do |prefecture_names| prefecture_names.each do |prefecture| i += 1 ptf1.PivotItems(prefecture).Position = i end end ss = wb2.ss(1) # 第1ワークシートを選択 ss.Activate wb2.save # ワークブックの保存 end xl.quit