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

Хорошо, мастера VBA! Новичок здесь снова. Работа с данными куба OLAP.

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

Чтобы дать ему контекст, я пытаюсь выбрать одного и того же человека из двух разных слайсеров. Чтобы усложнить задачу, слайсеры используют разные дескрипторы для людей - то есть «Смит, Боб» используется в одном слайсере, а «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 человек, выбранный на каждой итерации. И мне нужен один и тот же человек, выбранный на обоих слайсерах.

И ИДТИ!

1 Ответ

0 голосов
/ 03 июня 2019

Хорошо, давайте попробуем это:

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

...