Hallo liebe Leute,
Ich bin absoluter Neuling, was die VBA-Programmierung angeht und werde wohl auch nicht die Zeit dazu haben, mich da in nächster Zeit intensiver einzulernen.
Möglicherweise könnt ihr mir ja weiterhelfen, ich wäre auf jeden Fall unglaublich dankbar.
Folgendes: Ich will in meiner Exceltabelle die Filter innerhalb eines Arbeitsblattes verknüpfen. Sprich änder ich das eine springt, das andere automatisch auf den gleichen Wert bzw. andersrum.
Das hat bisweilen mit zusammengeklautem Code aus diverser anderer Foren ganz gut geklappt. Das Problem ist nur, dass dieser Code auch alle anderen Arbeitsblätter mit Pivottabellen berücksichtigt, die wiederrum Fehler versuchen. Deswegen meine Frage: Ist es möglich folgenden Code ohne großen Aufwand entweder nur auf mein Arbeitsblatt „Analyse“ zuzuschneiden bzw. allgemein zubelassen und stattdessen mein Arbeitsplatt „Trend“ davon auszunehmen. Ich hoffe ihr könnt mir helfen. Liebe Grüße. Stephan.
Private Sub Workbook_SheetPivotTableUpdate(ByVal Sh As Object, ByVal Target As PivotTable)
Dim wS As Worksheet
Dim pt As PivotTable
Dim pf As PivotField
On Error GoTo ErrorHandler
Application.EnableEvents = False
For Each wS In ThisWorkbook.Worksheets
For Each pt In wS.PivotTables
If pt.Name Target.Name Then
For Each pf In Target.PageFields
pt.PivotFields(pf.Value).CurrentPage = _
Target.PivotFields(pf.Value).CurrentPage.Value
Next pf
End If
Next pt
Next wS
ResumePoint:
Application.EnableEvents = True
Exit Sub
ErrorHandler:
Application.Goto pt.TableRange1
MsgBox „Diese PT hat einen Fehler verursacht“
Resume ResumePoint:
End Sub
Hallo!
Also wenn es nur auf „Analyse“ ausgeführt werden soll, dann füge folgende Zeile vor dem
On Error GoTo ErrorHandler
ein
if lcase(activesheet.name) „analyse“ then exit sub
oder wenn es auf jedem blatt ausgeführt werden, AUßER auf „Trend“, dann füge stattdessen diese zeile ein:
if lcase(activesheet.name) = „trend“ then exit sub
gruß
ralf
Danke schonmal für die Mühe. Jetzt verursachen die Tabellen in „Trend“ beim öffnen der Datei keine Fehlermeldung mehr. Ändere ich dann aber die Filter in „Analyse“ springt die Ansicht wieder zur PT in „Trend“ und es erscheitn die Meldung, dass diese PT einen Fehler verursacht. Mein Code steht übrigens bei „Diese Arbeitsmappe“.
Private Sub Workbook_SheetPivotTableUpdate(ByVal Sh As Object, ByVal Target As PivotTable)
Dim wS As Worksheet
Dim pt As PivotTable
Dim pf As PivotField
If LCase(ActiveSheet.Name) „analyse“ Then Exit Sub
On Error GoTo ErrorHandler
Application.EnableEvents = False
For Each wS In ThisWorkbook.Worksheets
For Each pt In wS.PivotTables
If pt.Name Target.Name Then
For Each pf In Target.PageFields
pt.PivotFields(pf.Value).CurrentPage = _
Target.PivotFields(pf.Value).CurrentPage.Value
Next pf
End If
Next pt
Next wS
ResumePoint:
Application.EnableEvents = True
Exit Sub
ErrorHandler:
Application.Goto pt.TableRange1
MsgBox „Diese PT hat einen Fehler verursacht“
Resume ResumePoint:
End Sub
Ich will in meiner Exceltabelle die Filter
innerhalb eines Arbeitsblattes verknüpfen.
Hallo Stephan,
da ich mir die ganze Sache nicht so richtig vorstellen kann, kann ich dir hier nicht weiterhelfen.
LG Johannes E.
hi!
ja, da war ich ein wenig zu schnell.
bevor ich das korrigiere, was soll jetzt genau passieren.
1.) wenn ein filter ausschließlich auf „analyse“ betätigt wird, soll das makro ausgeführt werden?
oder
2.) es soll auf jedem tabellenblatt das makro ausgeführt werden, außer auf trend"?
Letztenendes soll das Makro einfach nur in „Analyse“ wirken. Also treffen beide Aussagen zu. Weiß nur einfach nicht, wie ich das hinbekomme. Sorry für die Unfähigkeit
lg.
Ändere den Hauptblock wie folgt:
Application.EnableEvents = False
wS = ThisWorkbook.Worksheets("Analyse")
For Each pt In wS.PivotTables
If pt.Name Target.Name Then
For Each pf In Target.PageFields
pt.PivotFields(pf.Value).CurrentPage = \_
Target.PivotFields(pf.Value).CurrentPage.Value
Next pf
End If
Next pt
Ok!
Wenn es nur das Blatt „Analyse“ betrifft, lösche das Makro unter „Arbeitsmappe“ und kopiere nachfolgendes hinter das Blatt „Analyse“
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Dim wS As Worksheet
Dim pt As PivotTable
Dim pf As PivotField
'If LCase(ActiveSheet.Name) „analyse“ Then Exit Sub
On Error GoTo ErrorHandler
Application.EnableEvents = False
'For Each wS In ThisWorkbook.Worksheets
For Each pt In ActiveSheet.PivotTables
If pt.Name Target.Name Then
For Each pf In Target.PageFields
pt.PivotFields(pf.Value).CurrentPage = _
Target.PivotFields(pf.Value).CurrentPage.Value
Next pf
End If
Next pt
'Next wS
ResumePoint:
Application.EnableEvents = True
Exit Sub
ErrorHandler:
Application.Goto pt.TableRange1
MsgBox „Diese PT hat einen Fehler verursacht“
Resume ResumePoint:
End Sub
1 „Gefällt mir“
Alles klar. Funktioniert. Viele Dank auch 
Hallo Stephan,
per select Case kannst du die Verarbeitung der Tabellenblätter über den Blatt-Namen steuern.
Die Fehlerbehandlung kann man damit auch flexibler gestalten, indem ggf. auf bestimmte Fehlernummern geprüft wird.
Gruß
Franz
Private Sub Workbook\_SheetPivotTableUpdate(ByVal Sh As Object, ByVal Target As PivotTable)
Dim wS As Worksheet
Dim pt As PivotTable
Dim pf As PivotField
On Error GoTo ErrorHandler
Application.EnableEvents = False
For Each wS In ThisWorkbook.Worksheets
Select Case wS.Name
Case "Trend", "TabelleXYZ"
'in diesen Tabellen die Pivottabs nicht anpassen
Case Else
For Each pt In wS.PivotTables
If pt.Name Target.Name Then
For Each pf In Target.PageFields
pt.PivotFields(pf.Value).CurrentPage = \_
Target.PivotFields(pf.Value).CurrentPage.Value
Next pf
End If
Next pt
End Select
Next wS
ErrorHandler:
With Err
Select Case .Number
Case 0 'Alles ok
Case Else
Application.Goto pt.TableRange1
MsgBox "Diese PT hat einen Fehler verursacht"
End Select
End With
Application.EnableEvents = True
End Sub
Hallo Herr Sonderbar,
ich weiß nicht, was Sie mit diesem Filterwechsel bezwecken wollen und dann noch unter VBA.
Das geht doch auch ganz nett auf Tabellenebene.
Wenn schon VBA, sollten Sie sich passende Fachlektüre besorgen und Zeit investieren. Ich musste das auch.
Leider kann ich mit Filterbedingungen unter VBA nur über Suchbedingungen die Filter setzen, oder deaktivieren.
Ihr Beispiel ist etwas sonderbar.
mfg
Softoldi
Hallo Stephan
Leider kann ich dir da auf der Schnelle nicht weiter helfen. Mir fehlt aus Beruflichen Gründen die Zeit.
Gruß
Michael
Hallo Stephan,
in deinen Code steht die Zeile ‚For Each wS In ThisWorkbook.Worksheets‘ , dieses durchläuft ALLE Arbeitsblätter in deinen Code und bearbeitet bzw. ändert auch diese.
Folgende Zeilen bitte löschen:
Dim wS As Worksheet
For Each wS In ThisWorkbook.Worksheets
Next wS
Folgende Zeile ändern:
For Each pt In wS.PivotTables
— in —
For Each pt In ThisWorkbook.Worksheets(„Analyse“).PivotTables
Somit sollte es klappen, damit wird nur das Arbeitsblatt „Analyse“ bearbeitet.
Andreas
Hallo,
tut mir leid, da kann ich leider nicht helfen.
Gruß
Sabine