根据单元格值选择多个切片器项

时间:2018-01-18 13:09:42

标签: excel vba excel-vba

我需要一个能够根据单元格值选择多个切片器项的VBA代码。这是用于制作每周报告,因此目标单元格将是C17,格式为" YYYYWW" (即2018年的第3周将是201803)并由用户输入。这就是我所说的endDate。 Excel本身然后计算开始周,默认情况下在endDate之前30周。随着单元格C17的值发生变化,宏应该自动触发。

所以,举个例子," 201803"进入C17并且excel然后计算值" 201725"并将其插入G17。在C17中输入一个新值会触发宏,该宏从读取单元格C17(endDate)和G17(startDate)的值开始。然后宏将取消选择所有切片器项(只使用一个切片器)并选择那些等于endDate或startDate,或者在两个值之间。因为2017年有52周," 201753"应该被覆盖到" 201801"。我知道这不是理想的解决方案,因为它需要每年更新,但它是我想出的最好的。

我在C中学到了很少的编程,但这是我在VBA中的第一个代码之一,所以任何指针都会受到赞赏。这是我到目前为止所得到的:

Private Sub Worksheet_Change(ByVal Target As Range)

'  18.01.2018 Oscar E.

    Dim startDate As Long
    Dim endDate As Long
    Dim n As Long
    Dim i As Long

    If Target.Address = "$C$3" Then
        endDate = Range("C17").Value
        startDate = Range("G17").Value
        With ActiveWorkbook.SlicerCaches("Slicer_YYYYWW")
            .ClearManualFilter
            For n = startDate To endDate
                If n = 201753 Then
                    n = 201801
                End If
                .SlicerItems(n).Selected = True
            Next
        End With
    End If
End Sub

现在,我正在接受

  

运行时错误' 1004':应用程序定义或对象定义错误

.SlicerItems(n).Selected = True附近。所以问题是,我猜,覆盖切片器项目选择。

1 个答案:

答案 0 :(得分:0)

SlicerItems必须是Stirng。但是当.ClearManualFilter选中所有项目时。不得选择所有项目。

Dim startDate As Long
Dim endDate As Long
Dim n As Long
Dim i As Long
Dim strN As String
Dim sl As SlicerItem

If Target.Address = "$C$3" Then
    endDate = Range("C17").Value
    startDate = Range("G17").Value
    With ActiveWorkbook.SlicerCaches("Slicer_YYYYWW")
        .ClearManualFilter
        For n = startDate To endDate
            If n = 201753 Then
                strN = CStr(201801)
            End If
        Next
      For Each sl In .SlicerItems
        If sl.Name = strN Then
            sl.Selected = True
        Else
            sl.Selected = False
        End If
    Next
    End With
End If