2017-12-12 5 views
1

Ich möchte Pivot-Tabelle filtern inputbox verwenden. Ich muss nur die vom Benutzer eingegebenen Werte sichtbar machen und andere Werte müssen unsichtbar sein. Das Pivot-Feld "Number" befindet sich in Zeilenbeschriftungen. Ich habe Schleife im Code verwendet. So kann der Benutzer mehrere Werte eingeben. Ich habe den folgenden Code verwendet, aber das Problem ist, dass es nicht funktioniert und Fehler "Index außerhalb des gültigen Bereichs" angezeigt wird. Hilf mirWie Pivot-Tabelle filtern, indem inputbox in Excel VBA

Sub FilterRP() 

Dim ws As Worksheet 
Dim str1 As Variant 
Dim arr1() As String 
Dim i As Long 

Set ws = Sheets("Main") 

i = 1 
Do 
    str1 = Application.InputBox("Select one Number") 
    ReDim Preserve arr1(i) 
    arr1(i) = str1 
    i = i + 1 
Loop While (str1 <> vbNullString) And (str1 <> False) 

ws.PivotTables("MainTable").PivotFields("Number").ClearAllFilters 

ws.PivotTables("MainTable").PivotFields("Number").PivotItems(arr1(i)).Visible = True 

End Sub 
+0

ReDim ist ineffizient erhalten, wie Sie neue Arrays am Ende die Schaffung und Informationen zu bewältigen. Ist es möglich, eine "," getrennte Zeichenfolge aus der Inputbox zu lesen und Split zu verwenden, um Ihr Array zu erstellen? Ich bin sicher, dass mich jemand korrigieren wird, wenn das weniger effizient ist. Schleifen Sie dann das Array, indem Sie die pivotable sichtbaren Elemente = auf die Array-Elemente setzen. – QHarr

+0

Auf welcher Zeile erhalten Sie den Fehler? – ashleedawg

+0

@ashleedawg In der letzten Zeile von 'PivotItems (arr1 (i)) Sichtbar' – Deepak

Antwort

1

den Code unten versuchen, Erklärungen innerhalb der Kommentare Code:

Option Explicit 

Sub FilterRP() 

Dim ws As Worksheet 
Dim str1 As Variant 
Dim arr1() As String 
Dim i As Long 
Dim PvtItm As PivotItem 

Set ws = Sheets("Main") 

i = 0 
Do 
    str1 = Application.InputBox("Select one Number") 
    ReDim Preserve arr1(i) 
    arr1(i) = str1 
    i = i + 1 
Loop While (str1 <> vbNullString) And (str1 <> False) 

With ws.PivotTables("MainTable").PivotFields("Number") 
    .ClearAllFilters ' reset previous filters 

    ' loop through Pivot Items collection 
    For Each PvtItm In .PivotItems 
     If Not IsError(Application.Match(PvtItm.Name, arr1, 0)) Then ' check if current Pivot-Items's name equals to one of the selected values in Input-Box 
      PvtItm.Visible = True 
     Else 
      PvtItm.Visible = False 
     End If 
    Next PvtItm 
End With 

End Sub 
2

Sie könnten versuchen, so etwas zu tun. Es benötigt eine Eingabe von InputBox getrennt durch Kommas. Durchläuft dann jedes Element im Pivot-Feld 'Number' und legt die Sichtbarkeit fest, wenn der Wert im Array vorhanden ist. Wenn das Array IsEmpty (das heißt das Eingabefeld war vbNullString), dann setzt er das Pivot-Feld und gibt alle Elemente.

Sub FilterRP() 
    Dim ws As Worksheet 
    Dim str1 As Variant 
    Dim arr1() As String 
    Dim pi As PivotItem 

    Set ws = Sheets("Main") 

    str1 = InputBox("Please enter the numbers you want to filter by" & vbNewLine & "Seperated by a comma (,)") 
    ' Remove spaces if any 
    str1 = Trim(Replace(str1, " ", vbNullString)) 

    arr1 = Split(str1, ",") 
    With ws.PivotTables("MainTable").PivotFields("Number") 
     For Each pi In .PivotItems 
      If Not str1 = vbNullString Then 
       pi.Visible = IIf(IsInArray(pi.Name, arr1), True, False) 
      Else 
       pi.Visible = True 
      End If 
     Next pi 
    End With 
End Sub 

Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    Dim i 
    For i = LBound(arr) To UBound(arr) 
     If arr(i) = stringToBeFound Then 
      IsInArray = True 
      Exit Function 
     End If 
    Next i 
    IsInArray = False 
End Function 
+0

Ich habe bereits versucht, Split-Funktion. Aber wenn ich den Code ausführe, reagiert mein Excel nicht mehr. Aber egal, danke für den Code – Deepak

+0

Wenn Sie welchen Code ausführen? Wie viele Artikel befinden sich in Ihrer Pivot-Tabelle? – Tom

+0

Wenn ich Ihren Code ausführen. Ich habe 73 Artikel in diesem Pivot-Feld – Deepak