
Ich erfasse meine Ausgaben in einer Excel-Tabelle. In einer zweiten Tabelle habe ich eine Pivot-Tabelle, mit der ich meine Ausgaben nach Monat und Kategorie gruppieren kann, um die Gesamtsummen anzuzeigen. Wenn ich auf eine Zelle doppelklicke, wird automatisch eine neue Tabelle hinzugefügt, die eine Liste der Ausgaben für den ausgewählten Monat/die ausgewählte Kategorie anzeigt. Das ist ziemlich gut, außer dass die neue Tabelle eine Kopie der Ausgaben enthält, sodass ich sie nicht aktualisieren kann. Außerdem muss ich diese Tabellen jedes Mal löschen, wenn ich tiefer gehe, was ziemlich nervig ist.
Ich habe hier ein Beispiel gefunden, das erklärt, wie die hinzugefügten Blätter automatisch umbenannt und entfernt werden:http://www.contextures.com/excel-pivot-table-drilldown.html
Was ich wirklich möchte, ist, zum ersten Blatt zurückzukehren und die Filter entsprechend zu aktualisieren. Weiß jemand, wie ich das erreichen kann?
Vielen Dank,
Patrick
Antwort1
Nicht ganz einfach. Ich habe den Code voneine tägliche Dosis Excelum die besseren Filteroptionen von Excel 2010 zu nutzen. Wenn Sie einen Datenpunkt in Ihrer Pivot-Tabelle auswählen und das Makro ausführen, werden Ihnen die entsprechenden Zeilen in Ihren Quelldaten angezeigt. Dies geschieht, indem die Funktion „Details anzeigen“ verwendet und dann für jede Spalte ein Filter erstellt wird, der den Daten entspricht.
Sie können es auf einer neuen Rechtsklick-Schaltfläche festlegen oder das Standardverhalten zum Anzeigen von Details überschreiben.
Private mPivotTable As PivotTable
Sub GetDetailsOnSource()
'turn off updates to speed up code execution
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
On Error Resume Next
Set mPivotTable = Selection.PivotTable
On Error GoTo 0
If Not mPivotTable Is Nothing Then
If mPivotTable.PivotCache.SourceType <> xlDatabase Or _
Intersect(Selection, mPivotTable.DataBodyRange) Is Nothing Then
Set mPivotTable = Nothing
End If
End If
Selection.ShowDetail = True
GetDetailInfo
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
End Sub
Sub GetDetailInfo()
Dim rCell As Range
Dim rData As Range
Dim vMin As Variant, vMax As Variant
Dim rSource As Range
Dim lOldCalc As Long, sh As Worksheet
Dim colItems As Collection, arrFilter As Variant, lLoop As Long, lLastRow As Long
Dim bBlanks As Boolean, bNumbers As Boolean, sNumberFormat As String
Set sh = ActiveSheet
If Not mPivotTable Is Nothing Then
lOldCalc = Application.Calculation
Application.Calculation = xlCalculationManual
Set rSource = Application.Evaluate(Application.ConvertFormula(mPivotTable.SourceData, xlR1C1, xlA1))
rSource.Parent.AutoFilterMode = False
rSource.AutoFilter
lLastRow = sh.ListObjects(1).Range.Rows.Count
sh.ListObjects(1).Unlist
'Loop through the header row
For Each rCell In Intersect(sh.UsedRange, sh.Rows(1)).Cells
If Not IsDataField(rCell) Then
If Application.WorksheetFunction.CountIf(rCell.Resize(lLastRow), "") > 0 Then bBlanks = True Else bBlanks = False
rCell.Resize(lLastRow).RemoveDuplicates Columns:=1, Header:=xlYes
If Application.WorksheetFunction.CountA(rCell.EntireColumn) = Application.WorksheetFunction.Count(rCell.EntireColumn) + 1 _
And Not IsDate(sh.Cells(Rows.Count, rCell.Column).End(xlUp)) Then 'convert numbers to text
bNumbers = True
rCell.EntireColumn.NumberFormat = "0"
rCell.EntireColumn.TextToColumns Destination:=rCell, DataType:=xlFixedWidth, _
OtherChar:="" & Chr(10) & "", FieldInfo:=Array(0, 2), TrailingMinusNumbers:=True
Else
bNumbers = False
End If
arrFilter = sh.Range(rCell.Offset(1), sh.Cells(sh.Rows.Count, rCell.Column).End(xlUp).Offset(IIf(bBlanks, 1, 0))).Value
If Application.WorksheetFunction.Subtotal(3, rCell.EntireColumn) = 1 Then
rSource.AutoFilter Field:=rCell.Column, Criteria1:=""
Else:
arrFilter = Application.Transpose(arrFilter)
sNumberFormat = rSource.Cells(2, rCell.Column).NumberFormat
If bNumbers Then _
rSource.Columns(rCell.Column).NumberFormat = "0"
rSource.AutoFilter Field:=rCell.Column, Criteria1:=arrFilter, Operator:=xlFilterValues
rSource.Cells(2, rCell.Column).NumberFormat = sNumberFormat
End If
Set arrFilter = Nothing
End If
Next rCell
'so it doesn’t run at next sheet activate
Set mPivotTable = Nothing
Application.Calculation = lOldCalc
'Delete the sheet created by double click
Application.DisplayAlerts = False
sh.Delete
Application.DisplayAlerts = True
rSource.Parent.Activate
End If
End Sub
Private Function IsDataField(rCell As Range) As Boolean
Dim bDataField As Boolean
Dim i As Long
bDataField = False
For i = 1 To mPivotTable.DataFields.Count
If rCell.Value = mPivotTable.DataFields(i).SourceName Then
bDataField = True
Exit For
End If
Next i
IsDataField = bDataField
End Function