goo blog サービス終了のお知らせ 

半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■PivotItems().Visible = True エラー

2012-09-25 21:00:00 | 気をつけたほうがいいこと
#久々のテーマ投稿のような気が :)

PivotTablesをVBAで操作する時の話。
『RowFieldsやColumnFieldsにAutoSort(自動並べ替えオプション)が手動以外に設定されていると、
 そのPivotItems().Visible = True(アイテムを表示する)時に失敗する』
..という不具合があります。Excel97-2003の場合。2007,2010では発生しません。

対策としては「自動並べ替えオプション」を「手動」にする事で回避できます。

そう。こちらの話。
『マクロでピボットのPivotItemsのVisible = Trueができない』
http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+201209/12090023.txt

今にして思えば
『【58912】「PivotItemクラスのVisibleプロパティを設定できません。」の解決法』
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=58912;id=excel
これも同様のケースだったんですね。
#当時は知りませんでした。力不足で申し訳ない..orz



さて、検証用コード。
97-2010で共通動作するようにPivotTableWizardメソッドを使ってみた。

Option Explicit
'新規Workbookに簡易テストデータをセットしPivotTable作成。
'RowFields("F1")の自動並べ替えを昇順に設定。
Sub pre()
  With Workbooks.Add(xlWBATWorksheet).Sheets(1)
    .Range("A1:B2").Value = [{"F1","F2";"item01",1}]
    .Range("A2:B2").AutoFill .Range("A2:B10"), xlFillSeries
    With .PivotTableWizard(xlDatabase, "'" & .Name & "'!A1:B10", "")
      .PivotFields("F1").Orientation = xlRowField
      .PivotFields("F2").Orientation = xlDataField
      .RowFields("F1").AutoSort xlAscending, ""
    End With
  End With
End Sub
'-------------------------------------------------
'自動並べ替え昇順のままPivotItemsをLoopしてVisible = True
Sub test1()
  Dim p As PivotItem
  With ActiveSheet.PivotTables(1).RowFields("F1")
    For Each p In .PivotItems
      p.Visible = True
    Next
  End With
End Sub

エラー
『1004::PivotItem クラスの Visible プロパティを設定できません。』



'AutoSortメソッドで手動にするとエラーは出ません。
Sub test2()
  Dim p As PivotItem
  With ActiveSheet.PivotTables(1).RowFields("F1")
    .AutoSort xlManual, ""  '●
    For Each p In .PivotItems
      p.Visible = True
    Next
  End With
End Sub
'-------------------------------------------------
'念の為。
'既表示Itemを表示しようとするからエラーになっているわけではありません。
Sub test3()
  Dim i As Long
  With ActiveSheet.PivotTables(1).RowFields("F1")
    .AutoSort xlManual, ""
    For i = 2 To .PivotItems.Count
      .PivotItems(i).Visible = False
    Next
    Stop
    For i = 2 To .PivotItems.Count
      .PivotItems(i).Visible = True
    Next
    Stop
    .AutoSort xlAscending, ""
    For i = 2 To .PivotItems.Count
      .PivotItems(i).Visible = False
    Next
    Stop
    For i = 2 To .PivotItems.Count
      .PivotItems(i).Visible = True
    Next
  End With
End Sub

Comment    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ■Shell "cmd.exe /c md ""[dr... | TOP | ■PivotItems().Visible = Tru... »
最新の画像もっと見る

post a comment

ブログ作成者から承認されるまでコメントは反映されません。

Recent Entries | 気をつけたほうがいいこと