数据透视表,如何使用VBA进行错误检查自动筛选列表

时间:2017-11-29 13:47:51

标签: excel vba excel-vba filtering pivot-table

我一直在使用下面的代码将报表中的所有数据透视表设置为过滤到同一个库存期间。

Private Sub Worksheet_Change(ByVal Target As Range)    
    On Error Resume Next
    Application.EnableEvents = False
    Application.ScreenUpdating = False

    Dim WS As Worksheet
    Dim pt As PivotTable
    Const strField As String = "stkperiod" 'This is the name of the pivot table filed you wish to change"

    If Target.Address = "$C$6" Then    
        For Each WS In ThisWorkbook.Worksheets
            For Each pt In WS.PivotTables
                With pt.PageFields(strField)
                    .ClearAllFilters
                    .PivotItems("(blank)").Visible = True
                    .CurrentPage = Target.Value
                End With
            Next pt
        Next WS
    End If

    Application.EnableEvents = True
    Application.ScreenUpdating = True    
End Sub

在找不到库存期之前,“守则”似乎运作良好。 例如,如果我将库存期间设置为12/2018,则数据透视表过滤器将自动设置为" all"结果2018是未来的日期,而不是我的数据集的一部分 我宁愿VBA将过滤器设置为"空白"如果日期不在列表中。

上面的代码没有给我任何错误,但我的用户感到困惑,他们认为"哇我们已经度过了一个好月份,而且只有第二天的交易!"他们不明白的是,该报告现已设定为今年的所有结果。

棘手的部分是表格中的日期范围并不总是相同。如果一个数据透镜具有12/2018的值,我想总计该数据透视表,并在其他没有此日期数据的其他数据上显示零。

我假设我可以从下面的列表中选择报告,我可以选择空白选项。 Pivot Filter

我虽然这很简单.....我可以预先过滤掉所有的枢轴,然后将空白"空白"然后应用我的自定义过滤器?但我只是不知道足够的VBA让它做我想做的事情!

你能提供的任何帮助都会很棒,谢谢你的时间。 R上。

2 个答案:

答案 0 :(得分:1)

  

我只是不知道足够的VBA让它做我想做的事情!

我将使用以下场景进行演示。请理解并妥善保存并适用于您的情况。

假设我们的数据和支点看起来像这样

enter image description here

现在我们将遵循的逻辑是

  1. 检查该字段是否存在于pivottable中
  2. 如果它不存在,则隐藏除blank以外的所有项目。我假设有一个空白项目,否则你会收到错误。
  3. 代码

    Sub Sample()
        Dim pt As PivotTable
        Dim pitem As PivotItem
    
        For Each pt In ActiveSheet.PivotTables
            If DoesFieldExist("MickyMouse", pt) Then
    
            Else
                '~~> it the field doesnt exist
                For Each pitem In pt.PivotFields("Name").PivotItems
                   If pitem.Value <> "(blank)" Then pitem.Visible = False
                Next
            End If
        Next pt
    End Sub
    
    '~~> Function to check if a field exists or not in a pivot table
    Function DoesFieldExist(fld As String, ptbl As PivotTable) As Boolean
        For Each pf In ptbl.PageFields
            If pf.Name = fld Then
                DoesFieldExist = True
                Exit Function
            End If
        Next pf
    End Function
    

    当你运行上面的代码时,由于没有名为“MickyMouse”的字段,项目将被隐藏。

    enter image description here

答案 1 :(得分:0)

以下是处理此问题的两种方法:

您可以使用数据&gt;数据验证。在下面的设置中,输入必须小于今天的日期,否则它将不允许输入。

enter image description here

或者,如果您想使用VBA,请在此行后面插入以下代码段:

如果Target.Address =&#34; $ C $ 6&#34;然后

Dim stkPeriod As Date

stkPeriod = Range("C6")

If stkPeriod >= Date Then

    MsgBox "Use a different date range."
    Exit Sub

    ' or you can do something else such as verifying
    '    that the date is present within your data table etc.

End If