Datenschnitt (Slicer) - alle Elemente durchlaufen
#1
Hallo zusammen,

ich habe einen Datenschnitt der auf eine Power-BI Datenquelle geht.
Manuell kann ich die einzelnen Elemente im Datenschnitt problemlos auswählen und die dahinterliegende Abfrage laut Power-Bi wird aktualisiert und an alle damit verknüpften Tabellen übergeben.

Aber ich würde das nun gerne mit VBA lösen, so dass alle Datensätze durchlaufen werden und das bekomme ich leider nicht hin.
In einem Datenschnitt der mit einer Pivot-Tabelle verknüpft ist funktioniert es problemlos, aber beim Datenschnitt der mit Power-BI verknüpft ist funktioniert es nicht (siehe Screenshot).

Code:
Sub DatenVerarbeitenUndSpeichern()

    Dim wsCheckliste As Worksheet
    Dim wsParameter As Worksheet
    Dim datenschnitt As slicerCache
    Dim slicerItem As slicerItem
    Dim cell As Range
    Dim dateiPfad As String
    Dim datumStr As String
    Dim neuerDateiName As String
    Dim neuerDateiPfad As String
    Dim pdfDateiPfad As String
    Dim zielWb As Workbook
    Dim quellWb As Workbook

    ' Arbeitsblätter definieren
    Set wsCheckliste = ThisWorkbook.Sheets("Checkliste")
    Set wsParameter = ThisWorkbook.Sheets("Parameter + Zusammenfassung")

    ' Den richtigen SlicerCache für "AB_ID_Artikelfamilie" definieren
    Set datenschnitt = ThisWorkbook.SlicerCaches("Datenschnitt_AB_ID_Artikelfamilie")

    ' Datum im Format JJJJ-MM-TT als String generieren
    datumStr = Format(Date, "yyyy-mm-dd_")

    ' Durch die Werte in Spalte D ab Zeile 2 im Blatt "Checkliste" schleifen
    For Each cell In wsCheckliste.Range("D2:D" & wsCheckliste.Cells(Rows.Count, "D").End(xlUp).Row)

        ' Datenschnitt zurücksetzen, um nur den aktuellen Wert auszuwählen
        'datenschnitt.ClearManualFilter

        ' Prüfen, ob der Wert im Datenschnitt verfügbar ist, bevor er ausgewählt wird
        For Each slicerItem In datenschnitt.SlicerItems
            If slicerItem.Name = cell.Value Then
                slicerItem.Selected = True
                Exit For
            End If
        Next slicerItem

End Sub


Vielleicht hat ja jemand einen entscheidenden Tipp oder einen Workaround für mich.

Vielen Dank und lg

Oliver


Angehängte Dateien Thumbnail(s)
   
WIN 10 64-Bit Pro / EXCEL Microsoft Office 365 ProPlus 64-Bit
Antworten Top
#2
Hi,

da musst Du mal die Abfrage- bzw. Verbindungsnamen kontrollieren. 

Das könnte so aussehen: 

PHP-Code:
ActiveWorkbook.Queries.Add Name:="Datenschnitt_AB_ID_Artikelfamilie",....
'oder eben auch so:
ActiveWorkbook.Queries.Add Name:="Suche_Artikelfamilie",.... 

also... unterschiedliche Quellen.... unterschiedliche Namen... 

Lass Dir mal alle Cache - Namen anzeigen:
PHP-Code:
Dim sc As SlicerCache
With ActiveWorkbook
    
For Each sc In .SlicerCaches
       Debug
.Print sc.Name
    Next
End With 
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#3
Hallo Ralf,

danke dir - Name laut Makro ist "Datenschnitt_AB_ID_Artikelfamilie"

Hätte auch mal noch das hier versucht: ActiveWorkbook.Queries.Add Name:="Datenschnitt_AB_ID_Artikelfamilie"

Code:
Sub SlicerNames()

Dim sc As slicerCache

With ActiveWorkbook
    For Each sc In .SlicerCaches
       Debug.Print sc.Name
    Next
End With

ActiveWorkbook.Queries.Add Name:="Datenschnitt_AB_ID_Artikelfamilie"

End Sub

Da bei " ActiveWorkbook.Queries.Add " läuft das Makro auf einen Fehler - siehe Screenshot.

Wie könnte ich nun den Slicer aktiv auswählen, alle Elemente auslesen und der Reihe nach durchlaufen?

Danke und lg

Oliver


Angehängte Dateien Thumbnail(s)
   
WIN 10 64-Bit Pro / EXCEL Microsoft Office 365 ProPlus 64-Bit
Antworten Top
#4
Moin,

1. die Add-Methode braucht ein paar mehr Argumente. Du solltest auch keine Query hinzufügen, sondern danach suchen...
2. vermutlich gibt es die Querie Datenschnitt_AB_ID_Artikelfamilie schon. Weshalb also noch mal einfügen wollen? (was auch nicht ginge). Was sagt denn die Ausgabe im Direktfenster?
3. Welcher Slicer ist denn mit der Abfrage zu Power BI verknüpft? Das kann ich doch nicht wissen....
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#5
1. Das hatte ich wohl falsch verstanden, sorry.
2. Ja genau, der Name ist "SLICER_ARTIKELFAMILIE", im Feld für die Datenschnitteinstellung steht aber bei "In Formeln zu verwendeter Name" dann "AB_ID_Artikelfamilie"
3. Der Slicer ist mit ~ 20 verschiedenen Power BI Abfragen verknüpft. Eine davon heißt beispielsweise "Top_Kunden_pro_Mandant_ohne_Direktion_und_Divisionen" (siehe Screenshot)

---

4. Wenn ich im Slicer den ersten Eintrag "1" auswähle wir das korrekt in die Power BI Abfragen übergeben. Das würde ich gerne für alle Einträge aus dem Slicer automatisieren (sind ~ 800, nicht fortlaufende Nummern)
5. Wenn ich mit dem Rekorder aufzeichne was passiert wenn ich die "AB_ID_Artikelfamilie" mit der Nummer "1" manuell direkt in der Abfrage "Top_Kunden_pro_Mandant_ohne_Direktion_und_Divisionen" anklicke schaut das wie folgt aus:

Code:
    ActiveSheet.PivotTables("Top_Kunden_pro_Mandant_ohne_Direktion_und_Divisionen") _
        .PivotFields("[Artikel].[AB_ID_Artikelfamilie].[AB_ID_Artikelfamilie]"). _
        VisibleItemsList = Array("[Artikel].[AB_ID_Artikelfamilie].&[1.]")

6. Wenn ich mit dem Rekorder aufzeichne was passiert wenn ich die "AB_ID_Artikelfamilie" mit der Nummer "889" manuell direkt in der Abfrage "Top_Kunden_pro_Mandant_ohne_Direktion_und_Divisionen" anklicke schaut das wie folgt aus. Keine Ahnung wieso oben "1." steht und hier dann "8.89E2".

Code:
ActiveSheet.PivotTables("Top_Kunden_pro_Mandant_ohne_Direktion_und_Divisionen") _
        .PivotFields("[Artikel].[AB_ID_Artikelfamilie].[AB_ID_Artikelfamilie]"). _
        VisibleItemsList = Array("[Artikel].[AB_ID_Artikelfamilie].&[8.89E2]")

Danke für deine Hilfe.


Angehängte Dateien Thumbnail(s)
   
WIN 10 64-Bit Pro / EXCEL Microsoft Office 365 ProPlus 64-Bit
Antworten Top
#6
...smile... Du wirbelst hier alles bunt durcheinander... PivotTables mit Slicern, mit deren Cache... das kann nicht klappen... 

Ergo, Du musst überlegen:
  1. Wo kommt das her 
  2. Was willst Du haben (und was ist das verdammt nochmal... Text, Zahl, Datum?)
  3. wo soll das hin...

Das kann nicht alles ein und dasselbe sein. Soweit logisch, oder?

Zu
  1. aus einem (bestimmten) Slicer (mit einer jeweils eigenen Querie) 
  2. einen(?) oder mehrere(?) (markierte(n)) Wert(e) dieses einen bestimmten Slicers
  3. in eine (bestimmte) Pivottabelle

Also mach Dir einen Plan.
  1. Welche Slicer hast Du (wie heißen die, welche Quelle nutzen die). Wenn Du das nicht weißt, kannst Du auch in der Wüste angeln gehen...
  2. durchlaufe deren SlicerItems und lass Dir die Werte der markierten Einträge zurückgeben
  3. diese Werte kannst Du dann der Pivottable zuweisen oder in einer Variablen speichern, die Du dann der PT (oder was anderem) zuweist...

Und weil Du ja immer auf und von verschiedenen Objekten zugreifen willst, erstellt man sich Sub's/Funktionen mit Parametern um das ganze flexibel zu gestalten.

Und wenn Du statt der Value Eigenschaft des Sliceritems die Name Eigenschaft verwendest, dann wird aus 8.89E2 auch 8.89
Wenn immer nur ein Wert verwendet werden soll, kannst Du auch auf die Array Funktion bei der Zuweisung verzichten.
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste