2015-08-26 45 views
1

這是我第一次使用VBA。我需要在Excel電子表格中顯示切片器選擇。每張紙上有15-20個切片器,最多有50個可能的選擇,所以我不想使用立方體代碼在每個單元格中顯示一個選擇。如果可能的話,我希望它們在一個單元格中用逗號分隔(或返回「全部」或「無」)。需要VBA代碼在Excel單元格中顯示多個切片器選擇

這是我通過對本網站和其他網站的研究拼湊在一起,並試圖自己編輯它(所以它可能是一個完整的混亂)。

我放棄尋找和尋求幫助!如果你能指點我一個簡單的「速成課程」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 

回答

0

第一個一般性建議,
使用F8和SUB測試一行代碼行,並觀察窗看到變量的內容
谷歌爲「VBA調試」
使用option explicit模式來檢查你的變量類型

與它,你可以輕鬆地找到最新的錯誤。
例如我發現,那cache有錯誤的類型。
您只選擇一個SlicerCacheThisWorkbook.SlicerCaches收集由ThisWorkbook.SlicerCaches("Slicer_YR_MNTH_CD1")的,所以應該是:

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

1

偉大的方法感謝分享。 True and 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 
相關問題