Excel2003のピヴォットテーブルでリストで選択した値に変更しない方法

このQ&Aのポイント
  • Excel2003のピヴォットテーブルを利用して、一括でページフィールドを変更するVBAの記述について、ピヴォットアイテムがない場合にリストで選択した値に変更しない方法を解説します。
  • Excel2003のシート「PVT_graph」には複数のピヴォットテーブルがありますが、参照先データは全て同じです。
  • VBAの記述では、セル$G$1の値が変更された場合には、「月」フィールドを選択された値に変更し、セル$E$1の値が変更された場合には、「年」フィールドを選択された値に変更します。しかし、選択された値がピヴォットアイテムとして存在しない場合には、リストで選択した値に変更してしまいます。この問題を解決するために、どのような修正を加えれば良いのかを詳しく説明します。
回答を見る
  • ベストアンサー

excel2003のピヴォットテーブル

excel2003を利用しています。 PVT_graphという名前のシートに複数のピヴォットテーブルがあります。 それぞれのピヴォットテーブルの参照先データは全て同じです。 ページフィールドをそれぞれ同じ値に変更する手間を省くために、 vbaで一括して変更するようにしていますが、 該当するピヴォットアイテムがない場合に、今選択されているアイテム をリストで選択した値に変更してしまいます。 リストとは、違うシートに入力規則で1~12の値を登録していますが、 ピヴォットテーブル側では、1~12全てに対して、ピヴォットアイテムがないのです。 下記、VBAの記述に対して、どのような修正を加えれば、ピヴォットアイテムがない場合に リストで選択した値に変更しないようにできるでしょうか? Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False If Target.Address = "$G$1" Then For Each pvt_tbl In Worksheets("PVT_graph").PivotTables pvt_tbl.PivotFields("月").CurrentPage = Target.Value Cancel = True Next ElseIf Target.Address = "$E$1" Then For Each pvt_tbl In Worksheets("PVT_graph").PivotTables pvt_tbl.PivotFields("年").CurrentPage = Target.Value Cancel = True Next Application.ScreenUpdating = True ThisWorkbook.RefreshAll End If End Sub

  • puyopa
  • お礼率87% (459/525)

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

>それぞれのピヴォットテーブルの参照先データは全て同じです。 このご説明から,各テーブルはフィールド(=アイテム)をデータ共有できてるとします >ピヴォットアイテムがない場合にリストで選択した値に変更しないようにできるでしょうか リストで選択した値(1から12)を間違い無くTarget.valueで取得できてる所から dim pfi as pivotitem dim flg as boolean for each pfi in activesheet.pivottables(1).pagefields(1).pivotitems if pfi.value = trim(str(target.value)) then flg = true exit for end if next if not flg then msgbox "NOT EXIST" : end

puyopa
質問者

お礼

keithin様 回答ありがとうございます。 頂いた記述を参考にして、見事に上手くいきました。 これは無理なのではないか。と半ば諦めていただけに、 喜びがとても大きかったです。 本当にありがとうございました。

関連するQ&A

  • マクロ 連続印刷

    マクロ初心者です。 ピボットテーブルでマクロを使って連続印刷をしようと思いました。 一応やってみて連続で印刷は出来たのですが番号がないときエラーになってしまします。 たとえば"562"という番号がないときエラーになって止まってしまいます。 番号がないときは飛ばして印刷するにはどのようにしたらよいでしょうか? よろしくお願いします。 Sub 連続印刷() ' ' 連続印刷 Macro ' ' ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _ IgnorePrintAreas:=False ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("コンポコード").ClearAllFilters ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("コンポコード").CurrentPage = _ "562" ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _ IgnorePrintAreas:=False ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("コンポコード").ClearAllFilters ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("コンポコード").CurrentPage = _ "947" ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _ IgnorePrintAreas:=False ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _ IgnorePrintAreas:=False ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("コンポコード").ClearAllFilters ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("コンポコード").CurrentPage = _ "950" ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _ IgnorePrintAreas:=False ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("コンポコード").ClearAllFilters ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("コンポコード").CurrentPage = _ "952" End Sub

  • EXCEL2007 VBAでピボットのフィルタ指定

    EXCEL 2007 VBAでピボットテーブルを生成しようとしております。 レポートフィルタで初期表示するデータフィールド「メーカー」の値も 指定できればと思っております。 「メーカー」には今回データで「A」「B」「C」「D」「E」とあったとして 「メーカー」 ... 「A」と「C」だけで表示指定したいとして、 下記操作で記録マクロを取ってみました。 1. レポートフィルタ「メーカー」を追加 2. フィルタ条件で「(すべて)」のチェック外して、全て消す。 3. 「メーカー」 ... 「A」と「C」を指定 結果は希望通りなのですが、 記録マクロを確認すると下記のように「A」と「C」で指定できておりません。 これだとメーカー「F」のデータが追加された際、 希望通りでないと思うのですが、良い方法をどなたかご存じないでしょうか? ActiveSheet.PivotTables("数量予測").PivotFields("メーカー").CurrentPage = "(All)" With ActiveSheet.PivotTables("数量予測").PivotFields("メーカー") .PivotItems("B").Visible = False .PivotItems("D").Visible = False .PivotItems("E").Visible = False End With

  • 画面のちらつきを無くす

    よろしくお願いします。 1:シート上のセルからユーザーフォーム(フォームあ)を開く。 2:ユーザーフォームには、リストボックスが3つあります。   (リスト1、リスト2、リスト3)  リスト1から項目を選択、次にリスト2を選択した時と、リスト3を  選択したときに、画面がちらつきます。 このチラつきがないように、出来ないでしょうか。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   If Target.Row > 4 And Target.Row < 233 And Target.Column > 5 And Target.Column < 7 Then   フォームあ.Show vbModeless   Else    Unload フォームあ   End If End Sub Private Sub リスト1_Click()  Application.ScreenUpdating = False   With リスト1ActiveCell.Offset(0, 0).Activate    ActiveCell.Value = .List(.ListIndex, 0)    ActiveCell.Offset(0, 0).Value = .List(.ListIndex, 0)     ActiveCell.Offset(0, 0).Activate   End With  Application.ScreenUpdating = True End Sub Private Sub リスト2_Click()  Application.ScreenUpdating = False   With リスト2    ActiveCell.Offset(0, 3).Activate    ActiveCell.Value = .List(.ListIndex, 0)    ActiveCell.Offset(0, 0).Value = .List(.ListIndex, 0)     ActiveCell.Offset(0, -3).Activate   End With  Application.ScreenUpdating = True End Sub Private Sub リスト3_Click()  Application.ScreenUpdating = False   With リスト3    ActiveCell.Offset(0, 3).Activate    ActiveCell.Offset(1, 0).Activate    ActiveCell.Value = .List(.ListIndex, 0)    ActiveCell.Offset(0, 0).Value = .List(.ListIndex, 0)     ActiveCell.Offset(-1, 0).Activate     ActiveCell.Offset(0, -3).Activate   End With  Application.ScreenUpdating = True End Sub

  • EXCEL2003 VBAで動作が速くなるようにマクロ記述したいのです

    EXCEL2003 VBAで動作が速くなるようにマクロ記述したいのですが、どのように行えばいいのでしょうか? Sheet1のA1からA300まで、関数によって計算されたデータが格納されています。 そのA1からA300の値(関数の計算結果のみ)を、コマンドボタンをクリックした時にSheet2のA1からA300にコピーしています。 コマンドボタンをクリックする度に、Sheet1のA1からA300までの値を、Sheet2に列を変えてコピーし、値を蓄積する方法を取っています。 以下のマクロを記述して走らせてみましたが、動作が遅いのが気になります。 コピーして貼り付けている動作が遅くなっているのでしょうか? もう少し早くなる方法はありますでしょうか? よろしくお願いします。 Sub CommandButton1_Click1() Dim I Dim N Worksheets("sheet1").Range("F1").Value = Range("F1").Value + 1 N = Worksheets("sheet1").Range("F1").Value For I = 1 To 300  Application.ScreenUpdating = False   Worksheets("sheet1").Cells(I, 1).Copy   Worksheets("sheet2").Cells(I, N).PasteSpecial Paste:=xlValues  Application.ScreenUpdating = True Next End Sub

  • マクロ実行時にエラーが出てしまいます

    マクロを記録し、それを実行しようとしたのですが、途中で下記のようなエラーが出てしまいます。 実行時エラー '1004': PivotTableクラスのPivotFieldsプロパティを取得できません。 黄色い矢印がとまっているのは下記の箇所です。 →With ActiveSheet.PivotTables("ピボットテーブル").PivotFields("送付先")← 自分なりに調べてみたのですが、選択範囲("E2:E1288"等の箇所)が違うデータでマクロを実行するとエラーになるのだと思っているのですが、選択範囲が毎回変わるのに対応できるコードの変更の仕方が分かりません。 もしよろしければ、アドバイスを頂けませんでしょうか。 コードの全体は下記になります。 Sheets("本体").Select Range("E1").Select ActiveCell.FormulaR1C1 = "品目分け" Range("E2").Select ActiveCell.FormulaR1C1 = "=LEFT(RC[-2],1)" Range("E2").Select Selection.AutoFill Destination:=Range("E2:E1288") Range("E2:E1288").Select Sheets("計算結果").Select ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase,SourceData:= _ "本体!C1:C5").CreatePivotTable TableDestination:="[計算用.xls]計算結果!R3C1", _ TableName:="ピボットテーブル", DefaultVersion:=xlPivotTableVersion10 ActiveSheet.PivotTables("ピボットテーブル").ColumnGrand = False With ActiveSheet.PivotTables("ピボットテーブル").PivotFields("送付先") .Orientation = xlRowField .Position = 1 End With With ActiveSheet.PivotTables("ピボットテーブル").PivotFields("品目分け") .Orientation = xlColumnField .Position = 1 End With Range("E4").Select ActiveSheet.PivotTables("ピボットテーブル").AddDataField ActiveSheet.PivotTables( _"ピボットテーブル").PivotFields("数量"), "データの個数 / 数量", xlCount ActiveSheet.PivotTables("ピボットテーブル").PivotFields("データの個数/ 数量").Function = _xlSum With ActiveSheet.PivotTables("ピボットテーブル").PivotFields("品目分け") .PivotItems("(空白)").Visible = False End With Range("A1").Select End Sub

  • マクロ実行時にエラーが出てしまいます

    マクロを記録し、それを実行しようとしたのですが、途中で下記のようなエラーが出てしまいます。 実行時エラー '1004': PivotTableクラスのPivotFieldsプロパティを取得できません。 黄色い矢印がとまっているのは下記の箇所です。 →With ActiveSheet.PivotTables("ピボットテーブル").PivotFields("送付先")← 自分なりに調べてみたのですが、選択範囲("E2:E1288"等の箇所)が違うデータでマクロを実行するとエラーになるのだと思っているのですが、選択範囲が毎回変わるのに対応できるコードの変更の仕方が分かりません。 もしよろしければ、アドバイスを頂けませんでしょうか。 コードの全体は下記になります。 Sheets("本体").Select Range("E1").Select ActiveCell.FormulaR1C1 = "品目分け" Range("E2").Select ActiveCell.FormulaR1C1 = "=LEFT(RC[-2],1)" Range("E2").Select Selection.AutoFill Destination:=Range("E2:E1288") Range("E2:E1288").Select Sheets("計算結果").Select ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase,SourceData:= _ "本体!C1:C5").CreatePivotTable TableDestination:="[計算用.xls]計算結果!R3C1", _ TableName:="ピボットテーブル", DefaultVersion:=xlPivotTableVersion10 ActiveSheet.PivotTables("ピボットテーブル").ColumnGrand = False With ActiveSheet.PivotTables("ピボットテーブル").PivotFields("送付先") .Orientation = xlRowField .Position = 1 End With With ActiveSheet.PivotTables("ピボットテーブル").PivotFields("品目分け") .Orientation = xlColumnField .Position = 1 End With Range("E4").Select ActiveSheet.PivotTables("ピボットテーブル").AddDataField ActiveSheet.PivotTables( _"ピボットテーブル").PivotFields("数量"), "データの個数 / 数量", xlCount ActiveSheet.PivotTables("ピボットテーブル").PivotFields("データの個数/ 数量").Function = _xlSum With ActiveSheet.PivotTables("ピボットテーブル").PivotFields("品目分け") .PivotItems("(空白)").Visible = False End With Range("A1").Select End Sub

  • VBAでのセルの複数選択時の処理について

    現在EXCEL VBAである行の値が変わったときにその列の塗りつぶしの 色を変えるといった処理を作成しております。 そこで、複数選択して値を変えた場合の処理が変数の型が一致しません 的なエラーが表示されてしまいます。 どのように修正したらうまくいくでしょうか? 教えてください。 ソースは下記の通りとなります。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 13 Then Exit Sub Application.EnableEvents = False MsgBox (Target.Rows.Count) Dim rngSelectRng As Range For Each rngSelectRng In Target If rngSelectRng.Value = "" Then rngSelectRng.Value = " " 'ステータス欄の入力の判断 'Select Case Target.Rows.Value MsgBox (Target.Row) Select Case rngSelectRng.Value Case "あああ" Worksheets("表1").Rows(Target.Row).Interior.ColorIndex = 24 Case "いいい" Worksheets("表1").Rows(Target.Row).Interior.ColorIndex = 35 Case "ううう" Worksheets("表1").Rows(Target.Row).Interior.ColorIndex = 38 Case "えええ" Worksheets("表1").Rows(Target.Row).Interior.ColorIndex = 36 Case "おおお" Worksheets("表1").Rows(Target.Row).Interior.ColorIndex = 16 Case Else Worksheets("表1").Rows(Target.Row).Interior.ColorIndex = 2 End Select Next Application.EnableEvents = True End Sub

  • vbs ピボットテーブル更新 ODBC接続

    現在、vbsを使用してExcelピボットテーブルを自動更新する仕組みを作成しております。 更新対象のピボットテーブルですが、ODBC接続でoracle(10g)を参照しており、 ピボット更新時にパスワードの入力を求められます。 これをvbsファイル内でパスワードを渡して実行するように出来ないでしょうか? 下記のスクリプトのみだとパスワードにnullが挿入されましたとうエラーがでて更新できません。 '1.1. ファイルコピー 'objFSO.CopyFile szWBTemplate, szWBOutput,True '2.0. ワークブック OPEN objEXCEL.Workbooks.Open szWBTemplate '2.1. エクセル画面を非表示 objEXCEL.DisplayAlerts = False objEXCEL.Visible = False objEXCEL.ScreenUpdating = False objEXCEL.Calculation = -4135 WScript.sleep(1000) objEXCEL.ScreenUpdating = True objEXCEL.Calculation = -4105 '2.2. Reflesh Pivot Tables For Each objxlSh in objEXCEL.Worksheets For Each objPvt In objxlSh.PivotTables objPvt.RefreshTable Next Next よろしくお願いいたします。

  • ピボットフィールドの切替

    VBAでピボットテーブルフィールドの切替を自動化しようと試みたのですが、なかなかうまくいきません。どなたかご教示して頂ければ幸いです。 ピボットテーブルフィールド名:月 というピボットフィールドに1月~12月のアイテムがあります。 しかし、当月以降(ここでは11月、12月)はデータがないため、非表示になっており、1月~10月までしかコンボリストに表示しません。 また、フィールドリストに「表示しないアイテム」が設定されているため、アイテムが計44個あります。 当初は… Dim i as Integer Dim s as String with Worksheets("sheet1").PivotTables("PivotTable") i = .PivotFields("月").PivotItems.Count - 3 ← 41番目(10月が存在) s = .PivotFields("月").PivotItems.Item(i) ← "10月" という文字列を取得 .PivotFields("月").CurrentPage = s ← 10月をセット End With この様にしていたのですが、11月になった場合、11月がピボットテーブルフィールドに表示されるのですが、i= 部分で - 3 しているため常に10月が出てしまう状態です。 何をしたいかと要約すると 下のようにピボットテーブルフィールドに表示されている最終行の10月に変えるにどのメソッドを使えばよろしいのでしょうか? (すべて) 1月 2月 (略) 9月 10月 ←ドロップダウンすると最終行 (11月)←アイテムに存在するが、ドロップダウンすると非表示 (12月)←アイテムに存在するが、ドロップダウンすると非表示

  • ピボットテーブルをVBAで管理

    ご教授下さい。 ・車両管理をしており、データの集計をとるため、ピボットテーブルを使用しています。 ・データは(日付)(車番)(品番)(品目)(数量)となっていまして、入力する際はフォームで記入しています。 ・品目は10個あり、シート上に品番表を作り、LOOKUP関数で参照しています。 (品番を入力すれば品目が自動転記される形です。) ・品目(品番)は使われない場合もあります。(ここでつまづいてます。) 品目毎にシートを分けて、10個ピボットテーブルを作っていて、 全品目を使用している場合問題はないのですが、 9品目しか使用していない場合でピボットアイテムエラーが出てしまいます。この部分を回避する策はありませんでしょうか? また、テーブルを10個に分けているため、コード自体もかなり長くなっています。もっと簡素化できる方法があれば併せて教えていただければと思います。 コードも載せておきます。(これと同様のものが10回ループしてます。) '軽油 Dim strDataRng1 As String strDataRng = ActiveWorkbook.Worksheets("燃料").Range("A1").CurrentRegion.Address(, , xlR1C1) ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _ "'燃料'!" & strDataRng).CreatePivotTable TableDestination:="", _ TableName:="軽油", DefaultVersion:=xlPivotTableVersion10 With ActiveSheet.PivotTables("軽油").PivotFields("車番") .Orientation = xlColumnField .Position = 1 End With ActiveSheet.PivotTables("軽油").AddDataField ActiveSheet.PivotTables( _ "軽油").PivotFields("数量"), "合計 / 数量", xlSum With ActiveSheet.PivotTables("軽油").PivotFields("日付") .Orientation = xlRowField .Position = 1 End With With ActiveSheet.PivotTables("軽油").PivotFields("品目") .Orientation = xlRowField .Position = 1 End With With ActiveSheet.PivotTables("軽油").PivotFields("品目") .PivotItems("軽油").Visible = True .PivotItems("灯油").Visible = False .PivotItems("ガソリン").Visible = False .PivotItems("ハイオク").Visible = False .PivotItems("オイル").Visible = False .PivotItems("エレメント").Visible = False .PivotItems("クーラント").Visible = False .PivotItems("バッテリー液").Visible = False .PivotItems("洗車").Visible = False .PivotItems("電球").Visible = False End With

専門家に質問してみよう