Как выбрать элемент среза, который зависит от выбранного значения другого среза в VBA? (Работа с кубами OLAP)

Хорошо, мастера VBA! Снова новичок. Работа с данными OLAP Cube.

На этот раз я застрял в попытке автоматически выбрать элемент среза (из другой группы срезов) на основе ранее выбранного элемента среза из другой группы.

Чтобы придать контекст, я пытаюсь выбрать одного и того же человека в двух разных слайсерах. Чтобы усложнить задачу, срезы используют разные дескрипторы для людей - то есть «Смит, Боб» используется в одном срезе, а «123C - Смит, Боб» - в другом.

Вот мой код:

Dim wb As Workbook
Dim slItem As SlicerItem
Dim slItem2 As SlicerItem
Dim sc3 As SlicerCache
Dim sc3L As SlicerCacheLevel
Dim sc4 As SlicerCache
Dim sc4L As SlicerCacheLevel

Set wb = ActiveWorkbook
Set sc3 = wb.SlicerCaches("Slicer_Primary_Account_List_Combo__BI")
Set sc4 = wb.SlicerCaches("Slicer_TM_Hierarchy")
Set sc3L = sc3.SlicerCacheLevels(1)
Set sc4L = sc4.SlicerCacheLevels(3)

sc3L.CrossFilterType = xlSlicerCrossFilterHideButtonsWithNoData

' Select the first person within the Sales Cube slicer
' This selects each slicer item in the Sales Cube and iterates through them
For Each slItem In sc3L.SlicerItems
    If slItem.HasData Then   ''' This ensures the iteration is only on items with data
        sc3.ClearManualFilter
        sc3.VisibleSlicerItemsList = Array(slItem.Name)
    End If
Next

' Now ensure the same person is also selected within the BM Cube slicer
For Each slItem2 In sc4L.SlicerItems
    sc4.ClearManualFilter ''' CODE WORKS UP TO HERE
    If slItem2.Value = Mid(slItem.Value, 8, 30) Then   ''' I am trying to force the selection on the second slicer by looking for the name match. But this is NOT working. BREAKPOINT.
        slItem2.Selected = True
    End If
Next

Я получаю ошибку времени выполнения 1004 в точке останова. Сказать, что это ошибка, определяемая приложением или объектом.

Я слишком долго пытался исправить этот фрагмент кода - и мне нужен ваш опыт!

Конечная цель: мне нужен только 1 человек, выбранный на каждой итерации. И мне нужно, чтобы на обоих слайсерах был выбран один и тот же человек.

И иди!


person Taissa    schedule 03.06.2019    source источник
comment
Во-первых, две вещи ... разве элементы для кубов OLAP не похожи на "[Servicio].[CodigoServicio].&[" & C & "]"? И, во-вторых, все ли ваши предметы на другом кубе похожи на - отделить число от имени?   -  person Damian    schedule 03.06.2019
comment
@ Дамиан, да, на второй вопрос. Все предметы на другом кубе имеют букву C - чтобы отделить число от имени.   -  person Taissa    schedule 03.06.2019
comment
Где в вашем коде вы выбираете, какое имя вы хотите выбрать? Я этого не вижу. Кроме того, очистка фильтров в каждом цикле не будет очищать их каждый раз, делая бесполезный цикл?   -  person Damian    schedule 03.06.2019
comment
@Damian - поэтому, когда я тестировал первую часть кода, первый слайсер проходит итерацию, имя за именем в каждом цикле. Мне нужно привязать к нему второй слайсер. sc3L. для элементов с данными sc3.ClearManualFilter sc3.VisibleSlicerItemsList = Array (slItem.Name) End If Next   -  person Taissa    schedule 03.06.2019
comment
Итак, вы хотите добавить для каждого товара данные в кубе продаж?   -  person Damian    schedule 03.06.2019
comment
@Damian - Я не знаю, как очистить код в моем предыдущем комментарии - чтобы сделать его более читабельным ... извините!   -  person Taissa    schedule 03.06.2019
comment
@Damian - да, конечно. Как только оба слайсера синхронизированы, они запускают анализ.   -  person Taissa    schedule 03.06.2019


Ответы (1)


Хорошо, попробуем это:

Option Explicit
Sub Main()

    Dim wb As Workbook
    Dim slItem As SlicerItem
    Dim sc3 As SlicerCache
    Dim sc3L As SlicerCacheLevel

    Set wb = ActiveWorkbook 'ThisWorkbook is better if this code is run on the same workbook
    Set sc3 = wb.SlicerCaches("Slicer_Primary_Account_List_Combo__BI")

    sc3L.CrossFilterType = xlSlicerCrossFilterHideButtonsWithNoData

    ' Select the first person within the Sales Cube slicer
    ' This selects each slicer item in the Sales Cube and iterates through them
    For Each slItem In sc3L.SlicerItems
        If slItem.HasData Then   ''' This ensures the iteration is only on items with data
            sc3.ClearManualFilter
            sc3.VisibleSlicerItemsList = Array(slItem.Name)
            Testing CStr(slItem.Name)
        End If
    Next
End Sub
Sub Testing(SalesName As String)

    Dim slItem2 As SlicerItem
    Dim sc4 As SlicerCache
    Dim sc4L As SlicerCacheLevel
    Dim wb As Workbook
    Dim SalesSplit As Variant

    'with this you are getting an array with the number and name being SalesSplit(1) the name
    'So taking that SalesName =  "123C - Smith, Bob" then SalesSplit(0) will be "123C" and SalesSplit(1) will be "Smith, Bob"
    SalesSplit = Split(SalesName, " - ")


    Set wb = ThisWorkbook 'if the workbook is the same containing the code
    Set sc4 = wb.SlicerCaches("Slicer_TM_Hierarchy")
    Set sc3L = sc3.SlicerCacheLevels(1)
    Set sc4L = sc4.SlicerCacheLevels(3)

    For Each slItem2 In sc4L.SlicerItems
        sc4.ClearManualFilter ''' CODE WORKS UP TO HERE
        If slItem2.Name = SalesSplit(1) Then   ''' I am trying to force the selection on the second slicer by looking for the name match. But this is NOT working. BREAKPOINT.
            slItem2.Selected = True
        End If
    Next

    'Continue your code, when this sub ends it will loop through the next item on your sales cube

End Sub

2 подпрограммы, первая из которых «основная» назовет вторую «Тестирование».

Шаг 1 Выберите товар с данными в кубе продаж.

Шаг 2 Вызвать процедуру тестирования, передав выбранное имя из куба продаж. Затем вы выбираете тот же элемент на втором кубе и выполняете свои задачи. После этого вернитесь к шагу 1

person Damian    schedule 03.06.2019
comment
он не выбирает второй слайсер. Я не получаю сообщение об ошибке, но я вижу, что первый срез проходит итерации - без синхронизации на втором срезе ... второй срез просто показывает, что все фильтры очищены (поэтому все элементы кажутся выбранными) ... - person Taissa; 03.06.2019
comment
Вставьте точку останова в строке If slItem2.Name = SalesSplit(1) Then, какое значение для SalesSplit(1)? @Taissa - person Damian; 03.06.2019
comment
Хорошо, поэтому я думаю, что часть моей проблемы - это порядок кодов кеша моего слайсера - потому что я понял, что часть кода SalesSplit должна относиться к уровню кеша слайсера sc3L ... Итак, я переписал код, чтобы учесть это. Но я все еще застреваю на одном и том же месте. С ошибкой времени выполнения 9 ... - person Taissa; 03.06.2019
comment
Я никогда не работал с подобными кубами @Taissa. Я просто использую такой способ: ThisWorkbook.SlicerCaches("Slicer_Primary_Account_List_Combo__BI").VisibleSlicerItemsList = Sellers быть продавцами переменная, содержащая продавца / продавцов. - person Damian; 04.06.2019
comment
используя свой метод, как бы вы выбрали конкретное значение элемента среза? - person Taissa; 05.06.2019
comment
@Taissa, как в комментарии выше, выбирает нужный вам элемент. быть Sellers переменной, содержащей ваш элемент. - person Damian; 05.06.2019