如果数组为Nothing,则忽略并移至Excel VBA中的下一个

时间:2019-04-22 15:50:26

标签: excel vba

我正在尝试动态过滤OLAP数据透视表。根据用户是否选中某个月的复选框,它将相应地过滤数据透视表。可以选中几个框(几个月)。例如:如果他们检查4月和6月,则OLAP数据透视表将被过滤到4月和6月。这是我的代码:

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)

检查所有月份后,代码可以正常工作。但是,我在为用户选择4月和6月而不是5月的情况下努力寻找解决方案。在这种情况下,数组应为:

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

如何更改代码,以便在未选中复选框的情况下忽略该字段?

 ELse
 Apr18 = ""

不起作用。

注意:我有12个月了

2 个答案:

答案 0 :(得分:1)

我认为您需要随行构建一个数组(示例中为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

编辑1:

稍加修改以帮助您解决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

答案 1 :(得分:0)

也许尝试使用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)