【问题标题】:Need VBA code to display multiple slicer selections in excel cell需要 VBA 代码才能在 excel 单元格中显示多个切片器选择
【发布时间】:2015-08-26 16:40:07
【问题描述】:

这是我第一次使用 VBA。我需要在 Excel 电子表格中显示切片器选择。每张表中有 15-20 个切片器,最多有 50 个可能的选择,所以我不想使用多维数据集代码在每个单元格中显示一个选择。如果可能,我希望它们在一个单元格中用逗号分隔(或返回“全部”或“无”)。

这是我通过对本网站和其他网站的研究以及尝试自己编辑而拼凑的内容(因此它可能完全是一团糟)。

我放弃搜索和寻求帮助!如果您能向我指出一个简单的“速成课程”VBA 基础知识网站,我也将不胜感激。谢谢你。

Public Function GetSlicerItems()
Dim cache As Excel.SlicerCaches
Set cache = ThisWorkbook.SlicerCaches("Slicer_YR_MNTH_CD1")
Dim sItm As Excel.SlicerItem
Dim ICt As Long

For Each sItm In cache.SlicerItems
If sItm.Selected = True Then GetSlicerItems = GetSlicerItems & sItm.Name & ", "
ICt = ICt + 1
If sItm.HasData = False Then
ICt = ICt + 1
End If
Next
If Len(GetSlicerItems) > 0 Then
If ICt = cache.SlicerItems.Count Then
GetSlicerItems = "All Items"
Else
GetSlicerItems = Left(GetSlicerItems, Len(GetSlicerItems) - 2)
End If
Else
GetSlicerItems = "No items selected"
End If
End Function

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    很好的方法感谢分享。 True 和 False If 语句对我不起作用,所以我只是移到下一行,现在它起作用了

    Public Function GetSlicerItems() As String
        Dim sSlicerItems As String
    
        Dim cache As Excel.SlicerCache
        Set cache = ThisWorkbook.SlicerCaches("Slicer_AUTH_BHS_GROUP")
    
        Dim sItm As Excel.SlicerItem
        Dim ICt As Long
    
        For Each sItm In cache.SlicerItems
            If sItm.Selected = True Then
            sSlicerItems = sSlicerItems & sItm.Name & ", "
            ICt = ICt + 1
            End If
            If sItm.HasData = False Then
                ICt = ICt + 1
            End If
        Next
        If Len(sSlicerItems) > 0 Then
            If ICt = cache.SlicerItems.Count Then
                sSlicerItems = "All Items"
            Else
                sSlicerItems = Left(sSlicerItems, Len(sSlicerItems) - 2)
            End If
        Else
            sSlicerItems = "No items selected"
        End If
    
        GetSlicerItems = sSlicerItems
    
    
    End Function
    

    【讨论】:

      【解决方案2】:

      第一个一般性建议,
      使用 F8 和 SUB 逐行测试您的代码,并观察窗口以查看变量内容
      谷歌搜索“vba 调试”
      使用option explicit 模式检查变量类型

      有了它,你可以轻松找到问题所在。
      例如我发现 cache 的类型有误。
      您只选择了ThisWorkbook.SlicerCaches("Slicer_YR_MNTH_CD1")ThisWorkbook.SlicerCaches 集合中的一个SlicerCache,所以它应该是:

      Dim cache As Excel.SlicerCache 'not SlicerCacheS
      

      现在你的目标缓存在变量cache

      为确保您不调用递归函数,我建议对任何操作使用临时变量。
      例如Dim sSlicerItems as String

      我不确定这个 if/else 语句的正确逻辑,但无论如何你更正的代码可能看起来像:

      Public Function GetSlicerItems() As String
          Dim sSlicerItems As String
      
          Dim cache As Excel.SlicerCache
          Set cache = ThisWorkbook.SlicerCaches("Slicer_YR_MNTH_CD1")
      
          Dim sItm As Excel.SlicerItem
          Dim ICt As Long
      
          For Each sItm In cache.SlicerItems
              If sItm.Selected = True Then sSlicerItems = sSlicerItems & sItm.Name & ", "
              ICt = ICt + 1
              If sItm.HasData = False Then
                  ICt = ICt + 1
              End If
          Next
          If Len(sSlicerItems) > 0 Then
              If ICt = cache.SlicerItems.Count Then
                  sSlicerItems = "All Items"
              Else
                  sSlicerItems = Left(sSlicerItems, Len(sSlicerItems) - 2)
              End If
          Else
              sSlicerItems = "No items selected"
          End If
      
          GetSlicerItems = sSlicerItems
      End Function
      

      用于在所有切片机或仅一张切片机上处理某些内容, 使用此循环切片器示例 https://stackoverflow.com/a/20486330/2519073.parent 属性(它是一个工作表)的 SlicerCache 项目
      也许您的解决方案需要更多 SlicerCache 属性。
      检查https://msdn.microsoft.com/en-us/library/office/ff822652.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多