2015-12-07 2 views
1

Вот функция, которую я нашел в Интернете, чтобы помочь перебрать значения и выбрать элементы сводного фильтра, соответствующие значениям. Моя проблема в том, что массив, созданный в Sub Filter_Bana, не загружается значениями из диапазона с именем «Bana» (aka varItemList). Диапазон «Бана» состоит из примерно двадцати чисел (целых чисел). Когда я запускаю sub (внизу), я продолжаю получать MsgBox «Нет элементов списка фильтров, найденных» из функции. Я пытался понять это на некоторое время и не думаю, что любой из названных целых списков «Бана» загружается в «varItemList». Другими словами, когда varItemList передается функции, массив пуст. См. Код:Почему массив VBA не загружает целые числа

** EDIT: Я нашел проблему. Проблемы, которые у меня были связаны с двумя проблемами: 1) Я плохо разбираюсь в VBA, 2) тип данных элементов поворота в моем поле поворота не соответствовал типу данных массива. Я переключил компоненты массива на 5-символьный текст и скорректировал SQL-запрос, чтобы ввести мой номер инвестора в виде 5-символьного текста (т. Е. Массив должен был быть загружен символьной строкой, а для моего поля поворота нужны данные типа символа; если есть способ сделать это с целыми числами, я хотел бы знать. **

Private Function Filter_PivotField(pvtField As PivotField, _ 
    varItemList As Variant) 
    Dim strItem1 As Long, blTmp As Boolean, i As Long 
    On Error Resume Next 
    Debug.Print varItemList 
    Application.ScreenUpdating = False 
    With pvtField 
     If .Orientation = xlPageField Then .EnableMultiplePageItems = True 
     For i = LBound(varItemList) To UBound(varItemList) 
      blTmp = Not (IsError(.PivotItems(varItemList(i)).Visible)) 
      If blTmp Then 
       strItem1 = .PivotItems(varItemList(i)) 
       Exit For 
      End If 
     Next i 
     If strItem1 = "" Then 
      MsgBox "None of filter list items found." 
      Exit Function 
     End If 
     .PivotItems(strItem1).Visible = True 
     For i = 1 To .PivotItems.Count 
      If .PivotItems(i) <> strItem1 And _ 
       .PivotItems(i).Visible = True Then 
       .PivotItems(i).Visible = False 
      End If 
     Next i 
     For i = LBound(varItemList) To UBound(varItemList) 
      .PivotItems(varItemList(i)).Visible = True 
     Next i 
    End With 
    Application.ScreenUpdating = True 
End Function 


Sub Filter_Bana() 
    Filter_PivotField _ 
     pvtField:=Sheets("Pres1&2_Pivot").PivotTables("PivotTable1").PivotFields("investorNumber"), _ 
     varItemList:=Application.Transpose(Sheets("Controls").Range("Bana")) 

End Sub` 
+7

Первая остановка с чем-либо подобным - избавиться от статусов «На ошибках возобновления следования» t и на самом деле [отлаживать ваш код] (http://www.cpearson.com/excel/DebuggingVBA.aspx) –

+3

'Debug.Print varItemList' вы не можете отлаживать. print массив, подобный этому –

+0

Извините Macro Man. Неплохо подмечено. – AGryckiewicz

ответ

0

Этот код работает. единственный ключ убедившись, что мой массив загружается с данными типа символов (не целые числа) и что поле поворота также содержит данные типа символа (скорректировано в запросе/не отображается)

Private Function Filter_PivotField(pvtField As PivotField, _ 
    varItemList As Variant) 
    Dim strItem1 As String, blTmp As Boolean, i As Long 
    Application.ScreenUpdating = False 
    With pvtField 
     If .Orientation = xlPageField Then .EnableMultiplePageItems = True 
     For i = LBound(varItemList) To UBound(varItemList) 
      blTmp = Not (IsError(.PivotItems(varItemList(i)).Visible)) 
      If blTmp Then 
       strItem1 = .PivotItems(varItemList(i)) 
       Exit For 
      End If 
     Next i 
     If strItem1 = "" Then 
      MsgBox "None of filter list items found." 
      Exit Function 
     End If 
     .PivotItems(strItem1).Visible = True 
     For i = 1 To .PivotItems.Count 
      If .PivotItems(i) <> strItem1 And _ 
       .PivotItems(i).Visible = True Then 
       .PivotItems(i).Visible = False 
      End If 
     Next i 
     For i = LBound(varItemList) To UBound(varItemList) 
      .PivotItems(varItemList(i)).Visible = True 
     Next i 
    End With 
    Application.ScreenUpdating = True 
End Function 


Sub Filter_Bana() 
Filter_PivotField _ 
    pvtField:=ThisWorkbook.Worksheets("Pres1_2_Pivot").PivotTables("PivotTable1").PivotFields("investorNumber"), _ 
    varItemList:=Application.Transpose(Sheets("Controls").Range("Bana")) 

End Sub