如果数组为空,则忽略并在Excel VBA中转到下一个数组

如果数组为空,则忽略并在Excel VBA中转到下一个数组,excel,vba,Excel,Vba,我正在尝试动态筛选OLAP数据透视表。根据用户是否选中某个月的复选框,它将相应地过滤轴。可以选中几个框(几个月)。例如:如果他们选中四月和六月,OLAP数据透视表将被过滤到四月和六月。这是我的密码: Dim Apr18 As String Dim May18 As String Dim Jun18 As String If Workbooks("A").Sheets("FilePath").CheckApr.Value = True Then Apr18 = "[Calenda

我正在尝试动态筛选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个月的时间

我认为您需要在运行时构建阵列(示例中为arr),类似于(未测试):


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

可以尝试使用
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)

它给我上一次的应用程序定义错误或对象定义错误line@Jade仅使用
arr
确定切片器?似乎您的示例代码中也会出现类似的错误,除非数组中没有添加某些内容(您可能需要使用
Debug.Print
验证数组中每个元素的名称是否按预期进行了打印…我尝试了Edit1代码,现在它在.Checkboxes(brr(I))行上给出了一个错误,“无法获取工作表类的复选框属性"…如何为每个元素使用Debug.Print?@Jade直接使用代码可能是一个问题,因为可能需要进行一些更改。在Edit1代码中,我假设您使用的复选框名称为CheckJan等,这可能不合适;这主要是如何将示例作为循环给出,以节省大量额外的资源代码行。专注于您之前的注释和
Debub.Print
,在代码中,您可以将类似于
For i=lbound(arr)的内容添加到ubound(arr)
中,然后添加
debug.Print arr(i)
并且您应该在
立即窗口中看到值。这将允许您查看格式是否正确。@如果可能,让我们关注第一组代码,以便我们可以处理1004错误周围的错误。错误是在目标端还是使用
arr
造成的?
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)