2016-11-18 2 views
0

Я искал решение для этого в течение последних двух недель.Поворотные поля таблицы в элементе userform - Excel vba

Цель состоит в том, чтобы видеть и редактировать данные из сводной таблицы в пользовательской форме Listbox.

У меня есть сводная таблица с четырьмя столбцов:

Code (number) | Name (text) | Card Number (number) | SDCard (number). 

Это отсортированная по колонку коды.

В моей UserForm Listbox У меня есть следующий код:

Private Sub UserForm_Initialize() 

Dim pvtTable As PivotTable 
Dim pvtField As PivotField 
Dim lngIndex As Long 

Set pvtTable = Worksheets("Store").PivotTables(1) 
Set pvtField = pvtTable.PivotFields("Code") 

With pvtTable.PivotCache 
    .MissingItemsLimit = xlMissingItemsNone 
    .Refresh 
End With 

pvtTable.PivotFields("Code").ClearAllFilters 
pvtTable.PivotFields("Code").AutoSort Order:=xlAscending, Field:="Code" 

For lngIndex = 1 To pvtField.PivotItems.Count 
    UserForm1.listBox1.AddItem pvtField.PivotItems(lngIndex).Name 
Next 

End Sub 

Я могу видеть поле «Код» пунктов в Listbox, но ничего.

+0

вы получаете сообщение об ошибке? не все «PivotItems» из «PivotField» с именем «Code» отображаются в вашем «ListBox1»? –

+0

попробуйте код в моем ответе ниже, и дайте мне знать, если это то, что вы имели в виду. –

ответ

0

Код ниже содержит 2 Sub s, один из Sub UserForm_Initialize и еще один из Sub ListBox1_Change. Весь код находится внутри вашего модуля User_Form.

(объяснение в комментариях кода)

Option Explicit 

Dim pvtTable As PivotTable 
Dim pvtField As PivotField 
Dim pvtItem As PivotItem 


Private Sub ListBox1_Change() 

' this code runs once hte user changes the selection of the items inside the user_form Listbox1 

Dim i As Integer 

' loop through all records in Listbox ans check which one is selected 
For i = 0 To ListBox1.ListCount - 1 
    If ListBox1.Selected(i) Then 
     ' if current item is selected in Listbox >> make current Pivot Items visible in Pivot table 
     pvtField.PivotItems(ListBox1.List(i)).Visible = True 
    Else 
     ' if current item is not selected in Listbox >> hide current Pivot in Pivot table 
     pvtField.PivotItems(ListBox1.List(i)).Visible = False 
    End If 
Next i 

End Sub 


Private Sub UserForm_Initialize() 

' this code runs on User_from intialize process 
' it add items to the Listbox with all PivotItems in PivotField "Code" 

Set pvtTable = Worksheets("Store").PivotTables(1) 
Set pvtField = pvtTable.PivotFields("Code") 

With pvtTable.PivotCache 
    .MissingItemsLimit = xlMissingItemsNone 
    .Refresh 
End With 

With pvtField 
    .ClearAllFilters 
    .AutoSort Order:=xlAscending, Field:="Code" 

    ' loop through all PivotItems in PivotField "Code" and add them to ListBox1 
    For Each pvtItem In .PivotItems 
     UserForm1.ListBox1.AddItem pvtItem.Name 
    Next pvtItem 
End With 

End Sub 
+0

Привет, Сай, спасибо за вашу помощь. Это не проблема. С сообщением i, как и вы, я вижу одно поле поворота в списке, но цель состоит в том, чтобы увидеть все поля в сводной таблице и элементах поворота. Поворотное поле «Код» похоже на índex в таблице. Вы можете помочь. – Car

+0

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

+0

@Car Я был бы рад помочь, я не уверен, что полностью понимаю, как вы хотите, чтобы ваш 'ListBox' выглядел. Можете ли вы добавить дополнительные данные в свой пост? может быть, скриншоты того, что вы хотели бы иметь в своем «ListBox»? даже если вы сделаете это вручную с помощью 'Paint' –

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