0

私は VBA を初めて使用し、ピボット テーブルを作成するマクロを作成しようとしています。さまざまなフィールドをフィルタリングする必要があり、Pivo​​tFilters.Add と PivotItems を使用して特定のものだけを通過させようとしました...時には機能しますが、エラーをスローすることもあります。次のコードは問題なく動作します。

Sub CreatePivot()
Dim objTable As PivotTable, objField As PivotField

ActiveWorkbook.Sheets("CP Monthly Data").Select
Range("A1").Select
Set objTable = Sheet1.PivotTableWizard
objTable.Name = "Resource Requests"
objTable.InGridDropZones = True
objTable.RowAxisLayout xlTabularRow

Set objField = objTable.PivotFields("Company name")
objField.Orientation = xlRowField
objField.Position = 1

Set objField = objTable.PivotFields("Probability Status")
objField.Orientation = xlRowField
objField.Position = 2
objField.PivotItems("X - Lost - 0%").Visible = False
objField.PivotItems("X - On Hold - 0%").Visible = False
objField.AutoSort xlDescending, "Probability Status"

Set objField = objTable.PivotFields("Project")
objField.Orientation = xlRowField
objField.Position = 3

Set objField = objTable.PivotFields("Project manager")
objField.Orientation = xlRowField
objField.Position = 4

Set objField = objTable.PivotFields("Resource name")
objField.Orientation = xlRowField
objField.Position = 5
objField.AutoSort xlAscending, "Resource name"

Set objField = objTable.PivotFields("June, 2012")
objField.Orientation = xlDataField
objField.Function = xlSum
objField.NumberFormat = "##"
objField.Caption = "June"

Set objField = objTable.PivotFields("Workgroup Name")
objField.Orientation = xlPageField
objField.PivotItems("ATG").Visible = False
objField.PivotItems("India - ATG").Visible = False
objField.PivotItems("India - Managed Middleware").Visible = False

Application.DisplayAlerts = True
End Sub

「リソース名」フィールドで問題が発生しています。「*TBD」で始まるリソース名のみを表示し、名前に「ATG」が含まれるものは除外する必要があります。私はこれまでに次のことを試しました:

Set objField = objTable.PivotFields("Resource name")
objField.Orientation = xlRowField
objField.Position = 5
objField.PivotFilters.Add xlCaptionContains, Value1:="TBD"
objField.PivotFilters.Add xlCaptionDoesNotContain, Value1:="ATG"
objField.AutoSort xlAscending, "Resource name"

「実行時エラー '1004': アプリケーション定義またはオブジェクト定義のエラー」を返します

名前に「TBD」のないものも除外する必要があるため、これはまさに私が必要とするものではありませんが、試してみました:

Set objField = objTable.PivotFields("Resource name")
objField.Orientation = xlRowField
objField.Position = 5
objField.PivotItems("*ATG*").Visible = False
objField.AutoSort xlAscending, "Resource name"

「実行時エラー '1004': PivotField クラスの PivotItems プロパティを取得できません」を返します

また、マクロを記録して、結果を自分のコードと照合してみました。結果は、私が試した PivotFilters.Add を使用します。記録されたマクロと私のコードの主な違いは PivotTableWizard の使用です。

これを修正する方法についてのアイデアはありますか? 私は Excel 2010 を使用しており、これを検索するのに何時間も費やしましたが、試したことはありません。助けてくれてありがとう!!

4

1 に答える 1

1

残念ながら、同じ種類のフィルターを PT の 1 つのフィールドに適用することはできません。このリンクは、それについてのまともな読み物です。

問題を解決するには、上記の投稿でこのコード ブロックを置き換えることができます。

Set objField = objTable.PivotFields("Resource name")
objField.Orientation = xlRowField
objField.Position = 5
objField.AutoSort xlAscending, "Resource name"

以下のコードで:

'1) Filter on any thing that contains `TBD`
Set objField = objTable.PivotFields("Resource name")
objField.Orientation = xlRowField
objField.Position = 5
objField.PivotFilters.Add xlCaptionContains, Value1:="TBD"

'2) Loop through the items in the field and uncheck anything with `ATG` in the name
Dim pi As PivotItem
Dim i as Integer

For i = 1 To objField.PivotItems.Count
    If InStr(1, objField.PivotItems(i), "ATG") <> 0 Then
        objField.PivotItems(i).Visible = False
    End If
Next

objField.AutoSort xlAscending, "Resource name"
于 2012-06-22T20:01:19.437 に答える