Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
764to768
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
764to768
764to768
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Mehrfache zusammenfassen

Mehrfache zusammenfassen
18.05.2006 14:09:58
Tremker
Hallo,
ich habe einen Datensatz, mit ca. 5.000 Zeilen bei dem in jeder Zeile bis zu 120 Namen mit einer Zahl in Klammern stehen. Ich muss diese Namen, wenn sie doppelt oder mehrfach vorkommen, zu einem Namen zusammenfassen und die Zahlen addieren.
Ist-Zustand:
............Spalte A.........Spalte B............Spalte C
Zeile1.Name1(123)...Name2(456)...Name3(123)
Zeile2.Name4(111)...Name5(222)...Name4(333)
Wunsch:
............Spalte A...........Spalte B...........Spalte C
Zeile1.Name1(123)...Name2(456)...Name3(123)
Zeile2.Name4(444)...Name5(222)
Hat jemand Ahnung wie das(per Makro? VBA?) von statten geht? Ich such jetzt schon ewig rum und finde keine Möglichkeit.
Beste Grüße und vielen Dank im Vorraus.

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Nachtrag
18.05.2006 14:18:01
Tremker
Ich habe die Daten alternativ in einem Format vorliegen, bei dem in jeder zweiten Spalte ein Name steht und in der nächsten Spalte, die dazugehörige Zahl.
Aber auch da komm ich nicht weiter.
AW: Nachtrag
18.05.2006 17:55:24
Erich
Hallo noch einmal,
mit der 2. Variante (Namen und Zahlen stehen in getrennten Zellen nebeneinander)
gehts einfacher: Option Explicit Sub Zusammenfassen2_mit_For() Dim wsErg As Worksheet Dim zUR As Long, zz As Long, ss As Integer, z2 As Long, s2 As Integer Dim lngSum As Long Dim rgCur As Range, aend As Boolean Sheets(1).Copy after:=Sheets(1) Set wsErg = ActiveSheet zUR = ActiveSheet.UsedRange.Rows.Count For zz = 1 To zUR For ss = 1 To Cells(zz, Columns.Count).End(xlToLeft).Column - 1 Step 2 If Not IsEmpty(Cells(zz, ss)) Then Set rgCur = Cells(zz, ss) lngSum = rgCur.Offset(0, 1).Value aend = False For z2 = zz To zUR For s2 = 1 To Cells(z2, Columns.Count).End(xlToLeft).Column - 1 Step 2 If (z2 > zz Or s2 > ss) And Cells(z2, s2) = rgCur.Value Then With Cells(z2, s2) lngSum = lngSum + .Offset(0, 1).Value .ClearContents .Offset(0, 1).ClearContents End With aend = True End If Next s2 Next z2 If aend Then rgCur.Offset(0, 1) = lngSum End If Next ss Next zz End Sub Sub Zusammenfassen2_mit_Find() Dim wsErg As Worksheet Dim zUR As Long, sUR As Integer, zz As Long, ss As Integer Dim strT As String, lngSum As Long, posK As Integer Dim rgCur As Range, rgSuch As Range, rgGef As Range Dim erstAdr As String, curAdr As String, aend As Boolean Sheets(1).Copy after:=Sheets(1) Set wsErg = ActiveSheet zUR = ActiveSheet.UsedRange.Rows.Count sUR = ActiveSheet.UsedRange.Columns.Count For zz = 1 To zUR For ss = 1 To Cells(zz, Columns.Count).End(xlToLeft).Column - 1 Step 2 If Not IsEmpty(Cells(zz, ss)) Then Set rgCur = Cells(zz, ss) curAdr = rgCur.Address strT = rgCur.Value lngSum = rgCur.Offset(0, 1).Value Set rgSuch = Range(Cells(zz, 1), Cells(zUR, sUR)) Set rgGef = rgSuch.Find(What:=strT, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False) erstAdr = rgGef.Address aend = False Do If rgGef.Address <> curAdr Then lngSum = lngSum + rgGef.Offset(0, 1).Value If rgGef.Address <> erstAdr Then rgGef.ClearContents rgGef.Offset(0, 1).ClearContents aend = True End If Set rgGef = rgSuch.FindNext(rgGef) Loop While Not rgGef Is Nothing And rgGef.Address <> erstAdr If aend Then rgCur.Offset(0, 1) = lngSum If curAdr <> erstAdr Then Range(erstAdr).ClearContents End If End If Next ss Next zz End Sub Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Nachtrag
18.05.2006 18:50:44
Tremker
Hallo Erich,
Vielen Dank für die zweite Version. Diese ist praktischer für mich.
3 Fehler:
- Fehlermeldung: "Typen unverträglich"
- Es wird auch zeilenübergreifen zusammengefaßt
- Es werden nicht alle gleichen Namen zusammengefaßt
Name1 11,00 Name2 22,00 Name3 33,00
Name4 44,00 Name5 55,00 Name4 66,00
Name6 77,00 Name1 88,00 Name6 99,00
Name1 99,00 Name2 22,00 Name3 33,00
Name4 44,00 Name5 55,00 Name4 66,00
Name6 77,00...........................Name6 99,00
AW: Mehrfache zusammenfassen
18.05.2006 17:04:54
Erich
Hallo Tremker,
versuchs mal mit den beiden Makros:
Option Explicit
Sub Zusammenfassen_mit_Like()
Dim wsErg As Worksheet
Dim zUR As Long, zz As Long, ss As Integer, z2 As Long, s2 As Integer
Dim tt As String, strT As String, lngSum As Long, posK As Integer
Dim rgCur As Range, rgGef As Range, aend As Boolean
Sheets(1).Copy after:=Sheets(1)
Set wsErg = ActiveSheet
zUR = ActiveSheet.UsedRange.Rows.Count
For zz = 1 To zUR
For ss = 1 To Cells(zz, Columns.Count).End(xlToLeft).Column
If Not IsEmpty(Cells(zz, ss)) Then
Set rgCur = Cells(zz, ss)
tt = rgCur.Value
posK = InStrRev(tt, "(")
strT = Left(tt, posK - 1)
lngSum = 1 * Mid(tt, posK + 1, Len(tt) - posK - 1)
aend = False
For z2 = zz To zUR
For s2 = 1 To Cells(zz, Columns.Count).End(xlToLeft).Column
If (z2 > zz Or s2 > ss) And _
(Cells(z2, s2) Like strT & "(#)" _
Or Cells(z2, s2) Like strT & "(##)" _
Or Cells(z2, s2) Like strT & "(###)" _
Or Cells(z2, s2) Like strT & "(####)" _
Or Cells(z2, s2) Like strT & "(#####)" _
Or Cells(z2, s2) Like strT & "(######)") Then
Set rgGef = Cells(z2, s2)
tt = rgGef.Value
posK = InStrRev(tt, "(")
If posK <> Len(strT) + 1 Then
MsgBox "Name in Zelle" & rgGef.Address(0, 0) & "enthält '('"
Else
lngSum = lngSum + Mid(tt, posK + 1, Len(tt) - posK - 1)
rgGef.ClearContents
aend = True
End If
End If
Next s2
Next z2
If aend Then rgCur = strT & "(" & lngSum & ")"
End If
Next ss
Next zz
End Sub
Sub Zusammenfassen_mit_Find()
Dim wsErg As Worksheet
Dim zUR As Long, sUR As Integer, zz As Long, ss As Integer
Dim tt As String, strT As String, lngSum As Long, posK As Integer
Dim rgCur As Range, rgSuch As Range, rgGef As Range
Dim erstAdr As String, curAdr As String, aend As Boolean
Sheets(1).Copy after:=Sheets(1)
Set wsErg = ActiveSheet
zUR = ActiveSheet.UsedRange.Rows.Count
sUR = ActiveSheet.UsedRange.Columns.Count
For zz = 1 To zUR
For ss = 1 To Cells(zz, Columns.Count).End(xlToLeft).Column
If Not IsEmpty(Cells(zz, ss)) Then
Set rgCur = Cells(zz, ss)
tt = rgCur.Value
curAdr = rgCur.Address
posK = InStrRev(tt, "(")
strT = Left(tt, posK - 1)
lngSum = 1 * Mid(tt, posK + 1, Len(tt) - posK - 1)
Set rgSuch = Range(Cells(zz, 1), Cells(zUR, sUR))
Set rgGef = rgSuch.Find(What:=strT & "(", _
LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False)
erstAdr = rgGef.Address
aend = False
Do
If rgGef.Address <> curAdr Then
tt = rgGef.Value
posK = InStrRev(tt, "(")
If posK <> Len(strT) + 1 Then
MsgBox "Name in Zelle" & rgGef.Address(0, 0) & "enthält '('"
Else
lngSum = lngSum + Mid(tt, posK + 1, Len(tt) - posK - 1)
rgGef.ClearContents
aend = True
End If
End If
Set rgGef = rgSuch.FindNext(rgGef)
Loop While Not rgGef Is Nothing And rgGef.Address <> erstAdr
If aend Then rgCur = strT & "(" & lngSum & ")"
End If
Next ss
Next zz
End Sub
Die erzeugen eine neue Tabelle1 (2) aus Tabelle1:
Tabelle1
 ABC
1Name1(1)Nammme2(3)Nammmmmmmmme3(5)
2Name4(11)Name5(33)Name4(abc(55)
3Name5(111)Namen5(333)Name4(555)
 
Tabelle1 (2)
 ABC
1Name1(1)Nammme2(3)Nammmmmmmmme3(5)
2Name4(566)Name5(144)Name4(abc(55)
3 Namen5(333) 
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Mehrfache zusammenfassen
18.05.2006 18:08:10
Tremker
Hallo Erich,
Vielen Dank für die Makros. Ich hab beide Makros auf zwei PCs getestet.
Beim Ersten PC bekomme ich bei beiden Makros die Fehlermeldung:
"Ungültiger Prozeduraufruf oder ungültiges Argument"
und es wird ein neues Tabellenblatt erstellt in dem das gleiche steht wie im ersten Tabellenblatt.
Muß ich da was an meinen Einstellungen ändern damit es funktioniert?
Bei Zweiten PC, beim ersten Makro
- Tabelle1.Zusammenfassen_mit_Find
wird ebenfalls ein neues Tabellenblatt erstellt, aber Excel stürzt ab.(Es kommt die Sanduhr und Excel braucht die komplette Prozessorleistung.
Das zweite Makro
- Tabelle1.Zusammenfassen_mit_Like
Funktioniert wie beschrieben. Nur fasst das Makro auch Namen aus unterschiedlichen Zeilen zusammen. Es dürfen aber nur Namen zeilenweise und zusammengefaßt werden. Also Namen aus Zeile 2 dürfen nicht mit Namen aus Zeile 3 zusammengefaßt werden.
Vielen Dank für die Mühe. Wäre sehr cool wenn's noch eine Verbesserung gibt, die die Zusammenfassung auf die einzelnen Zeilen beschränkt.
Anzeige
AW: Mehrfache zusammenfassen
18.05.2006 18:39:09
Erich
Hallo Tremker,
ist auf beiden PCs Excel2003? Irgendwo müssen sich die PCs ja so unterscheiden,
dass das Einfluss auf diese Makos hat...)
Du hast die Fehlermeldung wiedergegeben, da fehlte nun noch eins:
In welcher Makrozeile tritt der Fehler auf?
Dass nur innerhalb jeder Zeile zusammengefasst werden soll, wird die Sache vereinfachen.
Ich komme aber jetzt so schnell nicht dazu, die Makros anzupassen.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Mehrfache zusammenfassen
18.05.2006 21:48:30
Erich
Hallo Tremker,
hier der Code für das Zusammenfassen innerhalb einer Zeile
(wie gesagt: viel kürzer und einfacher):
Option Explicit
' Zusammenfassen nur innerhalb einer Zeile
Sub Zusammenfassen1Z_mit_For()
Dim zz As Long, ss As Integer, sBis As Integer, s2 As Integer
Sheets(1).Copy after:=Sheets(1)
For zz = 1 To ActiveSheet.UsedRange.Rows.Count
sBis = Cells(zz, Columns.Count).End(xlToLeft).Column - 1
For ss = 1 To sBis Step 2
If Not IsEmpty(Cells(zz, ss)) Then
For s2 = ss + 2 To sBis Step 2
If Cells(zz, s2) = Cells(zz, ss) Then
Cells(zz, ss + 1) = Cells(zz, ss + 1) + Cells(zz, s2 + 1)
Range(Cells(zz, s2), Cells(zz, s2 + 1)).ClearContents
End If
Next s2
End If
Next ss
Next zz
End Sub
Sub Zusammenfassen1Z_mit_Find()
Dim sBis As Integer, zz As Long, ss As Integer
Dim rgSuch As Range, rgGef As Range, s2 As Integer, erstCol As Integer
Sheets(1).Copy after:=Sheets(1)
For zz = 1 To ActiveSheet.UsedRange.Rows.Count
sBis = Cells(zz, Columns.Count).End(xlToLeft).Column - 1
For ss = 1 To sBis Step 2
If Not IsEmpty(Cells(zz, ss)) Then
Set rgSuch = Range(Cells(zz, 1), Cells(zz, sBis))
Set rgGef = rgSuch.Find(What:=Cells(zz, ss), LookIn:=xlValues, _
LookAt:=xlWhole, SearchDirection:=xlNext, _
MatchCase:=True, SearchFormat:=False)
erstCol = rgGef.Column
Do
s2 = rgGef.Column
If s2 <> ss Then
Cells(zz, ss + 1) = Cells(zz, ss + 1) + Cells(zz, s2 + 1)
Cells(zz, s2 + 1).ClearContents
If s2 <> erstCol Then rgGef.ClearContents
End If
Set rgGef = rgSuch.FindNext(rgGef)
Loop While Not rgGef Is Nothing And rgGef.Column <> erstCol
If erstCol <> ss Then Cells(zz, erstCol).ClearContents
End If
Next ss
Next zz
End Sub
So als Tipp: Wenn ein Fehler auftritt, ist außer der Fehlermeldung sehr interessant,
in welcher Zeile das Makro abbricht.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Mehrfache zusammenfassen
18.05.2006 17:52:34
Erich
Hallo Tremker,
kleine Korrektur zu Zusammenfassen_mit_Like():
In der s2-Laufschleife muss es Cells(z2, ...) statt Cells(zz, ...) heißen. Mit dem Fehler fand das Makro nicht alle.
            For z2 = zz To zUR
For s2 = 1 To Cells(z2, Columns.Count).End(xlToLeft).Column
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige