2017-02-10 188 views
2

我有此代码选择日期并更改数据透视表的过滤器以反映相关信息。但有些时候这个工程有的时候它给我的vba中的数据透视表筛选器无法正常工作

错误1004应用程序定义或对象定义的错误

这是推动我疯了,我不知道发生了什么,尤其是因为这个代码起作用,然后它不会,没有任何改变。

Dim DataVenda As Date 
DataVenda = InputBox("Data de Vendas (dd/mm):") 

ActiveSheet.Range("B1").Select 
With Selection 
    ActiveSheet.PivotTables("DinTblResumoDiario").PivotFields("Data:").ClearAllFilters 
    ActiveSheet.PivotTables("DinTblResumoDiario").PivotFields("Data:").CurrentPage = DataVenda 
End With 

的错误是在最后的命令:ActiveSheet.PivotTables("DinTblResumoDiario").PivotFields("Data:").CurrentPage = DataVenda

+1

你会感觉好多了,当你把那个'ActiveSheet',改为纸张的代号明确,:) –

+0

您是否尝试过在确认页面,您正试图将其设置存在于过滤器内?另外,请尝试设置“EnableMultiplePageItems = False”。 –

+1

你知道吗,总是有输入项目? AFAIK,如果你尝试选择一个不存在的值,数据透视表会产生一个错误。 –

回答

0

像上面写的,最好避免使用ActiveSheetSelectSelection,并且使用完全合格的对象,而不是。

下面的代码我使用PivotTable类型的对象来定义和设置数据透视表,也为PivotField

我还添加了另一种类型的InputBox,强制用户输入格式为Date的值。

注意:有机会的话,在InputBox选择的值没有任何地方发现的数据透视表里面,所以我添加了一个方法来检查它在下面的代码。

代码

Option Explicit 

Sub OccupancyPivot() 

Dim wsSheet    As Worksheet 
Dim PT     As PivotTable 
Dim PTFld    As PivotField 
Dim DataVenda   As Date 

' use this type of Input Box to force the user to enter a date format 
DataVenda = Application.InputBox("Data de Vendas (dd/mm):", "Select date", FormatDateTime(Date, vbShortDate), Type:=1)  

Set wsSheet = ThisWorkbook.Worksheets("Sheet1") ' <-- modify "Sheet1" to your Pivot's sheet name 

On Error Resume Next 
Set PT = wsSheet.PivotTables("DinTblResumoDiario") ' set the PivotTable  
On Error GoTo 0 
If PT Is Nothing Then ' "DinTblResumoDiario" Pivot Table doesn't exist 
    MsgBox "Pivot Table 'DinTblResumoDiario' doesn't exist!" 
Else ' "DinTblResumoDiario" Pivot Table exists 
    Set PTFld = PT.PivotFields("Data:") ' <-- set the pivot field  
    PTFld.ClearAllFilters 

    On Error Resume Next 
    PTFld.CurrentPage = DataVenda ' Error line if DataVenda isn't valid (no value inside Pivot Table matches it) 
    If Err.Number <> 0 Then 
     MsgBox "Filter Didn't get applied, no value inside Pivot Table matches your selection" 
    End If 
    On Error GoTo 0 
End If 

End Sub