我一直在使用下面的代码将报表中的所有数据透视表设置为过滤到同一个库存期间。
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的值,我想总计该数据透视表,并在其他没有此日期数据的其他数据上显示零。
我虽然这很简单.....我可以预先过滤掉所有的枢轴,然后将空白"空白"然后应用我的自定义过滤器?但我只是不知道足够的VBA让它做我想做的事情!
你能提供的任何帮助都会很棒,谢谢你的时间。 R上。
答案 0 :(得分:1)
我只是不知道足够的VBA让它做我想做的事情!
我将使用以下场景进行演示。请理解并妥善保存并适用于您的情况。
假设我们的数据和支点看起来像这样
现在我们将遵循的逻辑是
blank
以外的所有项目。我假设有一个空白项目,否则你会收到错误。代码
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”的字段,项目将被隐藏。
答案 1 :(得分:0)
以下是处理此问题的两种方法:
您可以使用数据&gt;数据验证。在下面的设置中,输入必须小于今天的日期,否则它将不允许输入。
或者,如果您想使用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