- NOT TESETD -
Предполагается, что выбранный вами фильтр останется в формате "ггггмм" или объединит год и месяц.
У меня нет сводных таблиц OLAP, но я использовал фильтрацию даты и некоторые другие сводки в VBA, поэтому я надеюсь, что это работает, но это не проверено.
Если вы хотите использовать 3 кнопки выбора и иметь только последний 1 месяц, последние 3 месяца или последние 6 месяцев, вы можете вставить эти 3 кнопки в таблицу в виде командных кнопок ActiveXObject.
В проводнике проекта VBA:перейдите к тем листам, где появляются кнопки, и вы увидите подпрограммы для CommandButton1_Click (), CommandButton2_Click () и CommandButton3_Click ().Для частных подпрограмм поместите этот код, где подгруппы командных кнопок:
Private Sub CommandButton1_Click()
SelectMonth (1)
End Sub
Private Sub CommandButton2_Click()
SelectMonth (3)
End Sub
Private Sub CommandButton3_Click()
SelectMonth (6)
End Sub
Затем для вашего записанного макроса замените его следующим:
Sub SelectMonth(NumOfMonths As Integer)
'
' Select Month Macro
'
'
' Declares string variables for the last 6 months relative to today
Dim Past1Month, Past2Month, Past3Month, Past4Month, Past5Month, Past6Month As String
Past1Month = Format(DateAdd("m", -1, Date), "yyyymm")
Past2Month = Format(DateAdd("m", -2, Date), "yyyymm")
Past3Month = Format(DateAdd("m", -3, Date), "yyyymm")
Past4Month = Format(DateAdd("m", -4, Date), "yyyymm")
Past5Month = Format(DateAdd("m", -5, Date), "yyyymm")
Past6Month = Format(DateAdd("m", -6, Date), "yyyymm")
'determines which button is pressed and filters pivot to desired selection
If NumOfMonths = 1 Then
ActiveSheet.PivotTables("pv_DateRange").PivotFields( _
"[Date].[Month - Year].[Month - Year]").VisibleItemsList = Array( _
"[Date].[Month - Year].&[" & Past1Month & "]")
ElseIf numofmonth = 3 Then
ActiveSheet.PivotTables("pv_DateRange").PivotFields( _
"[Date].[Month - Year].[Month - Year]").VisibleItemsList = Array( _
"[Date].[Month - Year].&[" & Past1Month & "]", _
"[Date].[Month - Year].&[" & Past2Month & "]", _
"[Date].[Month - Year].&[" & Past3Month & "]")
ElseIf numofmonth = 6 Then
ActiveSheet.PivotTables("pv_DateRange").PivotFields( _
"[Date].[Month - Year].[Month - Year]").VisibleItemsList = Array( _
"[Date].[Month - Year].&[" & Past1Month & "]", _
"[Date].[Month - Year].&[" & Past2Month & "]", _
"[Date].[Month - Year].&[" & Past3Month & "]", _
"[Date].[Month - Year].&[" & Past4Month & "]", _
"[Date].[Month - Year].&[" & Past5Month & "]", _
"[Date].[Month - Year].&[" & Past6Month & "]")
End If
End Sub
Другой вариант - динамический выбор,Таким образом, пользователь может ввести любое количество месяцев.Вам просто понадобится 1 командная кнопка и ее код:
Private Sub CommandButton4_Click()
Dim x As Variant
x = InputBox("Enter Desired Number of Months to View", "Last X Months", 1)
If Not IsNumeric(x) Or x < 1 Then
MsgBox "Please enter a valid positive number.", vbCritical, "ERROR"
Exit Sub
End If
x = CInt(x)
SelectMonthDynamic (x)
End Sub
Затем в модуле поместите этот код:
Sub SelectMonthDynamic(NumOfMonths As Integer)
'
' User can enter any month
'
Dim DateArray() As Variant
Dim i As Integer
Dim PastXMonths As String
'creates an array that is the same size as your user's selection in months
ReDim DateArray(1 To NumOfMonths) As Variant
'adds each month to the array in descending order
For i = NumOfMonths To 1 Step -1
DateArray(i) = "[Date].[Month - Year].&[" & Format(DateAdd("m", -i, Date), "yyyymm") & "]"
Next i
'concatenates the values in the array with a comma separator
PastXMonths = Join(DateArray, ",")
'filters the pivot to that selection
' NOT SURE IF THIS WORKS
ActiveSheet.PivotTables("pv_DateRange").PivotFields( _
"[Date].[Month - Year].[Month - Year]").VisibleItemsList = Array(PastXMonths)
End Sub