Фильтрация сводной таблицы в зависимости от значения в выпадающем списке - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь, чтобы значение поля со списком было зависимым для фильтрации сводной таблицы.Приведенный ниже код работает нормально, если значение комбинированного списка совпадает с разделами фильтра для сводной таблицы, но это не так, поэтому это вызывает ошибку.

Private Sub UserForm_Initialize()
ComboBox1.AddItem "3(Facility Approved),4(Bid Appn Approved),12(Cancelled With Outs)"
ComboBox1.AddItem "3"
End Sub
Private Sub CommandButton1_Click()
Call Macro5
Dim sht As Worksheet, pflds As PivotFields, showItems As Boolean
Dim arr

With Worksheets("CT")
    .Range("G1").Value = TextBox2.Value
    .Range("C1").Value = TextBox1.Value
End With
arr = Split(ComboBox1, ",") 'make an array from the combobox value
'show only the values in arr for specific pivot fields
ShowOnlyThese Sheets("BP").PivotTables("PivotTable1").PivotFields("Facility_Status_Id"), arr
ShowOnlyThese Sheets("BC").PivotTables("PivotTable1").PivotFields("Facility_Status_Id"), arr

ActiveWorkbook.RefreshAll
Unload Me
ActiveWorkbook.RefreshAll


End Sub

Это код, который я пытался исправить, эту проблемуно я получаю ошибку.Любая помощь будет принята с благодарностью.

Private Sub UserForm_Initialize()
'list to be chosen in the combobox
ComboBox1.AddItem "3(Facility Approved),4(Bid Appn Approved),12(Cancelled With Outs)"
ComboBox1.AddItem "3"
End Sub
Private Sub CommandButton1_Click()
    Call Macro5
    Dim sht As Worksheet, pflds As PivotFields, showItems As Boolean
    Dim arr

    With Worksheets("Connection Totals")
        .Range("G1").Value = TextBox2.Value
        .Range("C1").Value = TextBox1.Value
    End With
    If ComboBox1.Value = "3(Facility Approved),4(Bid Appn Approved),12(Cancelled With Outs)" Then
    arr = Array("3", "4", "12") 'make an array from the combobox value
    Else
    arr = Array("3")
    'show only the values in arr for specific pivot fields
    ShowOnlyThese Sheets("By Participants").PivotTables("PivotTable1").PivotFields("Facility_Status_Id"), arr
    ShowOnlyThese Sheets("By Corporates").PivotTables("PivotTable1").PivotFields("Facility_Status_Id"), arr
  End If
    ActiveWorkbook.RefreshAll
    Unload Me
    ActiveWorkbook.RefreshAll


End Sub

'loop over all items in a pivotfield shows only those matching a value
Sub ShowOnlyThese(pf As PivotField, arrItems)
    Dim pi As PivotItem, haveOne As Boolean
    For Each pi In pf.PivotItems
        On Error Resume Next
        pi.Visible = Not IsError(Application.Match(pi.Value, arrItems, 0))
        On Error GoTo 0
    Next pi
End Sub

1 Ответ

1 голос
/ 15 июля 2019

В панели «Немедленно»:

? application.match("1", array(1,2,3), 0)     '>> error 2042

? application.match("1",array("1","2","3"),0) '>> 1

Значения полей поворота являются строками, но сопоставляемый массив является числовым. Если вы передадите массив строк, он должен работать нормально.

В вашем ShowOnlyThese есть ошибка, из-за которой значение поля могло остаться видимым, если оно должно было быть скрыто, если скрытие этого значения означало бы, что значения не отображаются (у вас должно быть хотя бы одно отображенное значение)

If ComboBox.Value = "3(Facility Approved),4(Bid Appn Approved),12(Cancelled With Outs)" Then
    arr = Array("3", "4", "12")
Else
    arr = Array("3")
End If

ShowOnlyThese Sheets("By Participants").PivotTables("PivotTable1").PivotFields( _
              "Facility_Status_Id"), arr
ShowOnlyThese Sheets("By Corporates").PivotTables("PivotTable1").PivotFields( _
               "Facility_Status_Id"), arr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...