Динамический скользящий X месяцев - Сводный фильтр множественного выбора - PullRequest
0 голосов
/ 05 октября 2018

Здравствуйте, я унаследовал панель управления, которая использует источник данных Microsoft Analysis Server.

Для повышения производительности я хочу, чтобы пользователь выбрал диапазон дат, например LastMonth Last3Months Last6Months

Я думал о том, чтобы вставить 3 кнопки Option, и когда пользователь выбирает кнопку, код VBA изменит выбор фильтра.

Я записал действие по выбору месяцев, но мне нужны предложения о том, как действовать.

Sub SelectMonth()
'
' SelectMonth Macro
'

'
ActiveSheet.PivotTables("pv_DateRange").PivotFields( _
    "[Date].[Month - Year].[Month - Year]").VisibleItemsList = Array( _
    "[Date].[Month - Year].&[201711]", "[Date].[Month - Year].&[201712]", _
    "[Date].[Month - Year].&[201801]", "[Date].[Month - Year].&[201802]", _
    "[Date].[Month - Year].&[201803]", "[Date].[Month - Year].&[201804]", _
    "[Date].[Month - Year].&[201805]", "[Date].[Month - Year].&[201806]", _
    "[Date].[Month - Year].&[201807]", "[Date].[Month - Year].&[201808]", _
    "[Date].[Month - Year].&[201809]")
End Sub 
  1. В приведенном выше примере я выбирал последние 12 полных месяцев.В этой ситуации октябрь 2017 года отсутствовал в моих данных, поэтому опция выбора октябрь 2017 не отображалась.Как я могу проверить, чтобы увидеть, что отображается?или игнорировать, если я пытаюсь установить значение, которое не отображается в списке фильтров.

  2. Как правильно рассчитать и установить каждый месяц в моем выборе фильтра VBA?

Спасибо, Стив

1 Ответ

0 голосов
/ 05 октября 2018

- 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
...