【问题标题】:Selecting multiple slicer items based on a cell value根据单元格值选择多个切片器项目
【发布时间】:2023-03-30 09:45:01
【问题描述】:

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

因此,例如,将“201803”输入到 C17 中,然后 excel 计算值“2​​01725”并将其插入到 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 上。所以问题是,我猜,覆盖切片器项目选择。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    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
    

    【讨论】:

    • 感谢您的回复,Dy.Lee。但是,我在For Each sl In .SlicerItems 上仍然收到相同的错误(应用程序定义或对象定义错误)
    猜你喜欢
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多