Если Array - Nothing, игнорируйте и переходите к следующему в Excel VBA. - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь динамически фильтровать сводную таблицу OLAP.В зависимости от того, установит ли пользователь флажок в течение определенного месяца или нет, он соответствующим образом отфильтрует сводку.Можно отметить несколько полей (несколько месяцев).Пример: если они проверят апрель и июнь, сводная таблица OLAP будет отфильтрована до апреля и июня.Вот мой код:

Dim Apr18 As String
Dim May18 As String
Dim Jun18 As String

    If Workbooks("A").Sheets("FilePath").CheckApr.Value = True Then
    Apr18 = "[Calendar].[Date Hierarchy].[Year].&[2018].&[April]"
    End If
    If Workbooks("A").Sheets("FilePath").CheckMay.Value = True Then
    May18 = "[Calendar].[Date Hierarchy].[Year].&[2018].&[May]"
    End If
    If Workbooks("A").Sheets("FilePath").CheckJun.Value = True Then
    Jun18 = "[Calendar].[Date Hierarchy].[Year].&[2018].&[June]"
    End If

    Workbooks("B").SlicerCaches("Slicer_Date_Hierarchy") _
    .VisibleSlicerItemsList = Array(Apr18, May18, Jun18)

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

Workbooks("B").SlicerCaches("Slicer_Date_Hierarchy") _ 
.VisibleSlicerItemsList = Array(Apr18, Jun18)

Как изменить код так, чтобы, если флажок снят, игнорировать это поле?Выполнение

 ELse
 Apr18 = ""

Не работает.

Примечание: у меня 12 месяцев

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Я думаю, вам нужно будет построить массив по ходу (например, arr), аналогично (не проверено):

dim arr as variant
Dim Apr18 As String, May18 As String, Jun18 As String
'
redim arr(0)
If Workbooks("A").Sheets("FilePath").CheckApr.Value = True Then
    if not arr(ubound(arr)) = "" then redim preserve arr(ubound(arr)+1) 'redimensions the array to be +1 size larger, preserviing previous data
    arr(ubound(arr)) = "[Calendar].[Date Hierarchy].[Year].&[2018].&[April]" 'put into array
End If
'add other items
Workbooks("B").SlicerCaches("Slicer_Date_Hierarchy") _
.VisibleSlicerItemsList = arr 'use array you generated

Edit1:

Немного изменив это, чтобы помочь счету за 12 месяцев:

dim arr as variant, brr as variant, crr as variant, i as long
brr = array("CheckJan","CheckFeb","CheckMar","CheckApr","CheckMay") 'etc...
crr = array("January","February","March","April","May") 'etc...
redim arr(0)
For i = lbound(brr) to ubound(brr) 'ensure brr and crr are the same length
    If Workbooks("A").Sheets("FilePath").CheckBoxes(brr(i)).Value = True Then
        if not arr(ubound(arr)) = "" then redim preserve arr(ubound(arr)+1) 'redimensions the array to be +1 size larger, preserviing previous data
        arr(ubound(arr)) = "[Calendar].[Date Hierarchy].[Year].&[2018].&[" & crr(i) & "]" 'put into array
    End If
next i
Workbooks("B").SlicerCaches("Slicer_Date_Hierarchy").VisibleSlicerItemsList = arr 'use array you generated
0 голосов
/ 22 апреля 2019

Может быть, попытаться использовать Split для создания массива из строки (которую вы можете создать)? Несколько уродливый пример:

Dim list As String
list = list & "|abc"
list = list & "|def"
Dim arr As Variant: arr = Split(Mid(list, 2), "|")  ' assumes list non-empty; ignore first char (delimiter)

Debug.Print arr(0)
Debug.Print arr(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...