0

我有几个枢轴字段,我想用一些条件标记字段的枢轴项。我尝试过使用.visible并且也使用过这个application.screenupdatingapplication.displayfilters. 但不是选择或删除枢轴项。我真的很感激每一个回复。

Filter_PivotField_by_Date_Range. 这是我在 main 中调用的一个函数,只是为了提供我的字段名称和我想要比较的日期。在 2 个 if 条件之后,我希望它标记(选择/勾选)字段中的枢轴项,否则取消标记/不选择其他的。使另一个不可见,然后退出 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
4

3 回答 3

0

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

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

在这里写过这个,除了更改字段的数字格式之外,如果您有 Excel 2010
,您可能还想从评论中尝试 Micheal 的方法。

我看到这个 SO thread也有一个可能的解决方案。

有关更多信息,请参见以下链接:

为什么这个 PivotItem.Visible 调用会引发 TypeMismatch 错误? https://social.msdn.microsoft.com/Forums/office/en-US/01cb61c7-5e68-4a45-aeff-a70c6dbfe00f/excel-2007-accessing-pivotitemvisible-gives-error-if-the-field-item-价值即日期

于 2016-02-17T18:31:35.713 回答
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
于 2016-01-22T14:42:26.003 回答
0

我已经对您的代码进行了少量修改。它对我来说非常有效。我也有这个假设,你的“it1”是开始日期,“it2”是结束日期。

 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
于 2016-01-22T11:08:14.830 回答