stschuck
Goto Top

Excel-Makro gesucht: Zusammenführen der verteilten Inhalte mehrerer markierter Zeilen in eine

Zwar kann ich Excel (2010) ganz gut bedienen, doch keine Makros schreiben. Hab schon viel gegooglet und ähnliche, aber keine genau passenden Lösungen gefunden.
Ich habe das Problem einer riesigen Excel-Tabelle mit ca. 6000 Zeilen und ungefähr 40 Spalten, die durch den Import vieler kleinerer Tabellen entstanden ist. Nun muß ich die über mehrere Spalten und Zeilen verteilten Informationen zu einem Produkt in einer Zeile zusammen fassen. Da im entscheidenden Feld, das mir anzeigt, welche Zeilen zusammen gehören sollen, Schreibfehler und Abweichungen vorkommen können, muss ich die Zeilen schon alle selbst anschauen und kann sie nicht automatisch vergleichen. Ich möchte daher die Zeilen, die zusammengeführt werden sollen, einfach markieren und dann das Makro ausführen, das alle Inhalte in die oberste der markierten Zeilen zusammenkopiert und die darunter stehenden löscht. Wichtig: Die Anzahl der Spalten darf sich auf keinen Fall verändern!
Beispiel:

a57cf109bc6f36dc93c9574f3706d625

Ich wäre dankbar für eine zeitsparende, einfache Lösung!
Vielen Dank
Stefan

Content-Key: 209011

Url: https://administrator.de/contentid/209011

Printed on: April 24, 2024 at 08:04 o'clock

Mitglied: 76109
76109 Jul 03, 2013 updated at 23:04:30 (UTC)
Goto Top
Hallo stschuck!

Unter der Annahme, dass der markierte Bereich in Spalte A beginnt und nur ein Wert in Spalte A (Inhalt 0) steht. Ausserdem ab der 3. Spalte C nur ein Wert pro Spalte steht...

Unter obiger Annahme könnte es hiermit gehen (Code in Modul einfügen):
Option Explicit

Const iColMax = 40

Public Sub Zusammenfassen()
    Dim aValues As Variant, aNewValues(1 To 1, 1 To iColMax) As Variant
    Dim iRowValue As Long, iRowFirst As Long, iRowNext As Long, iRowLast As Long, r As Long, c As Long
    
    If Selection.Rows.Count < 2 Then
        MsgBox "Es müssen mindestens 2 Zeilen markiert sein!", vbInformation, "Hinweis...":  Exit Sub  
    End If
    
    aValues = Selection.Value
    
    iRowValue = GetRowValue(aValues)
    iRowFirst = Selection.Row
    iRowNext = iRowFirst + 1
    iRowLast = iRowFirst + Selection.Rows.Count - 1
    
    aNewValues(1, 1) = aValues(iRowValue, 1)
    aNewValues(1, 2) = aValues(iRowValue, 2)
    
    For r = 1 To UBound(aValues, 1)
        For c = 3 To iColMax
            If Not IsEmpty(aValues(r, c)) Then
                aNewValues(1, c) = aValues(r, c)
            End If
        Next
    Next
    
    Rows(iRowNext & ":" & iRowLast).Delete Shift:=xlUp  
    Cells(iRowFirst, 1).Resize(1, iColMax).Value = aNewValues
End Sub

'Array-Zeile mit Wert in Spalte A ermitteln  
Private Function GetRowValue(ByRef aValues) As Long
    Dim i As Long
    
   'Falls Spalte A leer, dann Wert für Spalte B aus 1.er Array-Zeile  
    GetRowValue = 1

    For i = 1 To UBound(aValues, 1)
        If Not IsEmpty(aValues(i, 1)) Then
            GetRowValue = i:  Exit For
        End If
    Next
End Function

Gruß Dieter
Member: stschuck
stschuck Jul 03, 2013 at 09:58:50 (UTC)
Goto Top
Hallo Dieter,
das sieht schon beeindruckend aus - allerdings bekomme ich die Fehlermeldung: "Laufzeitfehler 9" Index außerhalb des gültigen Bereiches für diese Code-Zeile

:aNewValues(1, 1) = aValues(iRowValue, 1).

Mache ich etwas falsch?
Danke für eine Korrektur.
Viele Grüße Stefan
Mitglied: 76109
76109 Jul 03, 2013 at 10:19:59 (UTC)
Goto Top
Hallo stschuck!

Leider fehlt mir jetzt die Zeit für eine Korrektur, da ich gleich zur Arbeit muss...

Allerdings dürfte der Fehler auftreten, weil in Spalte A kein Wert steht?

Gruß Dieter
Member: stschuck
stschuck Jul 03, 2013 at 10:31:27 (UTC)
Goto Top
Hallo Dieter, ja, daran liegt's. In der Spalte A steht nur gelegentlich ein Wert. Ich kann aber prima damit arbeiten, wenn ich einfach die leeren betreffenden Zellen zwischenzeitlich mit einem Hilfszeichen fülle. Dann funktioniert's.
GANZ HERZLICHEN DANK - und gutes Arbeiten
Stefan.
Mitglied: 76109
76109 Jul 03, 2013 updated at 23:06:05 (UTC)
Goto Top
Hallo Stefan!

Habe im Code (Codezeile 40) noch eine Korrektur eingefügt, wodurch die Spalte A auch Leer sein darf.

Die Korrektur hat folgende Auswirkungen:
Ist die Spalte A im markierten Bereich leer, dann wird der Wert für Spalte B aus der 1.en markierten Zeile übernommen.
Ist die Spalte A im markierten Bereich (beliebige Zeile) nicht leer , dann wird der Wert in Spalte A und der Wert für Spalte B aus der Zeile, in der die Spalte A einen Wert enthält übernommen.

Gruß Dieter