Verhindern Sie, dass sich bestimmte Spalten in Excel wiederholen

Verhindern Sie, dass sich bestimmte Spalten in Excel wiederholen

Es gibt einen Bericht, den ich aus unserem ERP-System ziehe und der detaillierte Bestellinformationen auflistet. Darin sind Bestellnummer, Kundencode, Kundenname, Bestelldatum, Bestellstatus, Bestellsumme, Produktcode, Produktname und bestellte Menge, Stückpreis und Gesamtpreis aufgeführt. Wenn eine Bestellung mehrere Zeilen hat, werden die Kopfinformationen mehrfach aufgeführt.

So sehen die Rohdaten aus. BestellberichtUnformatiert

Ich versuche, in Excel eine Möglichkeit zu finden, die Wiederholung der Kopfzeilen für alle Detailzeilen zu verhindern.

Ich hätte es vorgezogen, wenn die Daten so aussehen würden, wenn ich fertig bin. Im Grunde genommen wiederholen sich alle Zeilen unter ihren jeweiligen Kopfzeilen. BestellberichtFormatiert1

Ein anderes akzeptables Format könnte unten stehen. Ich denke, das könnte einfacher sein. Ich konnte dies mit einer Pivot-Tabelle tun. Bildbeschreibung hier eingeben

Ich bin nicht sicher, ob hierfür VBA erforderlich ist oder nicht. Ich habe versucht, die Zeilen hervorzuheben und Duplikate zu entfernen, aber dadurch werden alle Zeilen zusammen verschoben. Für jede Hilfe wäre ich sehr dankbar.

Antwort1

Ich weiß, dass das verpönt ist, aber das Problem klang interessant, also habe ich einfach das VBA geschrieben


Probieren Sie den folgenden Code aus. Ich habe die Konstanten so eingestellt, dass sie für Ihr Beispiel funktionieren, aber für Ihre tatsächliche Anwendung möchten Sie sie vielleicht ändern.

Function CompressReport()

    'Settings for which columns are the header and details
    Const fHC As Long = 1   'First header column number
    Const lHC As Long = 6   'Last header column number
    Const fDC As Long = 7   'First detail column number
    Const lDC As Long = 11  'Last detail column number

    'Declarations
    Dim rStart&, rStop&, rNew As Long
    Dim r&, c As Long
    Dim ws As Worksheet
    Dim wsNew As Worksheet
    Dim s1$, s2 As String

    'Set the source worksheet to be compressed
    '(Here are a few methods to do this. Pick one.)
    Set ws = Sheet1
    Set ws = Worksheets(1)
    Set ws = Worksheets("Sheet1")

    'Add a new worksheet for our results
    Set wsNew = Worksheets.Add(After:=ws)

    With ws
        'Copy the first row of headers
        .Range(.Cells(1, fHC), .Cells(1, lHC)).Copy wsNew.Cells(1, 1)
        rNew = 2

        'Loop through all the rows
        For rStart = 2 To ws.UsedRange.Rows.Count

            'Copy the header information
            .Range(.Cells(rStart, fHC), .Cells(rStart, lHC)).Copy wsNew.Cells(rNew, 1)

            'Add a thick border (This wasn't in the OP but I recommend it)
            With wsNew.Range(wsNew.Cells(rNew, 1), wsNew.Cells(rNew, lHC - fHC + 1)).Borders(xlEdgeTop)
                .LineStyle = xlContinuous   'You could also try xlDouble
                .Weight = xlThick
            End With

            'Collect the header information into a single unique ID
            s1 = ""
            For c = fHC To lHC
                s1 = s1 & "|" & .Cells(rStart, c).Value
            Next

            'Find the next row with different information
            For rStop = rStart + 1 To .UsedRange.Rows.Count
                s2 = ""
                For c = fHC To lHC
                    s2 = s2 & "|" & .Cells(rStop, c).Value
                Next
                If s2 <> s1 Then Exit For
            Next
            rStop = rStop - 1

            'Copy the detail headers and information
            .Range(.Cells(1, fDC), .Cells(1, lDC)).Copy wsNew.Cells(rNew + 1, 2)
            .Range(.Cells(rStart, fDC), .Cells(rStop, lDC)).Copy wsNew.Cells(rNew + 2, 2)

            'Increase the row we're pasting in the new worksheet
            ' +1 for header data, +1 for detail headers, +n for detail information
            rNew = rNew + 1 + 1 + (rStop - rStart + 1)

            'Increase the row we're copying in the source worksheet
            rStart = rStop  'The FOR loop will iterate it +1

        Next

    End With

    'Formatting (feel free to add to this part)
    With wsNew
        .Columns.AutoFit
    End With

    'Cleanup
    Set wsNew = Nothing
    Set ws = Nothing

End Function

Antwort2

Hier ist ein kleiner Trick, um Ihr Ziel zu erreichen. Er kann auf Zellen in jeder Spalte angewendet werden. Nehmen wir an, wir beginnen mit:

Bildbeschreibung hier eingeben

Und wir wollen vermeiden, all die zusätzlichenMike's, usw.Wir klicken auf ZelleA2und wenden Sie die bedingte Formatierung an, sodass, wenn der Wert der Zelle derselbe ist wie der der darüberliegenden Zelle, die Schriftfarbe mit der Farbe des Zellenhintergrunds übereinstimmt:

Bildbeschreibung hier eingeben

Wir kopieren dann die ZelleA2und PasteSpecialFormats in der Spalte. Dadurch werden die sich wiederholenden Werte „versteckt“:

Bildbeschreibung hier eingeben

Die eigentlichen Daten bleiben erhalten, lediglich die Anzeige wird geändert!

Antwort3

Ich legte

                        CSV-Daten im Markdown; klicken Sie auf „Bearbeiten“, um darauf zuzugreifen

in Sheet1, und ich konnte Sheet2 folgendermaßen gestalten:

Dabei kommen zwei Hilfsspalten zum Einsatz, die Sie natürlich beliebig (oder nötig) nach rechts verschieben und ausblenden können.

  • Setzen Sie A1(auf Blatt2) auf =Sheet1!A1und ziehen Sie nach rechts, um die Spalten abzudecken, die sonst über mehrere Zeilen dupliziert würden. In Ihrem Beispiel wäre dies Column  F. (In meinem Beispiel ist es Column  C.)
  • Setzen Sie Y2auf 2und Z2auf 1. Der Wert in Spalte  Ygibt an, welche Zeile in Blatt1DasZeile zieht Daten aus. Spalte  Zist, 1wenn dies eine Kopfzeile ist (zieht Daten aus den linken Spalten von Blatt1, d. h. Schlüsselfelder), 2wenn dies eine Unterüberschriftenzeile ist, 3wenn dies eine Unterdatenzeile ist (zieht Daten aus den rechten Spalten von Blatt1) und 0wenn dies eine leere Zeile ist (unter der letzten Datenzeile).
  • A2Auf einstellen =IF($Z2=1, INDEX(Sheet1!A:A, $Y2), ""). Ziehen Sie ggf. nach rechts, um die Spalten abzudecken, die nur für Schlüsseldaten verwendet werden. In Ihrem Beispiel ist dies nicht anwendbar, da Sie Nicht-Schlüsseldaten haben, die in Spalte beginnen  B. (In meinem Beispiel geht es bis Spalte  B.) Dies implementiert die Definitionen der Hilfsspalten: Wenn Zist 1, ziehen Sie die Schlüsseldaten aus Sheet1, andernfalls leer.
  • In meinem Beispiel habe C2ich

    =CHOOSE($Z2+1, "", INDEX(Sheet1!C:C, $Y2), Sheet1!D$1, INDEX(Sheet1!D:D, $Y2))
    

    In Ihrem Beispiel sollten Sie Folgendes einstellen B2:

    =CHOOSE($Z2+1, "", INDEX(Sheet1!B:B, $Y2), Sheet1!G$1, INDEX(Sheet1!G:G, $Y2))
    

    Dies spiegelt die beiden Spalten von Sheet1 wider,  Baus denen die Spalte von Sheet2 möglicherweise zieht:

    • Spalte  B(„Kundencode“) oder
    • Spalte  G(„Produktcode“)

    Auch hier wird nur das ausgeführt, was die Hilfsspalten vorgeben. Wir addieren 1den ZWert zu map 0, 1, 2, und 3 zu 1, 2, 3, und 4CHOOSEverwendet das erste Argument zum Indizieren der folgenden Argumente, also

    • Wenn , leer Z,0
    • Wenn Zja 1, holen Sie sich die wichtigsten Daten,
    • Wenn Zdies der Fall ist 2, holen Sie sich die Überschrift aus Zeile 1 von Blatt 1 1und
    • Wenn Zdies der Fall ist 3, holen Sie sich die Nicht-Schlüsseldaten.
  • Stellen Sie Y3auf =IF($Z2<3, $Y2, $Y2+1)und Z3auf

    =IF($Z2=0, 0, IF($Z2<3, $Z2+1, IF(INDEX(Sheet1!A:A,$Y2+1)="", 0,
                        IF(INDEX(Sheet1!A:A,$Y2)=INDEX(Sheet1!A:A,$Y2+1), 3, 1))))
    

    (alles in einer Zeile). Das heißt, wenn der ZWert in der vorherigen Zeile 1oder 2(oder  0) ist, setzen Sie diesen YWert auf den gleichen Wert wie in der vorherigen Zeile. Dies liegt daran, dass jede Zeile in Ihrer Datenbanktabelle (jeder Satz eindeutiger Werte in Spalten AFauf Blatt1) mindestens drei Zeilen auf Blatt2 ergibt. Andernfalls erhöhen Sie den YWert, um die nächste Zeile auf Blatt1 anzusprechen.

    Wenn der vorherige ZWert ist 0, sind wir fertig und füllen mit Nullen auf. Wenn der vorherige ZWert 1oder ist 2, gehen wir zum nächsten Wert über. Andernfalls sehen wir uns die Schlüsseldaten von Sheet1 an. Wenn sie leer sind, gehen wir davon aus, dass wir am Ende der Daten sind und setzen auf Z0Wenn sie mit der vorherigen Zeile identisch sind, verwenden wir , 3um mit unserer Arbeit fortzufahren. Andernfalls befinden wir uns in einem neuen Satz eindeutiger Werte, also starten wir den Zyklus mit einem neu 1.

  • Ziehen Sie weit genug nach unten, um alle Ihre Daten abzurufen.

Wenn Ihre eindeutigen Werte einzeln nicht eindeutig sind (wenn Sie beispielsweise A4=, A5aber B4≠ haben B5), erweitern Sie die Tests in der Spalte  Z , um so viele Spalten wie nötig zu testen (kombinieren Sie sie mit AND(…)).

Natürlich habe ich eine bedingte Formatierung mit der Formel verwendet =$Z2=2, um die Unterüberschriften entsprechend zu formatieren.

verwandte Informationen