2016-11-15 12 views
0

У меня есть требование отфильтровать существующую сводную таблицу (сводная таблица1 в рабочем листе Pivot) в книге, основанной на датах, введенных пользователем на другом листе (элемент управления). Я должен добавить, что ячейки в контрольном листе имеют проверку данных на них, чтобы форсировать даты только в ячейках. Код, который я до сих пор это:Ошибка фильтра даты сводной таблицы (Недействительная дата)

Sub FilterPivotfromCell() 

Dim Invoice_Start_Date As Date 
Dim Invoice_End_Date As Date 

Invoice_Start_Date = CDate(Worksheets("Control").Cells(3, "E").Value) 

Invoice_End_Date = CDate(Worksheets("Control").Cells(3, "G").Value) 

Sheets("Pivot").Select 

MsgBox IsDate(Invoice_End_Date) 
MsgBox IsDate(Invoice_Start_Date) 

ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh 
ActiveSheet.PivotTables("PivotTable1").PivotFields("Date").ClearAllFilters 
ActiveSheet.PivotTables("PivotTable1").PivotFields("Date").PivotFilters.Add _ 
Type:=xlDateBetween, Value1:=Invoice_Start_Date, Value2:=Invoice_End_Date 

End Sub 

При пошаговом через код, используя клавишу F8, и с часами на переменные Invoice_Start_Date и Invoice_End_Date, все указывает на переменные, являющихся даты (тип показывает, как дата в окне просмотра , а в случае с сообщениями в окне «Исправление» возвращаются сообщения «Истина». Однако при запуске макроса, как только дело доходит до той части, где фильтруется сводная таблица, я получаю сообщение «Ошибка времени выполнения 1004», : Дата, указанная вами, не является действительной датой. Пожалуйста, попробуйте еще раз.

Я задаюсь вопросом, связано ли это с региональными настройками в Великобритании, поскольку я знаю, что в прошлом у меня были проблемы с этим.

Также, чтобы уточнить, содержимое ячейки E3 - 01/10/2016, а содержимое ячейки G3 - 31/10/2016.

Редактировать: Я пробовал следующее предложение here, но это не имело значения. Источник моей сводной таблицы также содержит пустые строки, но я попытался ограничить это только данными, и это не имело никакого значения.

Редактировать 2: Хорошо, вы не знали бы этого. Немного больше googling и придумал решение here. В основном, добавление формата clng вокруг дат в сводном фильтре сделало трюк?

+0

просто иметь более чистую и более эффективный код, вы могли бы объявить сводную таблицу, как 'Dim PvtTbl как PivotTable', а затем установить его' Set PvtTbl = ActiveSheet.PivotTables ("PivotTable1") ', а затем вы можете используйте его 'PvtTbl.PivotCache.Refresh' и т. д .... или вы также можете использовать' С PvtTbl' и вложить все команды под –

+0

@ShaiRado - спасибо, я очистил свой код, чтобы сделать это сейчас. – bawpie

ответ

0

Вот пересмотренный рабочий код в соответствии с ответом, предоставленным @ MP24 в этом question.

Sub FilterPivotfromCell() 

Dim Invoice_Start_Date As Date 
Dim Invoice_End_Date As Date 


Invoice_Start_Date = CDate(Worksheets("Control").Cells(3, "E").Value) 

Invoice_End_Date = CDate(Worksheets("Control").Cells(3, "G").Value) 

Sheets("Pivot").Select 

MsgBox IsDate(Invoice_End_Date) 
MsgBox IsDate(Invoice_Start_Date) 


ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh 
ActiveSheet.PivotTables("PivotTable1").PivotFields("Date").ClearAllFilters 
ActiveSheet.PivotTables("PivotTable1").PivotFields("Date").PivotFilters.Add _ 
Type:=xlDateBetween, Value1:=CLng(Invoice_Start_Date), Value2:=CLng(Invoice_End_Date) 

End Sub 
Смежные вопросы