Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1160to1164
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zeilen zusammenfassen

Zeilen zusammenfassen
Andreas
Hallo zusammen,
habe zu meinem Problem jetzt schon das Archiv durchsucht, aber ohne Ergebnis.
Ich arbeite mit einer Tabelle mit mehreren Datenzeilen. In Spalte A steht ein Text (Auftragsnummer), der mehrfach vorkommen kann. In den übrigen Spalten stehen Texte und Zahlen, aber nicht in jeder Zelle steht etwas. So kann es vorkommen das Auftrag 123 in 5 Zeilen vorkommt aber nicht in jeder Zeile sind alle Spalten dieses Auftrages ausgefüllt.
Die mehrfach vorkommenden Datenzeilen sollen nun zusammengefasst werden, so dass für eine Auftragsnummer eine Datenzeile mit gefüllten Spalten übrig bleibt.
Bsp.
Auftrag..Sp1...Sp2...Sp3
123.........T
123.................34
123...........................B
234.........A
234.................15......C
soll ergeben:
Auftrag..Sp1...Sp2...Sp3
123.........T......34......B
234.........A......15......C
Könnt ihr mir da weiterhelfen?
Viele Grüße
AJ
gibt’s ne Bsp-Datei?...owT
17.06.2010 18:57:52
Oberschlumpf
AW: gibt’s ne Bsp-Datei?...owT
18.06.2010 10:20:25
Andreas
Hi Oberschlumpf,
Tino hat mir ja jetzt schon mal einen Code zugeschickt. Werde noch dran rumbasteln und wenn ich nicht weiterkomme melde ich mich noch mal mit einer Bsp Datei. Aber danke für deine Nachfrage.
Viele Grüße
AJ
so habe ich es verstanden.
17.06.2010 19:21:20
Tino
Hallo,
Quelle ist Tabelle1 und die Ausgabe erfolgt auf Tabelle2, eventuell anpassen.
Sub test()
Dim MeAr, tmpAr, ArrItem
Dim oDic As Object
Dim A As Long, B As Long
Dim MaxRow As Long, MaxCol As Long

Set oDic = CreateObject("Scripting.Dictionary")

With Tabelle1 'Tabelle Quelle 
    MeAr = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 4)
End With


For A = 1 To Ubound(MeAr)
    If Not oDic.exists(MeAr(A, 1)) Then
        If MeAr(A, 2) <> "" Then
            oDic(MeAr(A, 1)) = MeAr(A, 2)
        Else
            oDic(MeAr(A, 1)) = ""
        End If
    End If
    
    For B = 3 To Ubound(MeAr, 2)
        If MeAr(A, B) <> "" Then _
        oDic(MeAr(A, 1)) = oDic(MeAr(A, 1)) & ";" & MeAr(A, B)
    Next B
Next A



With Tabelle2 'Tabelle Ziel 
    MaxRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    If MaxRow > 1 Then .Range("A2:A" & MaxRow).Resize(, .Columns.Count).ClearContents
    If oDic.Count > 0 Then
        ArrItem = oDic.Items
        .Cells(2, 1).Resize(oDic.Count) = Application.Transpose(oDic.Keys)
        
        Application.ScreenUpdating = False
        For A = Lbound(ArrItem) To Ubound(ArrItem)
            tmpAr = Split(ArrItem(A), ";")
            .Cells(A + 2, 2).Resize(, Ubound(tmpAr) + 1).Value = tmpAr
            If MaxCol < Ubound(tmpAr) Then MaxCol = Ubound(tmpAr)
        Next A
        
        With .Range("A2", Cells(Rows.Count, 1).End(xlUp)).Resize(, MaxCol + 1)
            tmpAr = .Value2
            
            For A = 1 To Ubound(tmpAr)
                For B = 1 To Ubound(tmpAr, 2)
                    If IsNumeric(tmpAr(A, B)) Then tmpAr(A, B) = tmpAr(A, B) * 1
                Next B
            Next A
            
            .Value = tmpAr
        End With
        Application.ScreenUpdating = True
     End If
End With


Set oDic = Nothing
End Sub
Gruß Tino
Anzeige
AW: so habe ich es verstanden.
18.06.2010 10:18:34
Andreas
Hi Tino,
vielen Dank für deine Hilfe. Habe den Code mal bei mir eingebaut. Ist noch nicht ganz das, was ich benötige. Ich tüftel jetzt mal ein wenig rum und schau ob ich selbst drauf komme. Ansonsten würde ich mich noch mal melden und eine Bsp-Datei hochladen.
Danke noch mal.
Viele Grüße
AJ
AW: so habe ich es verstanden.
18.06.2010 16:07:55
Andreas
Hi Tino,
ich komme nun doch nicht weiter. Ich lade mal eine Bsp.-Datei hoch, die 17 Datensätze enthält und 37 Spalten. https://www.herber.de/bbs/user/70144.xls
An einem Bsp habe ich markiert, was die Ausgangsbasis ist (gelb markiert) und was aus diesen beiden Zeilen als Ergebnis herauskommen soll (grün markiert). Ziel ist es, nur noch eine Zeile pro Projekt zu haben und jede Spalte mit Text/Wert gefüllt ist. Sollte für ein Projekt eine Spaltenüberschrift existieren bei der die entsprechenden Zellen alle leer/blanc sind (im gelb markierten Bsp. Spalte 36 "Used for Summary") dann soll auch in der Ergebniszeile/spalte blanc stehen. Momentan ist der Code so, dass durch die Codezeile
"If MeAr(A, B) "" Then _
oDic(MeAr(A, 1)) = oDic(MeAr(A, 1)) & ";" & MeAr(A, B)"
keine leeren Felder übernommen werden, aber dadurch die Ergebnistabelle zusammenrückt, weil die blancs dazwischen fehlen, aber die Texte/Werte müssen natürlich unter der ursprünglichen Spaltenüberschrift stehen bleiben. Also benötige ich in etwa soetwas, wie einen größten gemeinsamen Nenner für Text/werte (strings), wobei Text/Wert ein blanc überschreibt.
Zudem kommt es zu einem Laufzeitfehler "1004" in Zeile
"With .Range("A2", Cells(Rows.Count, 1).End(xlUp)).Resize(, MaxCol + 1)"
des Codes.
Vielleicht kannst du dir dies ja noch mal ansehen. Ich werde aber voraussichtlich erst am Montag wieder dazukommen, im Forum nachzusehen.
Vielen Dank für deine Mühen.
Viele Grüße
AJ
Anzeige
ja verstanden habe ich was Du möchtest,
18.06.2010 16:52:34
Tino
Hallo,
habe den Code auch schon hier.
Was ich nicht verstehe, wann soll nun was aus welcher Zeile stehen bleiben.
Bei Dir ist DH018-966 in der ersten Zeile Spalte i bis o gefüllt und in der zweiten leer,
sollen die Werte erhalten bleiben? (davon gehe ich im Code aus)
Aber warum dann SPP aus der zweiten stehen bleiben soll und nicht PP aus der ersten, dass verstehe ich nicht.
Sub test()
Dim MeAr, varPos, ArData()
Dim oDic As Object
Dim A As Long, B As Long, MaxRow As Long, MaxCol As Long

Set oDic = CreateObject("Scripting.Dictionary")

With Tabelle1 'Tabelle Quelle 
    MeAr = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 37)
End With

Redim Preserve ArData(1 To Ubound(MeAr), 1 To Ubound(MeAr, 2) - 1)

For A = 1 To Ubound(MeAr)
    If Not oDic.exists(MeAr(A, 1)) Then
        oDic(MeAr(A, 1)) = 0
    End If
    varPos = Application.Match(MeAr(A, 1), oDic.Keys, 0)
    For B = 2 To Ubound(MeAr, 2)
       If ArData(varPos, B - 1) = "" Then ArData(varPos, B - 1) = MeAr(A, B)
    Next B
Next A



With Tabelle2 'Tabelle Ziel 
    MaxRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    If MaxRow > 1 Then .Range("A2:A" & MaxRow).Resize(, .Columns.Count).ClearContents
    If oDic.Count > 0 Then
        .Cells(2, 1).Resize(oDic.Count) = Application.Transpose(oDic.Keys)
        .Cells(2, 2).Resize(Ubound(ArData), Ubound(ArData, 2)) = ArData
    End If
End With


Set oDic = Nothing
End Sub
Gruß Tino
Anzeige
AW: ja verstanden habe ich was Du möchtest,
21.06.2010 13:55:04
Andreas
Hi Toni,
als die SPP Zeile ist die unterste Ebene im Projekt und soll letztendlich übrig bleiben. Und Text/Wert soll, wenn das Makro läuft, bisherigen Text/Wert überschreiben. Also so, dass zunächst die PP-Zeilen Werte drin stehen, die dann aber von den SPP-Zeilen Werten überschrieben werden. Da ist natürlich Voraussetzung, dass die SPP Zeile immer nach der PP Zeile kommt. Aber das muss dann eben vorher per Sortierung erfolgen. Allerdings dürfen Leerzellen und auch Zellen mit ' oder einer 0 die bisherigen Werte/Texte nicht überschreiben. So steht z.B. bei dem 966er Projekt in der PP Zeile in Spalte AF ("Used for Summary") zunächst ein "No". Dieses soll dann mit dem "Yes" aus der SPP Zeile des 966er Projektes überschrieben werden. Aber das Hochkomma ' in Spalte P der SPP Zeile, darf das BM der PP Zeile nicht überschreiben. Kannst du dies noch mit in den Code aufnehmen? Jetzt schon mal vielen, vielen Dank für deine Hilfe.
Viele Grüße
Andreas
Anzeige
teste mal ob es geht...
21.06.2010 14:41:16
Tino
Hallo,
Sub test()
Dim MeAr, varPos, ArData()
Dim oDic As Object
Dim A As Long, B As Long, MaxRow As Long, MaxCol As Long

Set oDic = CreateObject("Scripting.Dictionary")

With Tabelle1 'Tabelle Quelle 
    MeAr = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 37)
End With

Redim Preserve ArData(1 To Ubound(MeAr), 1 To Ubound(MeAr, 2) - 1)

For A = 1 To Ubound(MeAr)
    If Not oDic.exists(MeAr(A, 1)) Then
        oDic(MeAr(A, 1)) = 0
    End If
    varPos = Application.Match(MeAr(A, 1), oDic.Keys, 0)
    ArData(varPos, 1) = MeAr(A, 2)
    For B = 3 To Ubound(MeAr, 2)
       If MeAr(A, B) <> "" And MeAr(A, B) <> "'" Then _
            ArData(varPos, B - 1) = MeAr(A, B)
    Next B
Next A



With Tabelle2 'Tabelle Ziel 
    MaxRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    If MaxRow > 1 Then .Range("A2:A" & MaxRow).Resize(, .Columns.Count).ClearContents
    If oDic.Count > 0 Then
        .Cells(2, 1).Resize(oDic.Count) = Application.Transpose(oDic.Keys)
        .Cells(2, 2).Resize(Ubound(ArData), Ubound(ArData, 2)) = ArData
    End If
End With


Set oDic = Nothing
End Sub
Gruß Tino
Anzeige
AW: teste mal ob es geht...
21.06.2010 15:33:46
Andreas
Hi Toni,
ja so funktioniert es.
Habe im Code nur noch And MeAr(A, B) "0" ergänzt, damit bereits vorhandener Text oder Werte nicht von der 0 überschrieben werden und jetzt funktioniert es.
Vielen Dank für deine Mühen und Zeit.
Viele Grüße
Andreas
AW: teste mal ob es geht...
21.06.2010 15:58:52
Andreas
Hi Toni, jetzt brauche ich doch noch mal deine Hilfe.
In deinem Code gibt es die Zeile(n):
With Tabelle2 'Tabelle Ziel
MaxRow = .Cells(.Rows.Count, 1).End(xlUp).Row
Mit dem With Tabelle2 Befehl, wird die Tabelle2 der Excel-Datei ausgewählt.
Allerdings erkennt er die Tabelle2 nicht an dem Reiternamen (Text), sondern der "technische Name" des Blattes ist sonst wo in Excel hinterlegt.
Also selbst wenn ich eine Tabelle2 in meinem Blatt anlege, ist sie für VBA nicht Tabelle2, sondern z.B. Tabelle4. In der VBA Project Liste erscheint dieses Blatt dann als "Tabelle4 (Tabelle2)". Wie kann ich im Code mitteile, dass er die Tabelle mit dem Namen "Tabelle2" nehmen soll, bzw. wie kann ich den "technischen" Namen Tabelle4 in Tabelle2 ändern?
Viele Grüße
Andreas
Anzeige
AW: teste mal ob es geht...
21.06.2010 16:13:58
Tino
Hallo,
ersetzte Tabelle2 durch Sheets("Tabelle2")
Gruß Tino
AW: teste mal ob es geht...
23.06.2010 11:13:26
Andreas
Hallo Toni,
ok. danke. so funktioniert es.
Viele Grüße
Andreas

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige