Power Query Excel 2016 komme nicht weiter
#1
Hallo zusammen, :)

Ich habe folgende Tabelle. Ich benötige in einem Extra Reiter die dynamische Abfrage der folgenden Daten: Kundennr., Kunde, nicht bearbeitet Eingänge und das Datum, wann diese eingegangen sind. Die Kollegen tragen das Eingangsdatum ein und daneben "nicht bearbeitet". Wenn die Vorgänge erledigt sind, tragen sie das Erledigungsdatum oder einen Kommentar ein. Ansonsten steht dort "nicht bearbeitet". Könnt ihr mir dabei helfen?

Lieben Dank und liebe Grüße
.xlsx   Tabelle1.xlsx (Größe: 18,5 KB / Downloads: 12)
er die dynamische Anzeige der folgenden Angaben: Kundennummer, Kunde, nicht bearbeitete Eingänge und das Datum, wann diese eingegangen sind. Die Kollegen tragen das Eingangsdatum ein und daneben "nicht bearbeitet". Wenn die Angelegenheit erledigt ist, tragen sie das Erledigungsdatum oder einen Kommentar ein; ansonsten steht dort "nicht bearbeitet". Könnt ihr mir dabei helfen? Ich habe folgende Tabelle. Ich benötige in einem Extra-Reiter die dynamische Anzeige der folgenden Angaben: Kundennummer, Kunde, nicht bearbeitete Eingänge und das Datum, wann diese eingegangen sind. Die Kollegen tragen das Eingangsdatum ein und daneben "nicht bearbeitet". Wenn die Angelegenheit erledigt ist, tragen sie das Erledigungsdatum oder einen Kommentar ein; ansonsten steht dort "nicht bearbeitet". Könnt ihr mir dabei helfen? Ich habe folgende Tabelle. Ich benötige in einem Extra-Reiter die dynamische Anzeige der folgenden Angaben: Kundennummer, Kunde, nicht bearbeitete Eingänge und das Datum, wann diese eingegangen sind. Die Kollegen tragen das Eingangsdatum ein und daneben "nicht bearbeitet". Wenn die Angelegenheit erledigt ist, tragen sie das Erledigungsdatum oder einen Kommentar ein; ansonsten steht dort "nicht bearbeitet". Könnt ihr mir dabei helfen? Ich habe folgende Tabelle. Ich benötige in einem Extra-Reiter die dynamische Anzeige der folgenden Angaben: Kundennummer, Kunde, nicht bearbeitete Eingänge und das Datum, wann diese eingegangen sind. Die Kollegen tragen das Eingangsdatum ein und daneben "nicht bearbeitet". Wenn die Angelegenheit erledigt ist, tragen sie das Erledigungsdatum oder einen Kommentar ein; ansonsten steht dort "nicht bearbeitet". Könnt ihr mir dabei
Antworten Top
#2
(19.01.2026, 17:58)Excel2016_ schrieb: Die Kollegen tragen das Eingangsdatum ein und daneben "nicht bearbeitet". Wenn die Vorgänge erledigt sind, tragen sie das Erledigungsdatum oder einen Kommentar ein. Ansonsten steht dort "nicht bearbeitet". Könnt ihr mir dabei helfen?

Da steht noch jede Menge anderes Zeugs... viel Spaß bei der Bereinigung.

.xlsx   Tabelle1.xlsx (Größe: 49,21 KB / Downloads: 5)

Andreas.
Antworten Top
#3
Hallo,

hier wird PQ wohl mit den Zähnen klappern. So eine simple in VBA gebaute Regel:
Code:
If Not .Cells(i, j) <> "" And .Cells(i, j - 1) <> "" Then
bekomme ich zumindest auf die Schnelle in PQ nicht fehlerfrei zum Laufen. Offensichtlich schein PQ diese Regel anders zu interpretieren
Es passieren immer wieder falsche Ausgaben. Also, das meiste klappt, aber eben nicht alles. Wenn PQ sich bei diesen Rohdaten zickig verhält, ist VBA eben hier schlicht das robustere Werkzeug.

Die Tabelle in Blatt "Tabelle1" habe ich zum Listobjekt formatiert. Die paar Codezeilen reichen für so was aus:
Code:
Sub UnbearbeiteteAusgeben()
    Dim arr(1 To 10000, 1 To 4), i&, j&, k&
    With Tabelle1.ListObjects(1).DataBodyRange
        For i = 1 To .Rows.Count
            For j = 4 To Columns.Count Step 2
                If Not .Cells(i, j) <> "" And .Cells(i, j - 1) <> "" Then
                    k = k + 1
                    arr(k, 1) = .Cells(i, 1)
                    arr(k, 2) = .Cells(i, 2)
                    arr(k, 3) = .Cells(i, j - 1)
                    arr(k, 4) = "offen"
                End If
            Next j
        Next i
    End With
    Tabelle2.Cells(2, 1).Resize(UBound(arr, 1), UBound(arr, 2)) = arr
End Sub

.xlsm   Tabelle1.xlsm (Größe: 35,65 KB / Downloads: 3)

Gruß Uwe
Antworten Top
#4
(19.01.2026, 22:15)Egon12 schrieb: Es passieren immer wieder falsche Ausgaben. Also, das meiste klappt, aber eben nicht alles. Wenn PQ sich bei diesen Rohdaten zickig verhält, ist VBA eben hier schlicht das robustere Werkzeug.
Hallo Uwe,

schau mal in meine Datei, wenn ich die Spalte "bearbeitet" nach "(Leere)" filtere dann kommen da die gleichen Zeilen raus wie bei Dir. Wenn ich jedoch "nicht bearbeitet" auch anzeigen lasse haben wir 39 Zeilen.

Das funktioniert mit PQ einwandfrei, die Frage ist jedoch was soll die Ausgabe sein...

Andreas.
Antworten Top
#5
(20.01.2026, 07:00)Andreas Killer schrieb: Das funktioniert mit PQ einwandfrei, die Frage ist jedoch was soll die Ausgabe sein...

Wenn man es richtig macht ... schon. Wenn man jedoch außer acht läßt das beim Entpivotieren leere Werte entfallen (und somit die folgenden lokalen Indexspalten "falsch sind"), dann kommen die Daten ein bißchen durcheinander.

.xlsx   Tabelle1.xlsx (Größe: 50,6 KB / Downloads: 6)

Andreas.
Antworten Top
#6
Hallo Andreas,

39 ist natürlich falsch. Es sind 20. Ich bin mehrere Wege gestern gegangen und hatte zwischen 26 glaub ich mich zu erinnern und um die 45 rum wohl erhalten. Entpivotieren ist natürlich klar.

hier noch mal zum Nachschauen mit 'ner simplen Wenn() UND() Kombi siehe D261.
Deine Datei schau ich mir nachher, wenn der Schüler zur Tür raus ist an. Bin mal neugierig.

.xlsm   Tabelle1.xlsm (Größe: 67,87 KB / Downloads: 5)

Gruß Uwe
Antworten Top
#7
Mir scheint das ein sehr ungünstiger Arbeitsablauf zu sein. Der wird durch die Erstellung einer Auswertung auch nicht besser!
Antworten Top
#8
Hallo Miteinander,

hier nur mit PQ aber eben mit extremen Verrenkungen die korrekte Ausgabe von den 20 unbearbeiteten Fällen in dieser Tabelle.
M-Code:
Code:
let
    Quelle = Excel.CurrentWorkbook(){[Name="Tabelle4"]}[Content],
    Spalten = Table.ColumnNames(Quelle),
    Fix = {"Kundennr.", "Kunde"},
    Dyn = List.Skip(Spalten, 2),
    Paare = List.Split(Dyn, 2),
    Ergebnis =
        List.Accumulate(
            Paare,
            #table({"Kundennr.", "Kunde", "Eingang", "bearbeitet"}, {}),
            (state, pair) =>
                let
                    EingangSpalte = pair{0},
                    BearbSpalte   = pair{1},
                    Teil =
                        Table.RenameColumns(
                            Table.SelectColumns(
                                Quelle,
                                {"Kundennr.", "Kunde", EingangSpalte, BearbSpalte}
                            ),
                            {
                                {EingangSpalte, "Eingang"},
                                {BearbSpalte,   "bearbeitet"}
                            }
                        )
                in
                    Table.Combine({state, Teil})
        ),
    EntferneNullEingang =
        Table.SelectRows(Ergebnis, each [Eingang] <> null),
    Bereinigt =
        Table.SelectRows(
            EntferneNullEingang,
            each not (
                Text.Trim(Text.From([Eingang])) = "" and
                Text.Trim(Text.From([bearbeitet])) = ""
            )
        ),
Bereinigt2 =
    Table.TransformColumns(
        Bereinigt,
        {
            {"bearbeitet", each if _ = null then "" else Text.Trim(Text.From(_)), type text}
        }
    ),
NurOffene =
    Table.SelectRows(
        Bereinigt2,
        each [bearbeitet] = ""
    ),
korrekteAusgabe =
    Table.TransformColumns(
        NurOffene,
        {
            {"bearbeitet", each "noch offen", type text}
        }
    )
in
    korrekteAusgabe
Mal sehen, was der TO nun wirklich haben wollte.

Gruß Uwe

@ws-53

ich baue mir für solche Sachen eigentlich immer erst mal was via VBA um zu schauen wie das Ergebnis aussieht. Gestern hatte ich dann im PQ-Editor leider immer zu Anfang die falsche Abbiegung genommen und als erstes die Spaltenpaare untereinander gesetzt. Das war allerdings völlig falsch.

Manchmal hilft drüber zu schlafen. Die Prozedur ist also nur als Wegweiser zu betrachten und ist überhaupt nicht optimiert (die wurstet durchs Listobjekt). So jetzt schaue ich mir Andreas seine Lösung noch in Ruhe an.

Gruß Uwe
Antworten Top
#9
Hallo,

falls es interessieren sollte die Prozedur nun effizient:
Code:
Sub UnbearbeiteteAusgeben()
    Dim arrtab, arr(1 To 10000, 1 To 4), i&, j&, k&
    arrtab = Tabelle1.ListObjects(1).DataBodyRange.Value
    For i = LBound(arrtab) To UBound(arrtab)
        For j = 4 To UBound(arrtab, 2) Step 2
            If Not arrtab(i, j) <> "" And arrtab(i, j - 1) <> "" Then
                k = k + 1
                arr(k, 1) = arrtab(i, 1)
                arr(k, 2) = arrtab(i, 2)
                arr(k, 3) = arrtab(i, j - 1)
                arr(k, 4) = "offen"
            End If
        Next j
    Next i
    Tabelle2.Cells(2, 1).Resize(k, UBound(arr, 2)) = arr
End Sub


Gruß Uwe
Antworten Top
#10
Mit dem ungünstigen Arbeitsablauf habe ich den des Fragesteller gemeint. Und das der davorliegende Prozess halt nicht besser wird, wenn darauf eine Auswertung aufgesetzt wird. Dabei ist es völlig egal, mit welchen Mitteln die Lösung erstellt wird.

In meinem Berufsleben kam es zwar auch vor, dass ich manchmal Prozesse von hinten optimiert habe. Aber i.d.R. habe ich von vorne optimiert. Das brachte dann auch insgesamt die viel größeren Arbeitserleichterungen.
Antworten Top


Gehe zu:


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