在某些条件下标记字段的pivotitems

时间:2016-01-22 08:14:47

标签: vba pivotitem

我有几个pivotfields,我想在某些条件下标记字段的pivotitems。我尝试过使用.visible并使用了此application.screenupdatingapplication.displayfilters。但是不能选择或取消激活枢轴。我非常感谢每一个回复。

Filter_PivotField_by_Date_Range。这是我在我的主要调用的函数,只是为了给我的字段名称和我要比较的日期。 在2 if条件之后,我希望它标记(选择/勾选)字段中的pivotitems,否则取消标记/不选择其他的。让另一个看不见,然后只退出Sub。

如果你们有任何问题我真的会帮助你们清楚。如有任何意见或建议,我们将不胜感激。

    Sub Filter_PivotField_by_Date_Range(pvtField As PivotField, it1 As Date, it2 As Date)

        Dim bTemp As Boolean, i As Long
        Dim dtTemp As Date, dtTemp1 As Date


        dtTemp = Format(CDate(it1), "dd/mm/yyyy")
        dtTemp1 = Format(CDate(it2), "dd/mm/yyyy")
        On Error Resume Next

         With pvtField
          For i = 1 To .PivotItems.Count

           dtFrom = .PivotItems(i)
           If (dtTemp <= dtFrom) Then
               If (dtTemp1 >= dtFrom) Then
               On Error Resume Next
                       Application.ScreenUpdating = False
                       Application.DisplayAlerts = False
                       .PivotItems(i).Visible = True
                       MsgBox (dtFrom)
               Else
                  Application.ScreenUpdating = True
                  Application.DisplayAlerts = True
                   Exit Sub
               End If

            End If
          Next i

        End With

    End Sub

3 个答案:

答案 0 :(得分:0)

我尝试过一些小修改代码。它对我来说很完美。我也有这个假设,你的&#39; it1&#39;是开始日期和&#39; it2&#39;是结束日期。

 dtFrom = Format(CDate(.PivotItems(i)), "dd/mm/yyyy")

将日期范围值存储到数组。

    it1 = "01/01/2013"
    it2 = "01/01/2014"
    Dim dtTemp1 As Date
    Dim dtTemp2 As Date
    Dim dateArray()
    dtTemp1 = Format(CDate(it1), "dd/mm/yyyy")
    dtTemp2 = Format(CDate(it2), "dd/mm/yyyy")
    NoOfDays = DateDiff("D", dtTemp1, dtTemp2)
    ReDim dateArray(NoOfDays)

    For i = 0 To NoOfDays
    dateArray(i) = dtTemp1 + i
    Next

答案 1 :(得分:0)

我尝试了下面的一个并且它的工作正常,如果可能的话,可以分享你的相同日期。

    Option Explicit
    Sub Macro7()
    Dim StartDate As Date
    Dim EndDate As Date
    Dim pvtDATE As Date
    Dim pvtField As PivotField
    Dim x As PivotItem
    Dim it1
    Dim it2
    Dim y
    it1 = "2/2/2016"
    it2 = "2/20/2016"

    Set pvtField = Excel.Sheets("UrSheet").PivotTables("PivotTable3").PivotFields(2)

    StartDate = Format(CDate(it1), "dd/mm/yyyy")
    EndDate = Format(CDate(it2), "dd/mm/yyyy")


            For Each x In pvtField.PivotItems
            If (x.Value <> "(blank)") Then
             pvtDATE = Format(x.Value, "dd/mm/yyyy")

                If (StartDate <= pvtDATE) Then
                    If (EndDate >= pvtDATE) Then
                        x.Visible = True
                    Else
                        x.Visible = False
                    End If
                Else
                    x.Visible = False
                End If
            End If
            Next

    End Sub

答案 2 :(得分:0)

如果你有Excel 2010或更高版本并且这些数据透视表共享相同的数据透视表(即它们具有相同的数据源),那么你可以简单地设置一个切片器,然后将其连接到其他数据透视表。然后,您在其中所做的任何更改都将自动反映在其他更改中。(右键单击切片器并选择报告连接)。

关于您的代码失败的原因,您能否告知您正在使用的Excel版本以及PivotField的数字格式是什么?我怀疑代码是由于Excel中的错误导致代码失败,如果您使用Excel 2007或2010并且使用非美国区域日期设置并且数据透视图的数字格式设置为常规,则在识别日期变量时VBA会失败。 (如果源数据中有空格,数字格式将停留在General上。您需要摆脱这些空白。)

wrote about this here
 除了更改字段的数字格式之外,如果您使用的是Excel 2010,还可以从评论中try Micheal's approach

我认为这也是一个可能的解决方案at this SO thread

有关详情,请参阅以下链接:

Why is this PivotItem.Visible call throwing a TypeMismatch error? https://social.msdn.microsoft.com/Forums/office/en-US/01cb61c7-5e68-4a45-aeff-a70c6dbfe00f/excel-2007-accessing-pivotitemvisible-gives-error-if-the-field-item-value-is-a-date