Registriert seit: 29.09.2015
Version(en): 2030,5
@Att Dann reicht diese Code: Code: Sub M_snb() sn = Sheets("Übersicht").Cells(1).CurrentRegion With CreateObject("Scripting.Dictionary") For j = 2 To UBound(sn) .Item(sn(j, 1)) = .Item(sn(j, 1)) & "_" & sn(j, 2) Next j = 5 For Each it In .keys Sheets("Übersicht").Cells(30, j).Resize(60) = Application.Transpose(Split(it & .Item(it), "_")) j = j + 1 Next Sheets("Übersicht").Cells(30, j).CurrentRegion.SpecialCells(2, 16).ClearContents End With End Sub
Registriert seit: 14.04.2014
Version(en): 2003, 2007
27.01.2017, 13:48
(Dieser Beitrag wurde zuletzt bearbeitet: 27.01.2017, 13:48 von atilla.)
Hallo snb, nee, das gilt nicht. Ich habe gestern lange darauf gewartet, dass Du diese Lösung anbietest. Aber im Grunde unterscheiden sich unsere Codes nicht wesentlich. In meiner Werkstatt sieht es nur aufgeräumter aus. Am Ende steht da zwar das gleiche Auto, aber meins ist zudem noch sparsamer als Deiner. Deins ist zu puristisch. Aber in meinem Alter mag ich es etwas Komfortabler. Der entscheidende Unterschied liegt hier: Code: For Each it In .keys Sheets("Tabelle2").Cells(1, j).Resize(60) = Application.Transpose(Split(it & .Item(it), "_")) j = j + 1 Next
Bei noch größeren Datenmengen wird mein Code sicher schneller sein, stimmst Du mir da zu?? Bitte, bitte! EDIT: Ach, hätte ich fast vergessen, Dein Code reicht so natürlich nicht aus. Eine If Abfrage muss noch rein zur Prüfung der Spalte C auf Zahlen.
Gruß Atilla
Registriert seit: 14.04.2014
Version(en): 2003, 2007
Hallo Klaus, so nach dem wir snb etwas geärgert haben nun zu Dir. Du hast sicher nicht festgestellt, dass mein Code nicht alle Ergebnisse liefert, oder hast Du? Die letzte Zeile habe ich unterschlagen. Dann habe ich den Speicher unnötig stark beansprucht mit meiner Array Dimensionierung. Unten zwei Codevarianten die die gleichen Ergebnisse liefern, sich allein bei der Umsetzung der Anpassung der Spaltenbreite unterscheiden. Lass beide mal laufen, dann siehst Du den unterschied. Natürlich erhältst Du mit beiden jetzt alle Ergebnisse. Code: Option Explicit
' Bedingtes Transponieren Sub Bedingtes_Transponieren() Dim i As Long, j As Long, k As Long Dim zZ As Long Dim lngZ As Long Dim feld Dim vntK Dim arr() Dim c As Object Set c = CreateObject("Scripting.Dictionary") With Sheets("Übersicht") lngZ = .Cells(.Rows.Count, 1).End(xlUp).Row feld = .Range("A2:C" & lngZ) For i = 1 To lngZ - 1 If IsNumeric(feld(i, 3)) Then vntK = feld(i, 1) ' If InStr(c(vntK), feld(i, 3)) = 0 Then 'wenn wie bei OPA EDGAR keine Doppelten aus Spalte B aufgeführt werden sollen, dann das Hochkomma am Anfang der Zeile entfernen c(vntK) = feld(i, 2) & "#" & c(vntK) ' End If 'wenn wie bei OPA EDGAR keine Doppelten aus Spalte B aufgeführt werden sollen, dann das Hochkomma am Anfang der Zeile entfernen zZ = Application.Max(zZ, UBound(Split(c(vntK), "#")) + 1) End If Next ReDim arr(c.Count - 1, zZ) For Each vntK In c.keys arr(k, 0) = vntK For j = 0 To UBound(Split(c(vntK), "#")) arr(k, j + 1) = Split(c(vntK), "#")(j) Next j k = k + 1 Next vntK End With
With Sheets("Tabelle1") 'Name der Zieltabelle .Cells.Clear Application.ScreenUpdating = False .Range(.Cells(1, 1), .Cells(zZ, c.Count)) = Application.Transpose(arr) .Range("A1").Resize(, c.Count).EntireColumn.AutoFit 'Spaltenbreite auto anpassen Application.ScreenUpdating = True End With End Sub
Sub Bedingtes_Transponieren2() Dim i As Long, j As Long, k As Long Dim zZ As Long Dim lngZ As Long Dim feld Dim vntK Dim arr() Dim c As Object Set c = CreateObject("Scripting.Dictionary") With Sheets("Übersicht") lngZ = .Cells(.Rows.Count, 1).End(xlUp).Row feld = .Range("A2:C" & lngZ) For i = 1 To lngZ - 1 If feld(i, 3) <> "" And IsNumeric(feld(i, 3)) Then vntK = feld(i, 1) ' If InStr(c(vntK), feld(i, 3)) = 0 Then 'wenn wie bei OPA EDGAR keine Doppelten aus Spalte B aufgeführt werden sollen, dann das Hochkomma am Anfang der Zeile entfernen c(vntK) = feld(i, 2) & "#" & c(vntK) ' End If 'wenn wie bei OPA EDGAR keine Doppelten aus Spalte B aufgeführt werden sollen, dann das Hochkomma am Anfang der Zeile entfernen zZ = Application.Max(zZ, UBound(Split(c(vntK), "#")) + 1) End If Next ReDim arr(c.Count - 1, zZ) For Each vntK In c.keys For j = 0 To UBound(Split(c(vntK), "#")) arr(k, j) = Split(c(vntK), "#")(j) Next j k = k + 1 Next vntK End With With Sheets("Tabelle1") 'Name der Zieltabelle .Cells.Clear Application.ScreenUpdating = False .Range("A1").Offset(1, 0).Resize(zZ, c.Count) = Application.Transpose(arr) .Range("A1").Resize(, c.Count).EntireColumn.AutoFit 'Spaltenbreite auto anpassen .Columns(1).WrapText = True 'Zellen der ersten Zeile Zeilenumbruch .Range("A1").Resize(, c.Count) = c.keys End With Application.ScreenUpdating = True End Sub
Gruß Atilla
Registriert seit: 29.09.2015
Version(en): 2030,5
Code: Sub M_snb() sn = Sheets("Übersicht").Cells(1).CurrentRegion With CreateObject("Scripting.Dictionary") For j = 2 To UBound(sn) If IsNumeric(sn(j, 3)) Then .Item(sn(j, 1)) = .Item(sn(j, 1)) & "_" & sn(j, 2) Next For Each it In .keys .Item(it) = Split(it & .Item(it) & String(60 - UBound(Split(.Item(it), "_")), "_"), "_") Next sn = Application.Transpose(Application.Index(.items, 0, 0)) Sheets("Übersicht").Cells(30, 5).Resize(UBound(sn), UBound(sn, 2)) = sn End With End Sub
Registriert seit: 14.04.2014
Version(en): 2003, 2007
Hallo snb, danke für die vielen Worte und die Ergänzung im Code. Aber was ist hiermit: Code: Bei noch größeren Datenmengen wird mein Code sicher schneller sein, stimmst Du mir da zu??
Gruß Atilla
Registriert seit: 29.09.2015
Version(en): 2030,5
Könntest du selbst herausfinden ?
Registriert seit: 14.04.2014
Version(en): 2003, 2007
27.01.2017, 16:37
(Dieser Beitrag wurde zuletzt bearbeitet: 27.01.2017, 16:38 von atilla.)
Hallo snb,
könnte ich, aber ich möchte dass Du mir Recht gibst.
Aber da Du jetzt da bist, folgendes:
Ich lese ja Werte so ein:
arr(k, j - 1) = Split(c(vntK), "#")(j)
wenn ich sie so einlese:
arr(k) = Join(Split(c(vntK), "#"), ", ")
wie kann ich diese dann in die Tabelle schreiben?
Ich kriege es gerade nicht hin.
Gruß Atilla
Registriert seit: 29.09.2015
Version(en): 2030,5
27.01.2017, 16:58
(Dieser Beitrag wurde zuletzt bearbeitet: 27.01.2017, 17:52 von snb.)
Es kann noch etwas einfacher: Code: Sub M_snb() With Sheets("Übersicht") .Cells(1).CurrentRegion.Sort .Cells(1), , .Cells(1, 2), , , , , 1 sn = .Cells(1).CurrentRegion End with
With CreateObject("Scripting.Dictionary") For j = 2 To UBound(sn) If IsNumeric(sn(j, 3)) And sn(j, 2) <> "" And InStr(.Item(sn(j, 1)) & "_", "_" & sn(j, 2) & "_") = 0 Then .Item(sn(j, 1)) = .Item(sn(j, 1)) & "_" & sn(j, 2) Next For Each it In .keys .Item(it) = Split(it & .Item(it) & String(60 - UBound(Split(.Item(it), "_")), "_"), "_") Next Sheets("Übersicht").Cells(30, 5).Resize(60, .Count) = Application.Transpose(Application.Index(.items, 0, 0)) Sheets("Übersicht").Cells(30, 5).Resize(60, .Count).EntireColumn.AutoFit End With End Sub
Registriert seit: 29.09.2015
Version(en): 2030,5
Join(Split(c(vntK), "#"), ", ")ist doch identisch zu replace(c(vntK,"#",",") ?? Schau mal: http://www.snb-vba.eu/VBA_Arrays_en.html#L_6.13.1.3
Registriert seit: 14.04.2014
Version(en): 2003, 2007
Hallo snb,
tolle Lösungen, die Du anbietest.
Ich brauch aber etwas Zeit, um dahinterzusteigen. Und wenn ich begriffen habe, was Du da machst, heißt es noch lange nicht, dass ich es behalten und anwenden kann. Dafür nutze ich VBA zu selten. Meist eben hier und dann zeitlich begrenzt aus Spaß an der Freud.
Aber ich schau mir die Sachen noch genauer an. Beim letzten Code verstehe ich nur nicht, warum du die Zahl 60 nutzt. Da müsste doch ein errechneter Wert stehen.
Nun brauchst Du auch nicht mehr bestätigen, dass ich schneller bin. Das bist Du jetzt eindeutig. :@
Gruß Atilla
|