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.
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.
Ein anderes akzeptables Format könnte unten stehen. Ich denke, das könnte einfacher sein. Ich konnte dies mit einer Pivot-Tabelle tun.
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:
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:
Wir kopieren dann die ZelleA2und PasteSpecialFormats in der Spalte. Dadurch werden die sich wiederholenden Werte „versteckt“:
Die eigentlichen Daten bleiben erhalten, lediglich die Anzeige wird geändert!
Antwort3
Ich legte
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!A1
und ziehen Sie nach rechts, um die Spalten abzudecken, die sonst über mehrere Zeilen dupliziert würden. In Ihrem Beispiel wäre dies ColumnF
. (In meinem Beispiel ist es ColumnC
.) - Setzen Sie
Y2
auf2
undZ2
auf1
. Der Wert in SpalteY
gibt an, welche Zeile in Blatt1DasZeile zieht Daten aus. SpalteZ
ist,1
wenn dies eine Kopfzeile ist (zieht Daten aus den linken Spalten von Blatt1, d. h. Schlüsselfelder),2
wenn dies eine Unterüberschriftenzeile ist,3
wenn dies eine Unterdatenzeile ist (zieht Daten aus den rechten Spalten von Blatt1) und0
wenn dies eine leere Zeile ist (unter der letzten Datenzeile). A2
Auf 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 beginnenB
. (In meinem Beispiel geht es bis SpalteB
.) Dies implementiert die Definitionen der Hilfsspalten: WennZ
ist1
, ziehen Sie die Schlüsseldaten aus Sheet1, andernfalls leer.In meinem Beispiel habe
C2
ich=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,
B
aus 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
1
denZ
Wert zu map0
,1
,2
, und3
zu1
,2
,3
, und4
.CHOOSE
verwendet das erste Argument zum Indizieren der folgenden Argumente, also- Wenn , leer
Z
,0
- Wenn
Z
ja1
, holen Sie sich die wichtigsten Daten, - Wenn
Z
dies der Fall ist2
, holen Sie sich die Überschrift aus Zeile 1 von Blatt 11
und - Wenn
Z
dies der Fall ist3
, holen Sie sich die Nicht-Schlüsseldaten.
- Spalte
Stellen Sie
Y3
auf=IF($Z2<3, $Y2, $Y2+1)
undZ3
auf=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
Z
Wert in der vorherigen Zeile1
oder2
(oder0
) ist, setzen Sie diesenY
Wert auf den gleichen Wert wie in der vorherigen Zeile. Dies liegt daran, dass jede Zeile in Ihrer Datenbanktabelle (jeder Satz eindeutiger Werte in SpaltenA
–F
auf Blatt1) mindestens drei Zeilen auf Blatt2 ergibt. Andernfalls erhöhen Sie denY
Wert, um die nächste Zeile auf Blatt1 anzusprechen.Wenn der vorherige
Z
Wert ist0
, sind wir fertig und füllen mit Nullen auf. Wenn der vorherigeZ
Wert1
oder ist2
, 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 aufZ
.0
Wenn sie mit der vorherigen Zeile identisch sind, verwenden wir ,3
um mit unserer Arbeit fortzufahren. Andernfalls befinden wir uns in einem neuen Satz eindeutiger Werte, also starten wir den Zyklus mit einem neu1
.- Ziehen Sie weit genug nach unten, um alle Ihre Daten abzurufen.
Wenn Ihre eindeutigen Werte einzeln nicht eindeutig sind (wenn Sie beispielsweise A4
=, A5
aber 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.