2016-08-19 2 views
1

Я пытаюсь написать макрос, чтобы, когда пользователи рабочей книги сверлятся на сводной таблице, эта буровая установка имеет соответствующие фильтры слайсеров, применяемые к результатам сверления (почему имя Бога, которое Microsoft уже не делает, это вне меня).Определить поле, которое указывает слайсер Excel,

В рассматриваемой книге есть две сводные таблицы, основанные на отдельных данных, и я уже разработал (большинство) логику для проверки того, что какие-либо слайсеры даже применяют фильтр, и если да, то какое значение (ы) выбрано , У меня также есть логика в действиях Before_DoubleClick & Worksheet_Activate, которые позволяют макросу знать, что происходит сверло (исключено, поскольку я использовал код раньше и знаю, что он работает).

Последний шаг - найти столбец, на котором размещен слайсер, и удалить строки из бурового листа, где в столбце указано значение, которое НЕ выбрано. Я думал, что буду искать SlicerCache.Levels.SourceFiled на основе записи создания слайсера, но, похоже, он недоступен, когда я пытался написать код (по крайней мере, он не отображался в параметрах автозаполнения).

Мой текущий код на самом деле выбирать сверло в следующем:

Sub Filter_Drill_Down(SourceSheet As Worksheet, Drill_Down_Sheet As Worksheet) 
' 
Dim Slicer_Column As String 
Dim Selected_Values As String 
Dim Selected_Cnt As Long 
Dim Total_Values As Long 
Dim All_Slicers As SlicerCaches 
Dim SCache As SlicerCache 
Dim Slicer_Obj As Slicer 
Dim S_Item As SlicerItem 
Dim DDS_Row As Long 
Dim No_Match As Boolean 

Application.ScreenUpdating = False 

'Capture all the slicers in the workbook (since they're not natively sheet specific) 
Set All_Slicers = ThisWorkbook.SlicerCaches 

'Iterate through the slicer caches 
For Each SCache In All_Slicers 
    'Check if the current cache has a Slicer Object on the source sheet 
    For Each Slicer_Obj In SCache.Slicers 
     If Slicer_Obj.Shape.Parent Is SourceSheet Then 

      'In order to prevent wasting time applying filters for slicers where no filtering occurs, we'll first check how many items are selected. Reset the counters to make 
      'sure we don't miscount, and clear Selected_Values so we don't include incorrect values 
      Selected_Cnt = 0 
      Total_Values = 0 
      Selected_Values = "" 

      For Each S_Item In SCache.SlicerItems 
       If S_Item.Selected Then 
        'Current item is selected, increment the selected count & add the value to the selected values string. That way if we do need to filter we can just check if 
        ' a row's value for the relevant column is in the string & delete rows where that's not true 
        Selected_Cnt = Selected_Cnt + 1 

        Selected_Values = Selected_Values & "|" & S_Item.Name & "|" 
       End If 'else the item isn't selected, just need to increment the total count which happens anyway 

       Total_Values = Total_Values + 1 
      Next 

      'Check if the total = selected 
      If Total_Values > Selected_Cnt Then 
       'We actually need to filter. The first step in that is knowing which column to check 
       Slicer_Column = "A" 
       No_Match = True 

       'Find the matching column 
       Do While Drill_Down_Sheet.Range(Slicer_Column & 1).Value <> "" And No_Match 
        'Check if the header for the current column is the one we're looking for 
        If Drill_Down_Sheet.Range(Slicer_Column & 1).Value = <X> Then'HERE'S WHERE I NEED HELP 
         No_Match = False 
        Else 
         'Move to the next column 
         Slicer_Column = ColNumToStr(ColStrToNum(Slicer_Column) + 1) 'ColNumToStr converts a # to it's letter equivalent (i.e. 27 = AA) & ColStrToNum does the inverse 
        End If 
       Loop 

       'Iterate through the rows. Column A is ALWAYS filled, so use it to control the loop 
       DDS_Row = 2 
       Do While Drill_Down_Sheet.Range("A" & DDS_Row).Value <> "" 
        'Check the value in the target column against the selected items string 
        If InStr(1, Selected_Values, "|" & Drill_Down_Sheet.Range(Slicer_Column & DDS_Row).Value & "|") = 0 Then 
         'Value isn't selected, delete the row. Note: Since this will make what had been row DDS_Row + 1 into row DDS_Row, we do NOT increment DDS_Row 
         Drill_Down_Sheet.Range(DDS_Row & ":" & DDS_Row).Delete xlShiftUp 


        Else 
         'Not a filtered value, move to the next row 
         DDS_Row = DDS_Row + 1 
        End If 
       Loop 

      End If 'all the values are selected, which means none are filtered, so do nothing 
     End If 'else the slicer does not appear on the Source_Sheet, meaning it's not one that applies to the pivot table being drilled into. Just move to the next cache 
    Next 
Next 

Application.ScreenUpdating = True 
End Sub 

ответ

0

Некоторые перебором испытание & ошибка у меня ответ. Вы должны использовать SlicerCache.SourceName, чтобы получить имя поля.

Смежные вопросы