Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1100to1104
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

Tino, kannst Du Dein Beispiel nochmal anschauen ?

Tino, kannst Du Dein Beispiel nochmal anschauen ?
Joachim
Hallo Tino,
Du hast mit doch vor ein paar Tagen das Beispiel gemacht (echt supi) mit dem Daten zusammegefasst werden.
Was muss ich denn dran ändern, wenn ich in den Spalten C (3) und U (9) ebenfalls die Kommentare (getrennt duch " ### ") zusammenfügen will. Also gleich , wie es jetzt schon in der Spalte D (4) passiert.
Ist das viel Aufwand ? Vielen dank
Gruss
Joachim
Dim Bereich As Range
Dim LRow As Long, A As Long, B As Long, varRow
Dim meAR1, meAR2, meAr3
Dim iCalc As Integer
With Application
iCalc = .Calculation 'merke einstellung Berechnung auto o. manuell
.ScreenUpdating = False 'Bildschirmaktualisierung aus
.EnableEvents = False 'Events aus
.Calculation = xlCalculationManual 'Berechnung auf Manuell stellen
With Sheets("AutoBill Import") 'Tabellennamen anpassen
'prüfen ob Daten ab Zeile 11 vorhanden sind
If .Cells(.Rows.Count, 22).End(xlUp).Row > 10 Then
'verweis auf letzte Spalte in Tabelle (Hilfsspalte)
'unter xl2007 ist die Spalte 256, ab xl2007 ist dies Spalte 16384
With .Range("V10", .Cells(.Rows.Count, 22).End(xlUp)).Offset(0, .Columns.Count - 22)
meAR1 = .Offset(0, -(.Column - 4)) 'Hilfs- Array1 füllen (Spalte D)
meAR2 = .Offset(0, -(.Column - 22)) 'Hilfs- Array2 füllen (Spalte V)
meAr3 = .Offset(0, -(.Column - 22)) 'Hilfs- Array3 füllen (Spalte V)
'hier werden die Texte zusammengefasst,
For A = 1 To UBound(meAR1)
'ist in Sp. V ein X oder ist diese leer?
If meAR2(A, 1) <> "" And meAR2(A, 1) <> "X" Then
B = A 'Hilfszähler
varRow = Application.Match(meAR2(A, 1), meAr3, 0) 'suche weitere davon
Do While IsNumeric(varRow) 'Schleife bis keine Treffer mehr
'ist in Sp. V ein X oder ist diese leer?
If meAR2(varRow, 1) <> "" And meAR2(varRow, 1) <> "X" Then
If B > A Then 'erst ab zweiten Treffer
meAR1(A, 1) = meAR1(A, 1) & " ### " & meAR1(varRow, 1) 'Text zusammenführen
End If
End If
'was anderes schreiben damit wert nicht zweimal gefunden wird
meAr3(varRow, 1) = "@@@@@"
'Suche weiter in Liste
varRow = Application.Match(meAR2(A, 1), meAr3, 0)
B = B + 1 'Hilfszähler ein hoch
Loop
End If
Next A
'Letzte Zeile?
LRow = .Rows(.Rows.Count).Row
'Formel für die Summierung der Werte
.FormulaR1C1 = "=IF(OR(RC22="""",RC22=""X""),RC5,IF(COUNTIF(R10C22:RC22,RC22)=1," & _
"SUMIF(R10C22:R" & LRow & "C22,RC22,R10C5:R" & LRow & "C5),""""))"
'Ergebnis zurückschreiben in Bereich
.Offset(0, -(.Column - 5)).Value = .Value
'zusammengeführte Texte in Zellen zurückschreiben
.Offset(0, -(.Column - 4)) = meAR1
'Formel erstellen um immer den ersten Eintrag zu ermitteln
.FormulaR1C1 = "=IF(OR(COUNTIF(R10C22:RC22,RC22)=1,RC22="""",RC22=""X""),ROW(),TRUE)"
'Tebellenname Zelle, damit nicht doppelt angegeben werden muss
With Sheets(.Parent.Name)
'Sortiere den gesamten Bereich, Zeilen die gelöscht werden kommen nach unten
.Range("A10", .Cells(LRow, .Columns.Count)).Sort Key1:=.Cells(10, .Columns.Count), Order1:=xlAscending, Header:=xlNo
End With
On Error Resume Next
'Zeilen löschen die das Ergebnis Wahr haben
.SpecialCells(xlCellTypeFormulas, 4).EntireRow.Delete
'Hilfsspalte komplett löschen
.EntireColumn.Delete
On Error GoTo 0
End With
'optimale Spaltenbreite
' .Range("A:V").Columns.AutoFit
End If
End With
.Calculation = iCalc 'Berechnung auf alten zustand zurückstellen
.ScreenUpdating = True 'Bildschirmakt. an
.EnableEvents = True 'Events an
End With

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
ok. teste mal
17.09.2009 15:52:21
Tino
Hallo,
, zur Info Spalte U = 21 und nicht 9, 9 wäre die Spalte i.
Sub Aufbereiten()
Dim Bereich As Range
Dim LRow As Long, A As Long, B As Long, varRow
Dim meAR1, meAR2, meAr3, meAr4, meAr5
Dim iCalc As Integer

With Application
  iCalc = .Calculation
 .ScreenUpdating = False
 .EnableEvents = False
 .Calculation = xlCalculationManual
 
    With Sheets("Tabelle1") 'Tabellennamen anpassen 
      If .Cells(.Rows.Count, 22).End(xlUp).Row > 10 Then
        With .Range("V10", .Cells(.Rows.Count, 22).End(xlUp)).Offset(0, .Columns.Count - 22)
                  meAR2 = .Offset(0, -(.Column - 22))
                  meAr3 = .Offset(0, -(.Column - 22))
                  meAR1 = .Offset(0, -(.Column - 4)) 'Spalte D = 4 
                  meAr4 = .Offset(0, -(.Column - 3)) 'Spalte C = 3 
                  meAr5 = .Offset(0, -(.Column - 21)) 'Spalte U = 21 
                  
                  For A = 1 To Ubound(meAR1)
                    meAR1(A, 1) = ";" & meAR1(A, 1) & ";"
                    meAr4(A, 1) = ";" & meAr4(A, 1) & ";"
                    meAr5(A, 1) = ";" & meAr5(A, 1) & ";"
                    If meAR2(A, 1) <> "" And meAR2(A, 1) <> "X" Then
                            B = A
                            varRow = Application.Match(meAR2(A, 1), meAr3, 0)
                           
                           Do While IsNumeric(varRow)
                                If meAR2(varRow, 1) <> "" And meAR2(varRow, 1) <> "X" Then
                                  If B > A Then
                                   
                                   If Not meAR1(A, 1) Like "*;" & meAR1(varRow, 1) & ";*" Then
                                     meAR1(A, 1) = meAR1(A, 1) & meAR1(varRow, 1) & ";"
                                   End If
                                   
                                   If Not meAr4(A, 1) Like "*;" & meAr4(varRow, 1) & ";*" Then
                                     meAr4(A, 1) = meAr4(A, 1) & meAr4(varRow, 1) & ";"
                                   End If
                                   
                                   If Not meAr5(A, 1) Like "*;" & meAr5(varRow, 1) & ";*" Then
                                     meAr5(A, 1) = meAr5(A, 1) & meAr5(varRow, 1) & ";"
                                   End If
                                  
                                  End If
                                End If
                                
                                meAr3(varRow, 1) = "@@@@@"
                                varRow = Application.Match(meAR2(A, 1), meAr3, 0)
                                B = B + 1
                           Loop
                     
                     End If
                        If Right$(meAR1(A, 1), 1) = ";" Then meAR1(A, 1) = Left$(meAR1(A, 1), Len(meAR1(A, 1)) - 1)
                        If Left$(meAR1(A, 1), 1) = ";" Then meAR1(A, 1) = Right$(meAR1(A, 1), Len(meAR1(A, 1)) - 1)
                        If Right$(meAr4(A, 1), 1) = ";" Then meAr4(A, 1) = Left$(meAr4(A, 1), Len(meAr4(A, 1)) - 1)
                        If Left$(meAr4(A, 1), 1) = ";" Then meAr4(A, 1) = Right$(meAr4(A, 1), Len(meAr4(A, 1)) - 1)
                        If Right$(meAr5(A, 1), 1) = ";" Then meAr5(A, 1) = Left$(meAr5(A, 1), Len(meAr5(A, 1)) - 1)
                        If Left$(meAr5(A, 1), 1) = ";" Then meAr5(A, 1) = Right$(meAr5(A, 1), Len(meAr5(A, 1)) - 1)
                  Next A
                

                  
                  LRow = .Rows(.Rows.Count).Row
                 
                 .FormulaR1C1 = "=IF(OR(RC22="""",RC22=""X""),RC5,IF(COUNTIF(R10C22:RC22,RC22)=1," & _
                                "SUMIF(R10C22:R" & LRow & "C22,RC22,R10C5:R" & LRow & "C5),""""))"
                 
                 .Offset(0, -(.Column - 5)).Value = .Value
                 .Offset(0, -(.Column - 4)) = meAR1  'Spalte D schreiben 
                 .Offset(0, -(.Column - 3)) = meAr4  'Spalte C schreiben 
                 .Offset(0, -(.Column - 21)) = meAr5 'Spalte U schreiben 
                 .FormulaR1C1 = "=IF(OR(COUNTIF(R10C22:RC22,RC22)=1,RC22="""",RC22=""X""),ROW(),TRUE)"
                  
                  With Sheets(.Parent.Name)
                   .Range("A10", .Cells(LRow, .Columns.Count)).Sort Key1:=.Cells(10, .Columns.Count), Order1:=xlAscending, Header:=xlNo
                  End With
                  
                  
                  
                  
                   On Error Resume Next
                    .SpecialCells(xlCellTypeFormulas, 4).EntireRow.Delete
                    .EntireColumn.Delete
                   On Error GoTo 0
                    
            
        End With
        .Range("A:V").Columns.AutoFit
       
       End If
     
    End With

 .Calculation = iCalc
 .ScreenUpdating = True
 .EnableEvents = True
End With
End Sub
Gruß Tino
Anzeige
meld mich morgen owT
17.09.2009 17:54:13
Joachim
AW: ok. teste mal
18.09.2009 10:03:49
Joachim
Hallo Tino,
Bin noch am testen ! Frage, wenn ich mein Trennzeichen, also das Zeichen mit dem ich die Datensätze trenne (seiter ";") ändern will, sagen wir mal: " ### "
habe ich ja nicht mehr 1. Zeichen, sondern 5
Ich habe gemerkt, wenn ich das ";" einfach in " ### " ändere, kommt es zu einem Fehler. Ich vermute mal, dieses Trennzeichen ist an jeden Datensatz auch vorne und hinten dran und wird durch Dein Code am Schluss einfach wieder entfernt, dass nur noch die in der Mitte bleiben.
Dann muss ich doch sicher irgend wo angeben, wie lang mein Trennzeichen ist, also statt 1 nun 5.
Wo mache ich das ?
Danke
Joachim
Anzeige
Anpassung, beliebiges Trennzeichen.
18.09.2009 10:18:06
Tino
Hallo,
habe dir den Code angepasst, Du brauchts nur bei
Const TrennZeichen As String = " ### "
einmal Dein Trennzeichen anpassen.
Sub Aufbereiten()
Dim Bereich As Range
Dim LRow As Long, A As Long, B As Long, varRow
Dim meAR1, meAR2, meAr3, meAr4, meAr5
Dim iCalc As Integer
Dim LenZ As Integer

'hier Trennzeichen angeben 
Const TrennZeichen As String = " ### "

LenZ = Len(TrennZeichen)

With Application
  iCalc = .Calculation
 .ScreenUpdating = False
 .EnableEvents = False
 .Calculation = xlCalculationManual
 
    With Sheets("Tabelle1") 'Tabellennamen anpassen 
      If .Cells(.Rows.Count, 22).End(xlUp).Row > 10 Then
        With .Range("V10", .Cells(.Rows.Count, 22).End(xlUp)).Offset(0, .Columns.Count - 22)
                  meAR2 = .Offset(0, -(.Column - 22))
                  meAr3 = .Offset(0, -(.Column - 22))
                  meAR1 = .Offset(0, -(.Column - 4)) 'Spalte D = 4 
                  meAr4 = .Offset(0, -(.Column - 3)) 'Spalte C = 3 
                  meAr5 = .Offset(0, -(.Column - 21)) 'Spalte U = 21 
                  
                  For A = 1 To Ubound(meAR1)
                    meAR1(A, 1) = TrennZeichen & meAR1(A, 1) & TrennZeichen
                    meAr4(A, 1) = TrennZeichen & meAr4(A, 1) & TrennZeichen
                    meAr5(A, 1) = TrennZeichen & meAr5(A, 1) & TrennZeichen
                    If meAR2(A, 1) <> "" And meAR2(A, 1) <> "X" Then
                            B = A
                            varRow = Application.Match(meAR2(A, 1), meAr3, 0)
                           
                           Do While IsNumeric(varRow)
                                If meAR2(varRow, 1) <> "" And meAR2(varRow, 1) <> "X" Then
                                  If B > A Then
                                   
                                   If InStr(meAR1(A, 1), TrennZeichen & meAR1(varRow, 1) & TrennZeichen) = 0 Then
                                     meAR1(A, 1) = meAR1(A, 1) & meAR1(varRow, 1) & TrennZeichen
                                   End If
                                   
                                   If InStr(meAr4(A, 1), TrennZeichen & meAr4(varRow, 1) & TrennZeichen) = 0 Then
                                     meAr4(A, 1) = meAr4(A, 1) & meAr4(varRow, 1) & TrennZeichen
                                   End If
                                   
                                   If InStr(meAr5(A, 1), TrennZeichen & meAr5(varRow, 1) & TrennZeichen) = 0 Then
                                     meAr5(A, 1) = meAr5(A, 1) & meAr5(varRow, 1) & TrennZeichen
                                   End If
                                  
                                  End If
                                End If
                                
                                meAr3(varRow, 1) = "@@@@@"
                                varRow = Application.Match(meAR2(A, 1), meAr3, 0)
                                B = B + 1
                           Loop
                     
                     End If
                        If Right$(meAR1(A, 1), LenZ) = TrennZeichen Then meAR1(A, 1) = Left$(meAR1(A, 1), Len(meAR1(A, 1)) - LenZ)
                        If Left$(meAR1(A, 1), LenZ) = TrennZeichen Then meAR1(A, 1) = Right$(meAR1(A, 1), Len(meAR1(A, 1)) - LenZ)
                        If Right$(meAr4(A, 1), LenZ) = TrennZeichen Then meAr4(A, 1) = Left$(meAr4(A, 1), Len(meAr4(A, 1)) - LenZ)
                        If Left$(meAr4(A, 1), LenZ) = TrennZeichen Then meAr4(A, 1) = Right$(meAr4(A, 1), Len(meAr4(A, 1)) - LenZ)
                        If Right$(meAr5(A, 1), LenZ) = TrennZeichen Then meAr5(A, 1) = Left$(meAr5(A, 1), Len(meAr5(A, 1)) - LenZ)
                        If Left$(meAr5(A, 1), LenZ) = TrennZeichen Then meAr5(A, 1) = Right$(meAr5(A, 1), Len(meAr5(A, 1)) - LenZ)
                  Next A
                

                  
                  LRow = .Rows(.Rows.Count).Row
                 
                 .FormulaR1C1 = "=IF(OR(RC22="""",RC22=""X""),RC5,IF(COUNTIF(R10C22:RC22,RC22)=1," & _
                                "SUMIF(R10C22:R" & LRow & "C22,RC22,R10C5:R" & LRow & "C5),""""))"
                 
                 .Offset(0, -(.Column - 5)).Value = .Value
                 .Offset(0, -(.Column - 4)) = meAR1  'Spalte D schreiben 
                 .Offset(0, -(.Column - 3)) = meAr4  'Spalte C schreiben 
                 .Offset(0, -(.Column - 21)) = meAr5 'Spalte U schreiben 
                 .FormulaR1C1 = "=IF(OR(COUNTIF(R10C22:RC22,RC22)=1,RC22="""",RC22=""X""),ROW(),TRUE)"
                  
                  With Sheets(.Parent.Name)
                   .Range("A10", .Cells(LRow, .Columns.Count)).Sort Key1:=.Cells(10, .Columns.Count), Order1:=xlAscending, Header:=xlNo
                  End With
                  
                  
                  
                  
                   On Error Resume Next
                    .SpecialCells(xlCellTypeFormulas, 4).EntireRow.Delete
                    .EntireColumn.Delete
                   On Error GoTo 0
                    
            
        End With
        .Range("A:V").Columns.AutoFit
       
       End If
     
    End With

 .Calculation = iCalc
 .ScreenUpdating = True
 .EnableEvents = True
End With
End Sub
Gruß Tino
Anzeige
Das ist Cool, ......
18.09.2009 10:34:18
Joachim
Hallo Tino,
Danke, das ist eine coole Idee, jetzt funktioniert das auch. Ich hoffe, noch eine letzte Frage:
hast Du das bewusst so programmiert, dass bei den Zusammengefassten Informationen , also die, mit " ### " in Splate C, D und U die Doppelt vorkommenden gelöscht werden ?
Also wenn ich zB in C als Ergebnis erwarten würde : "Haus ### Baum ### Strauch ### Strauch ### Strauch "
Kommt als Ergebnis raus:
"Haus ### Baum ### Strauch"
Ist das bewust , oder irgend wie ein Nebeneffekt ? Wollte alle Informationen sehen.
Danke
Joachim
die ist bewust so gemacht.
18.09.2009 11:21:31
Tino
Hallo,
möchtest Du es nicht so haben?
Gruß Tino
Anzeige
AW: die ist bewust so gemacht.
18.09.2009 13:20:21
Joachim
Hi Tino,
ich würde gerne alle Informationen sehen, wie im Beispiel angegeben
"Haus ### Baum ### Strauch ### Strauch ### Strauch "
Also keine doppelten rausfiltern, wo versteckt sich denn die Funktion ?
Danke
Joachim
AW: die ist bewust so gemacht.
18.09.2009 13:33:17
Tino
Hallo,
dann wird der Code etwas einfacher.
Sub Aufbereiten()
Dim Bereich As Range
Dim LRow As Long, A As Long, B As Long, varRow
Dim meAR1, meAR2, meAr3, meAr4, meAr5
Dim iCalc As Integer
Dim LenZ As Integer

'hier Trennzeichen angeben 
Const TrennZeichen As String = " ### "

LenZ = Len(TrennZeichen)

With Application
  iCalc = .Calculation
 .ScreenUpdating = False
 .EnableEvents = False
 .Calculation = xlCalculationManual
 
    With Sheets("Tabelle1") 'Tabellennamen anpassen 
      If .Cells(.Rows.Count, 22).End(xlUp).Row > 10 Then
        With .Range("V10", .Cells(.Rows.Count, 22).End(xlUp)).Offset(0, .Columns.Count - 22)
                  meAR2 = .Offset(0, -(.Column - 22))
                  meAr3 = .Offset(0, -(.Column - 22))
                  meAR1 = .Offset(0, -(.Column - 4)) 'Spalte D = 4 
                  meAr4 = .Offset(0, -(.Column - 3)) 'Spalte C = 3 
                  meAr5 = .Offset(0, -(.Column - 21)) 'Spalte U = 21 
                  
                  For A = 1 To Ubound(meAR1)
                    meAR1(A, 1) = meAR1(A, 1) & TrennZeichen
                    meAr4(A, 1) = meAr4(A, 1) & TrennZeichen
                    meAr5(A, 1) = meAr5(A, 1) & TrennZeichen

                    If meAR2(A, 1) <> "" And meAR2(A, 1) <> "X" Then
                            B = A
                            varRow = Application.Match(meAR2(A, 1), meAr3, 0)
                           
                           Do While IsNumeric(varRow)
                                If meAR2(varRow, 1) <> "" And meAR2(varRow, 1) <> "X" Then
                                  If B > A Then
                                     meAR1(A, 1) = meAR1(A, 1) & meAR1(varRow, 1) & TrennZeichen
                                     meAr4(A, 1) = meAr4(A, 1) & meAr4(varRow, 1) & TrennZeichen
                                     meAr5(A, 1) = meAr5(A, 1) & meAr5(varRow, 1) & TrennZeichen
                                  End If
                                End If
                                
                                meAr3(varRow, 1) = "@@@@@"
                                varRow = Application.Match(meAR2(A, 1), meAr3, 0)
                                B = B + 1
                           Loop
                     
                     End If
                        If Right$(meAR1(A, 1), LenZ) = TrennZeichen Then meAR1(A, 1) = Left$(meAR1(A, 1), Len(meAR1(A, 1)) - LenZ)
                        If Right$(meAr4(A, 1), LenZ) = TrennZeichen Then meAr4(A, 1) = Left$(meAr4(A, 1), Len(meAr4(A, 1)) - LenZ)
                        If Right$(meAr5(A, 1), LenZ) = TrennZeichen Then meAr5(A, 1) = Left$(meAr5(A, 1), Len(meAr5(A, 1)) - LenZ)
                  Next A
 
                  LRow = .Rows(.Rows.Count).Row
                 
                 .FormulaR1C1 = "=IF(OR(RC22="""",RC22=""X""),RC5,IF(COUNTIF(R10C22:RC22,RC22)=1," & _
                                "SUMIF(R10C22:R" & LRow & "C22,RC22,R10C5:R" & LRow & "C5),""""))"
                 
                 .Offset(0, -(.Column - 5)).Value = .Value
                 .Offset(0, -(.Column - 4)) = meAR1  'Spalte D schreiben 
                 .Offset(0, -(.Column - 3)) = meAr4  'Spalte C schreiben 
                 .Offset(0, -(.Column - 21)) = meAr5 'Spalte U schreiben 
                 .FormulaR1C1 = "=IF(OR(COUNTIF(R10C22:RC22,RC22)=1,RC22="""",RC22=""X""),ROW(),TRUE)"
                  
                  With Sheets(.Parent.Name)
                   .Range("A10", .Cells(LRow, .Columns.Count)).Sort Key1:=.Cells(10, .Columns.Count), Order1:=xlAscending, Header:=xlNo
                  End With

                  
                   On Error Resume Next
                    .SpecialCells(xlCellTypeFormulas, 4).EntireRow.Delete
                    .EntireColumn.Delete
                   On Error GoTo 0
                    
            
        End With
        .Range("A:V").Columns.AutoFit
       
       End If
     
    End With

 .Calculation = iCalc
 .ScreenUpdating = True
 .EnableEvents = True
End With
End Sub
Gruß Tino
Anzeige
So ist's oK, vielen, vielen Dank
18.09.2009 15:08:54
Joachim
Schönes WE

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige