■ Excel豆知識44 | 豆知識44 Excel_mame44 ピボットテーブル書式サンプル Excel_mame44_pivot_ |
---|
44-1 ピボットテーブルの書式設定
Excel豆知識44作成にあたってのメモをこちらに書きました。(^^ゞ
豆知識29でSUMPRODUCT関数を使って作った集計表と同じものを、豆知識31ではピボットテーブ ルで作ってみました。でも、ピボットテーブルを更新したあとも罫線を維持することは、その 設定では出来ませんでした。
今回は、その罫線の維持も含めて、ピボットテーブルの書式についてご紹介してみようと思 います。ただ、更新したあとも維持できる罫線の設定は、繰り返しの作業が必要で、とても 面倒ではあります。でも、「面倒でもやれば出来る」ということと、「出来ないと思って諦 める」ということは大違いですのでご紹介しようと思いました。 なお、いつもの豆知識の形式の説明のほかに、Tasanさんが作ってくださった「マクロで実感 するピボットテーブルの書式設定」のコードをご紹介いたしますので、是非、マクロを実行 してみてください。コード実行の際、画面の更新を止めていませんので、ピボットテーブル に次々と書式が設定されていく様子をご覧いただけると思います。
次のピボットテーブルの書式に関するヘルプやMicrosoftの記事を参考にしております。 ・ピボットテーブル レポートのデータを選択する ・ピボットテーブル レポートの書式を設定する ・ピボットテーブルおよびピボットテーブル レポートの書式に関する注意 今回のポイントのひとつは上記のヘルプ記事にある「ピボットテーブル レポートのデータを 選択する」ことです。「選択」して、フォント、背景色、罫線等の書式を設定することによっ て、書式を維持します。
今回も豆知識31と同じように、豆知識29でSUMPRODUCT関数を使って作った集計表と同じものを 作りますが、豆知識31とは別の手順で作成したいと思います。
(1)ピボットテーブル ウィザード3/3のレイアウトを使ってフィールドを設定する。 今まではウィザードの3/3ですぐに「完了」をクリックして、シートにピボットテーブルの枠 を表示させそこでフィールドの設定をする方法をご紹介してきましたが、今回はこの3/3の 「レイアウト」や「オプション」で設定してみたいと思います。 「レイアウト」をクリックすると、下図のように「ピボットテーブル/ピボットグラフ ウィザ ード-レイアウト」が出ますので、そこの説明にあるようにして 「行」エリアに「受付日」と「受付支店」を 「列」エリアに「講座名」を 「データ」エリアに「氏名」を ドラッグします。
データエリアに文字列の「氏名」をドラッグしましたので集計の方法は「データの個数」 となっています。今回は求めたいのが「データの個数」ですが、ここで「合計」など別の集計 方法を選択したい場合はレイアウト上の「データの個数/氏名」のところをダブルクリックし て、下図のフィールドの設定画面を出します。 今回はここで表示形式をクリックし、「桁区切りありの数値」に設定します。 (サンプルデータでは数字が小さいのであまり意味がありませんが。^^; ) 「OK」を3箇所クリックしてウィザードの3/3に戻ります。
(2)ピボットテーブル ウィザード3/3の「オプション」で好みの設定をする。 (ピボットテーブルを作った後で設定することも勿論できます。) 今回はここの「空白セルに表示する値」に入っているチェックをはずして、空白セルにゼロ を表示させるようにします。(デフォルトではチェックが入っていて、その右のボックスが 空欄なので空白セルには何も入らない設定になっています。) また、ここの「書式の保持」のチェックがはずれていると、いくら設定しても書式は保持さ れませんのでチェックが入っていることを確認してください。(デフォルトでチェックが入 っています。)
「OK」「完了」をクリックすると、下図のようなピボットテーブルになります。
(3)「年」「月」「日」で日付をグループ化する。
豆知識31では「年」「月」でグループ化しましたが、今回はそれに「日」でもグループ化し
てみます。
今作成している集計表では「日」でグループ化しなくても目的は達せられますが、後ほどご紹介するサン
プルマクロのように「対象月を絞り込んで日計をとりたい」という場合は「日」でグループ化する必要が
あります。
すると、下図のようになります。 「年」「月」だけの場合は月の項目名が「受付日」となってしまいますが、「日」でもグル ープ化すると「年」「月」「受付日」という項目名になります。
また、「日」でグループ化すると、下図のように受付日に「1月1日」から「12月31日」
までの日付がアイテムとして用意されます。(これを利用した365日分のシート作成をあとでご紹介
します。)
(4)個々のセクションを選択して書式を設定
「年」「月」は、このあとページエリアへ移動させますが、移動したあとでは書式を設
定できませんので行エリアで背景色を設定します。
その時、マウスでただセル範囲を選択するのではなく、はじめにヘルプを引用してご紹介し
たピボットテーブルのデータを選択するやり方で選択します。(これがそのあと書式を維持
するためのポイントです。)
ただし、この時、ピボットテーブルを選択した状態で、ピボットテーブルのメニューの
「選択」で「選択範囲を有効にする」が下図1のようにチェックが入った状態になって
いることが必要です。(デフォルトでは有効になっています。)
もし、下図2のようになっていたらそこをクリックして下図1の状態にしてください。
「年」の項目セルの上端にマウスポインタを近づけると、ポインタが下図のように太い↓に なります。その状態でクリックすると、「年」のラベルが選択されます。
そこに薄い黄色をつけます。 同様にして「月」のラベルを選択します。
そこにも薄い黄色を設定します。 次に同様にして「受付日」のラベルを選択します。 今度はちょっと雰囲気が変わって、集計でない「日」のラベルが選択されます。
そこにも薄い黄色を設定します。 (「日」はあとで非表示にしてしまいますので、しなくてもいいのですが、ちょっと練習です。^^; )
(5)集計行を選択する。
受付日の集計行を選択する場合は、下図のように集計の行の左端にマウスポインタを置くと
ポインタが太い→になり、全部の集計行が選択されます。
(そこでクリックを繰り返すと、いろいろな選択状態が繰り返されますので試してみてください。)
練習に、ここには橙色を設定してみます。
(6)「受付日」を非表示にする。 「受付日」の項目セルで右クリックし、「表示しない」とします。(これは結局「受付日」の項 目をピボットテーブル外へドラッグしてフィールドを削除するのと同じです。)レイアウトからはずし た時点で書式設定もなくなります。(更新や上書きをする前なら「戻る」で戻せます。)
(7)「年」と「月」をページエリアに移動させる。 「年」の項目をマウスで掴んでページエリアへドラッグ。
「月」の項目をマウスで掴んでページエリアの「年」の下へくるようにドラッグ。
下図のように年月がページエリアへ移動し、セルにも薄い黄色がついています。
この時、年のアイテムや月のアイテムに "<2006/1/16" と ">2006/12/29" という余計なものが
あります。
「年」ラベルをダブルクリックし、「表示しないアイテム」でそれらを選択して「OK」とすると、
余計なアイテムが表示されなくなります。
同様に「月」ラベルをダブルクリック。
表示しないアイテムで "<2006/1/16" と ">2006/12/29" をクリックして「OK」。
(8)項目名の変更やアイテムの並べ替え。 「データの個数/氏名」の表示を「受付件数」に変更したり、受付支店や講座名の並べ替えは 豆知識31と同じ方法で行ないます。(過程は省略)
(9)列幅を保持するために。 セルの書式とはちょっと違いますが、表の書式には列幅も結構重要だったりします。 下図のような場合に総計のG列の幅を他のデータの列と同じに広げた後で、ピボットテーブル の更新をすると、
下図のように列幅が戻ってしまいます。
なので、ピボットテーブルのオプションの「表のオートフォーマット」のチェックをはずし
ます。「書式の保持」のチェックの有無にかかわらず、「表のオートフォーマット」のチェ
ックをはずすと自分で設定した列幅を維持することができます。
「表のオートフォーマット」にチェックを入れておくと、レイアウトを変えても列幅がオートフィットさ
れますので、状況に応じた設定をなさってください。
今度は更新しても下図のように列幅は保持されました。
(10)「講座名」のラベルを選択して、背景色を薄い水色にし、中央揃えに。 「講座名」のラベルを選択するには「講座名」の項目セルの上端にマウスポインタをもって いき太い↓になったらクリックします。下図の範囲が選択されますので、色を設定し、中央 揃えにします。
(11)「受付支店」のラベルを選択して、背景色を薄い水色に。 「受付支店」のラベルを選択するには「受付支店」の項目セルの上端にマウスポインタをもっ ていき太い↓になったらクリックします。下図の範囲が選択されますので、色を設定します。
(12)「総計」を選択して背景を薄い緑に。
(13)データの数字を太字に設定する。 (これは後で戻します。練習だけです。^^;) ピボットテーブル全体を選択。
右クリックし、メニューから「選択」-「データ」をクリック。
すると、データ範囲が選択されますので、フォントを「太字」に設定。
(14)罫線をひとつひとつのアイテム毎に設定する。 今までの設定は結構その範囲全体を対象にすることが出来ましたが、罫線はそうはいきませ ん。ひとつひとつのアイテム毎に選択して、設定する必要があります。また、ピボットテー ブルを更新しても維持されるのは周囲の罫線のみで、内側の罫線は維持されません。 (ラベル毎、アイテム毎に設定すれば、行方向に設定すると横罫線が、列方向に設定すると 縦罫線が保持されます。) 「世田谷支店」のラベルとデータを選択して「外枠」の罫線を設定。
上と同様にして、「品川支店」「墨田支店」「大田支店」にも罫線を設定。
行方向の横罫線が設定されました。
次は列方向です。 「英会話」のラベルとデータを選択して、罫線を設定。
上と同様にして「パソコン教室」「茶道」「陶芸」「彫金」にも罫線を設定。
これで全体に罫線が設定されました。 この状態でピボットテーブルの更新をしても、罫線は維持されます。^^ ただ、このようにひとつひとつのアイテムに対して設定をしなければなりませんので、今回 のような少ないアイテムの場合は手作業でも設定可能ですが、後でご紹介するサンプルデー タのようにアイテムが多くなったら、罫線の設定はマクロの作業にするのが現実的かと思い ます。
(15)ページフィールドで年月を指定する。 ページフィールドで「2006年」と「9月」を選択します。
すると、下図のようにデータのない「陶芸」や「彫金」のアイテムが非表示になってしまい ました。なので、データのない「講座名」でも項目が表示されるように設定します。
「講座名」のラベルのところで右クリック。「フィールドの設定」の「データのないアイテ ムを表示する」にチェックを入れ「OK」。「受付支店」も同様に設定。
これで、何月を選択しても、いつも同じ形の集計表になります。
データの更新をやってみます。
今までのすべての設定が保持されています。^^
さて、ここでデータ範囲の数字の太字は練習だったので設定を解除します。
設定時と同様にデータ範囲を選択して、標準の太さにします。
(この設定はページフィールドで9月を選択していた状態で行なっても、すべての月に反映されました。)
(16)「総計」のラベルを中央揃えに。 「総計」のラベルを中央揃えにするのを忘れていました。
「総計」の上端にマウスポインタをおき、総計を選択。
その状態で右クリックし、メニューの「ラベル」をクリック。
「総計」のラベルのみが選択されますので、中央揃えに。
ここで「5月」を選択してみます。
すると、中央揃えにしたはずの「総計」がまた左揃えになってしまいました。^^; 上の9月で設定した図を良く見ると、ページフィールドのところが灰色になっています。 これは今「2006年」「9月」の「総計」を選択しているんだよ、ということを表しています。 つまり9月だけの総計に中央揃えを設定していたということです。
なので、ページフィールドを一旦「すべて」にします。
そうしてから、先程と同じようにして列の「総計」、行の「総計」のラベルを中央揃えにし ます。
これで出来上がりです。 SUMPRODUCT関数を使って作成した集計表とほぼ同じ集計表が出来上がりました。
さて、長い長い前置きでしたが、いよいよTasanさんに作っていただいたピボットテーブルの 書式設定のサンプルマクロのご紹介です。 新規ブックのVBEに下記のコードをコピペして実行していただいてもいいですし、ダウンロー ド用の「Excel_mame44_Pivot_」ブックで「ピボットテーブル作成」というボタンをクリック していただいてもいいですので、是非実行してみてください。 新規ブックで実行すると、まず最初に左端のシートにサンプルデータが作成され、そのデータ をもとにその右のシートにピボットテーブルが作成されます。そして、いろいろなレイアウト で書式が設定され、日付のグループ化が行なわれます。 コードをステップ実行させると、どういうふうにして設定しているか良くわかってとても面白 いです。 また、コードの中にはピボットテーブルをマクロで使う際のいろいろな工夫が満載ですので、 興味のある方は是非じっくりご覧いただきたいと思います。
Option Explicit Sub PvtTbl_Sample() '変数の宣言 Dim DataSht As Worksheet 'データシート Dim PvtSht As Worksheet '集計表シート Dim PvtTbl As PivotTable 'ピボットテーブル Dim ListNo As Long 'ユーザー設定リストの数 Dim PvtLabel As Variant 'フィールドラベル Dim PvtSelect As Variant 'レイアウトエリアの選択場所 Dim PvtFld As PivotField 'ピボットフィールド Dim PvtItem As PivotItem 'ピボットアイテム Dim PvtBorder As Variant '罫線の位置 Dim ColorNo1 As Long '罫線の色1 Dim ColorNo2 As Long '罫線の色2 Dim myYear As String '日付の表示年 Dim myMonth As String '日付の表示月 'シートの準備 With ThisWorkbook On Error Resume Next Set DataSht = .Worksheets(1) DataSht.Name = "データ" Set PvtSht = .Worksheets(2) If PvtSht Is Nothing Then Set PvtSht = .Worksheets.Add(After:=.Worksheets(1)) End If PvtSht.Name = "集計表" PvtSht.Cells.Clear On Error GoTo 0 'ピボットテーブル用の書式スタイル(MSゴシック、太字、11ポイント)を作成 On Error Resume Next .Styles("PvtFontStyle").Delete On Error GoTo 0 .Styles.Add Name:="PvtFontStyle" With .Styles("PvtFontStyle") .IncludeNumber = False .IncludeFont = True .IncludeAlignment = False .IncludeBorder = False .IncludePatterns = False .IncludeProtection = False With .Font .Name = "MS Pゴシック" .Size = 11 .Bold = True End With End With End With '計算方法を手動にする Application.Calculation = xlCalculationManual 'サンプルデータを作成する With DataSht .Cells.Clear .Range("A1:E1").Value = Array("入荷日", "入荷地", "品名", "数量", "金額") .Range("B2:B1001").Value = _ "=CHOOSE(MOD(INT(RAND()*10),5)+1,""函館"",""成田"",""横浜"",""神戸"",""門司"")" .Range("C2:C1001").Value = _ "=CHOOSE(MOD(INT(RAND()*10),5)+1,""レモン"",""バナナ"",""パイナップル"",""グレープフルーツ"",""オレンジ"")" .Range("D2:D1001").Value = "=INT(((RAND()*10)+1))*10" .Range("E2:E1001").Value = "=INT(((RAND()*10)+1))*1000" .Range("A1001").Value = Date .Range("A1001").AutoFill _ Destination:=.Range("A802:A1001"), Type:=xlFillWeekdays .Range("A802:A1001").Copy _ Destination:=Application.Union(.Range("A602"), _ .Range("A402"), .Range("A202"), .Range("A2")) With .Range("A:A").SpecialCells(xlCellTypeConstants, 1) .Sort Key1:=.Range("A1"), Order1:=xlAscending, _ Header:=xlNo, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, SortMethod:=xlPinYin .NumberFormatLocal = "ge.m.d" End With .Range("A1").CurrentRegion.Name = "Database" myYear = Year(Application.WorksheetFunction.Max(.Range("A:A"))) & "年" myMonth = Month(Application.WorksheetFunction.Max(.Range("A:A"))) & "月" End With 'イベント処理を無効にする Application.EnableEvents = False 'ピボットテーブルを作成する Set PvtTbl = DataSht.PivotTableWizard(TableDestination:=PvtSht.Range("A1")) Set DataSht = Nothing 'フィールドリストを表示させない With Application.CommandBars("PivotTable") .Visible = True If Val(.Parent.Version) >= 10 Then ActiveWorkbook.ShowPivotTableFieldList = False ElseIf .Controls(13).Caption <> " " Then .Controls(10).Execute End If End With 'ピボットテーブルでの作業 With PvtTbl '書式の保持を有効にする .PreserveFormatting = True '============================================================ '最初のレイアウトを設定する .AddFields RowFields:="品名", ColumnFields:="入荷地" '画面の更新を止める ' Application.ScreenUpdating = False 'ピボットテーブルの範囲に"PvtFontStyle"を適用する .PivotSelect "", xlDataAndLabel Selection.Style = "PvtFontStyle" '数量をデータエリアに配置する With .PivotFields("数量") .Orientation = xlDataField .Caption = "数量合計" .Function = xlSum .NumberFormat = "#,##0_ " End With '入荷地をユーザー設定で並べ替える On Error Resume Next Application.AddCustomList _ ListArray:=Array("函館", "成田", "横浜", "神戸", "門司") On Error GoTo 0 ListNo = Application.CustomListCount .ColumnRange.Sort Order1:=xlAscending, _ Type:=xlSortLabels, OrderCustom:=ListNo + 1, _ Orientation:=xlLeftToRight, SortMethod:=xlStroke Application.DeleteCustomList ListNum:=ListNo '罫線に使う色の設定 ColorNo1 = 7 'ピンク(普通の実線に適用) ColorNo2 = 1 '黒(太目の実線に適用) '表示フィールドのデータ及びラベルエリアに対して罫線を引く For Each PvtFld In .VisibleFields For Each PvtItem In PvtFld.PivotItems .PivotSelect PvtItem, xlDataAndLabel For Each PvtBorder In Array(xlEdgeBottom, xlEdgeRight) With Selection.Borders(PvtBorder) .Weight = xlThin .ColorIndex = ColorNo1 End With Next PvtBorder Next Next '============================================================ 'レイアウトを変更する .AddFields RowFields:=Array("入荷日", "品名"), _ ColumnFields:="入荷地" '各ラベルのラベルエリアとデータエリアに対して太線を引く For Each PvtLabel In Array("", "入荷地[All]", _ "品名[All]", "入荷日[All]", _ "'Row Grand Total'", "'Column Grand Total'") For Each PvtSelect In Array(xlLabelOnly, xlDataOnly) .PivotSelect PvtLabel, PvtSelect For Each PvtBorder In Array(xlEdgeLeft, _ xlEdgeTop, xlEdgeBottom, xlEdgeRight) With Selection.Borders(PvtBorder) .Weight = xlMedium .ColorIndex = ColorNo2 End With Next PvtBorder Next PvtSelect Next PvtLabel .PivotSelect "", xlOrigin With Selection.Borders(xlEdgeBottom) .Weight = xlMedium .ColorIndex = ColorNo2 End With '各ラベルの書式設定をする For Each PvtLabel In Array("入荷地[All]", "入荷日[All]", "品名[All]") .PivotSelect PvtLabel, xlDataOnly Selection.Interior.ColorIndex = 35 '薄い緑 Next PvtLabel .PivotSelect "入荷地[All]", xlLabelOnly Selection.Interior.ColorIndex = 15 '25% 灰色 Selection.Font.ColorIndex = 41 '薄い青 .PivotSelect "品名[All]", xlLabelOnly Selection.Interior.ColorIndex = 50 'シーグリーン Selection.Font.ColorIndex = 2 '白 .PivotSelect "入荷日[All]", xlLabelOnly Selection.Interior.ColorIndex = 36 '薄い黄色 '総計エリアの書式設定をする For Each PvtLabel In Array("'Column Grand Total'", _ "'Row Grand Total'") .PivotSelect PvtLabel, xlDataAndLabel Selection.Interior.ColorIndex = 44 'ゴールド .PivotSelect PvtLabel, xlDataOnly Selection.Font.ColorIndex = 41 '薄い青 .PivotSelect PvtLabel, xlLabelOnly Selection.HorizontalAlignment = xlCenter Next PvtLabel '入荷日の集計行に書式設定する .PivotSelect "入荷日[All;Total]", xlDataAndLabel Selection.Interior.ColorIndex = 2 '白 Selection.Font.ColorIndex = 1 '黒 '============================================================ 'レイアウトを変更する .PivotFields("入荷地").Orientation = xlRowField '罫線の補正とラベルの書式設定をする For Each PvtLabel In Array("入荷地[All]", "品名[All;Total]") .PivotSelect PvtLabel, xlLabelOnly For Each PvtBorder In Array(xlEdgeLeft, xlEdgeBottom) With Selection.Borders(PvtBorder) .Weight = xlMedium .ColorIndex = ColorNo2 End With Next PvtBorder Next PvtLabel .PivotSelect "入荷日[All;Total]", xlDataOnly With Selection.Borders(xlEdgeTop) .Weight = xlMedium .ColorIndex = ColorNo2 End With '背景色とフォント色を変更する .PivotSelect "品名[All;Total]", xlDataAndLabel With Selection .Interior.ColorIndex = 34 '水色 .Font.ColorIndex = 10 '緑 End With '============================================================ 'レイアウトを変更する '行フィールドの"品名"と"入荷地"表示位置を入れ替える With .PivotFields("品名") .Orientation = xlRowField .Position = 3 End With '罫線の補正とラベルの書式設定をする .PivotSelect "入荷地[All;Total]", xlDataAndLabel With Selection For Each PvtBorder In Array(xlEdgeLeft, xlEdgeBottom) With .Borders(PvtBorder) .Weight = xlMedium .ColorIndex = ColorNo2 End With Next PvtBorder .Interior.ColorIndex = 2 '白 .Font.ColorIndex = 3 '赤 End With '============================================================ 'レイアウトを変更する '入荷地フィールドを行エリアに残し、品名フィールドを列エリアへ移動する .PivotFields("品名").Orientation = xlColumnField '罫線の補正とラベルの書式設定をする .PivotSelect "入荷日[All;Total]", xlDataOnly With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = 1 End With .PivotSelect "'Row Grand Total'", xlDataAndLabel With Selection.Borders(xlEdgeLeft) .Weight = xlMedium .ColorIndex = ColorNo2 End With '============================================================ 'レイアウトを変更する .AddFields RowFields:=Array("入荷日", "品名"), _ ColumnFields:="入荷地" '日付をグループ化させて集計 '処理の内容:入荷日を月と年でグループ化させ、最新月のみ絞り込んで集計する '日付をグループ化する .TableRange1.Range("A2").Group _ Start:=True, End:=True, Periods:=Array(False, _ False, False, True, True, False, True) 'グループ化した年と月をページエリアに移動する .PivotFields("月").Orientation = xlPageField .PivotFields("年").Orientation = xlPageField '年と月の非表示アイテムを設定し、表示アイテムを指定する With .PivotFields("年") .PivotItems(1).Visible = False .PivotItems(.PivotItems.Count).Visible = False .CurrentPage = myYear End With With .PivotFields("月") .PivotItems(1).Visible = False .PivotItems(.PivotItems.Count).Visible = False .CurrentPage = myMonth End With '処理終了 .TableRange1.Range("A1").Select 'イベント処理を有効にし、自動計算モードにする Application.EnableEvents = True Application.Calculation = xlCalculationAutomatic 'ピボットテーブルを更新する .RefreshTable End With 'オブジェクト変数の解放 Set PvtTbl = Nothing Set PvtSht = Nothing '画面表示を更新する 'Application.ScreenUpdating = True End Sub