Registriert seit: 18.04.2016
Version(en): 2010
Hallo zusammen,
ich habe aus mehreren Beiträgen diesen Code zusammen gebaut, funktioniert sehr gut, aber verstehen tue ich es nicht ganz. könnte mir eventuell jemand erklären warum der Code tut was er soll... eventuell eine Beschreibung was wo passiert ab der Zeile die mit Redim beginnt. Im voraus herzlichen Dank mfg. juergen
Dim vArr As Variant Dim i As Integer, j As Integer Dim strT As String Dim k As Integer Dim vOut As Variant Dim strBenutzer As String Dim letzte As Long
strT = DINKw(Date) 'die Variablen werden zugeordnet strBenutzer = fncUserName letzte = Worksheets("Daten").Cells(Rows.Count, 1).End(xlUp).Row 'gehe zur letzten Zeile vArr = ThisWorkbook.Worksheets("Daten").Range("A6:O" & letzte).Value '<< anpassen! ReDim vOut(0 To UBound(vArr, 2) - 1, 0 To UBound(vArr, 1) - 1) For i = 1 To UBound(vArr, 1) If vArr(i, 10) = strT And vArr(i, 15) = strBenutzer Then ' für Suchspalte Spalte 10 und 15 For j = 1 To UBound(vArr, 2) vOut(j - 1, k) = vArr(i, j) Next j k = k + 1 End If Next i With ListBox1 .Clear If vOut(0, 0) <> "" Then ReDim Preserve vOut(0 To UBound(vArr, 2) - 1, 0 To k - 1) .ColumnCount = UBound(vArr, 2) .List = Application.Transpose(vOut) End If End With
Registriert seit: 18.04.2016
Version(en): 2010
Hallo,
darf ich wenigstens fragen, warum mein Beitrag verschoben wurde, und wohin?
mfg. Juergen
Registriert seit: 11.04.2014
Version(en): Office 2007
Hallo Juergen, du hattest deine Frage im Forum Exceltreffen gepostet und sie wurde in das richtige Forum für Excel verschoben. Mal eine Erklärung als Ansatz Code: Sub prcWindlaeufer() Dim vArr As Variant Dim i As Integer, j As Integer Dim strT As String Dim k As Integer Dim vOut As Variant Dim strBenutzer As String Dim letzte As Long
strT = DINKw(Date) 'die Variablen werden zugeordnet strBenutzer = fncUserName letzte = Worksheets("Daten").Cells(Rows.Count, 1).End(xlUp).Row 'gehe zur letzten Zeile 'Bereich aus A&:O??? wird in ein Array eingelesen vArr = ThisWorkbook.Worksheets("Daten").Range("A6:O" & letzte).Value '<< anpassen! 'Neues Array in der Größe des Array vArr wird spiegelverkehrt erstellt ReDim vOut(0 To UBound(vArr, 2) - 1, 0 To UBound(vArr, 1) - 1) 'die erste Dimension des Arr vArr wird durchlaufen For i = 1 To UBound(vArr, 1) 'wenn die Abfrage nach Benutzer und ... erfüllt ist If vArr(i, 10) = strT And vArr(i, 15) = strBenutzer Then ' für Suchspalte Spalte 10 und 15 'wird die zweite Dimension des Array vArray durchlaufen For j = 1 To UBound(vArr, 2) 'und der Wert in das Array vOut geschrieben vOut(j - 1, k) = vArr(i, j) Next j k = k + 1 End If Next i With ListBox1 .Clear 'falls in den "links oben" im Array was eingetragen ist If vOut(0, 0) <> "" Then 'wird das Array vOut neu dimensioniert ReDim Preserve vOut(0 To UBound(vArr, 2) - 1, 0 To k - 1) .ColumnCount = UBound(vArr, 2) 'und das Array gedreht in die Listbox eingefügt .List = Application.Transpose(vOut) End If End With End Sub
Gruß Stefan Win 10 / Office 2016
Folgende(r) 1 Nutzer sagt Danke an Steffl für diesen Beitrag:1 Nutzer sagt Danke an Steffl für diesen Beitrag 28
• Windlaeufer
Registriert seit: 18.04.2016
Version(en): 2010
Hallo Stefan,
danke für die sehr schöne Erklärung.
Ich weiß jetzt in welche Richtung ich mich noch schlau machen sollte, vor allen dingen warum das Ganze gespiegelt werden muß.
Nochmals herzlichen Dank
mfg. Juergen
Registriert seit: 11.04.2014
Version(en): Office 2007
Hallo Juergen, ich weiß jetzt nicht, ob Du hier nochmal reinschaust aber ich kann ja versuchen es zu erklären. Angenommen deine Tabelle sieht so ähnlich aus Arbeitsblatt mit dem Namen 'Tabelle1' | | A | B | C | D | E | F | 1 | | | | | | | 2 | | Nummer | KW | Name | EintragD | EintragE | 3 | | 1 | 1 | Mustermann1 | EintragD1 | EintragE1 | 4 | | 2 | 1 | Mustermann2 | EintragD2 | EintragE2 | 5 | | 3 | 1 | Mustermann3 | EintragD3 | EintragE3 | 6 | | 4 | 2 | Mustermann1 | EintragD4 | EintragE4 | 7 | | 5 | 2 | Mustermann2 | EintragD5 | EintragE5 | 8 | | 6 | 2 | Mustermann3 | EintragD6 | EintragE6 | 9 | | 7 | 1 | Mustermann1 | EintragD7 | EintragE7 | 10 | | 8 | 1 | Mustermann2 | EintragD8 | EintragE8 | 11 | | 9 | 1 | Mustermann3 | EintragD9 | EintragE9 |
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg |
jetzt wird dein Array vOut ja spiegelverkehrt aufgebaut so dass die Daten dann so ausschauen würden Arbeitsblatt mit dem Namen 'Tabelle1' | | I | J | K | L | M | N | O | P | Q | R | 2 | | | | | | | | | | | 3 | | 1 | 1 | 1 | 2 | 2 | 2 | 1 | 1 | 1 | 4 | | Mustermann1 | Mustermann2 | Mustermann3 | Mustermann1 | Mustermann2 | Mustermann3 | Mustermann1 | Mustermann2 | Mustermann3 | 5 | | EintragD1 | EintragD2 | EintragD3 | EintragD4 | EintragD5 | EintragD6 | EintragD7 | EintragD8 | EintragD9 | 6 | | EintragE1 | EintragE2 | EintragE3 | EintragE4 | EintragE5 | EintragE6 | EintragE7 | EintragE8 | EintragE9 |
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg |
jetzt suchst Du nach der KW1 und den Mustermann1 und tatsächlich würde deine benötigten Daten so aus schauen Arbeitsblatt mit dem Namen 'Tabelle1' | | I | J | K | 15 | | | | 16 | | 1 | 1 | 17 | | Mustermann1 | Mustermann1 | 18 | | EintragD1 | EintragD7 | 19 | | EintragE1 | EintragE7 |
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg |
dein Array ist aber viel zu groß und Du mußt die Größe reduzieren. Das geht aber nur in der letzten Dimension. Deshalb war es notwendig das Array vOut spiegelverkehrt aufzubauen um letzendlich die Daten so in die Listbox aufnehmen zu können. Arbeitsblatt mit dem Namen 'Tabelle1' | | C | D | E | F | 16 | | | | | 17 | 1 | Mustermann1 | EintragD1 | EintragE1 | 18 | 1 | Mustermann1 | EintragD7 | EintragE7 |
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg |
Gruß Stefan Win 10 / Office 2016
Folgende(r) 1 Nutzer sagt Danke an Steffl für diesen Beitrag:1 Nutzer sagt Danke an Steffl für diesen Beitrag 28
• Windlaeufer
Registriert seit: 14.04.2014
Version(en): 2003, 2007
28.04.2017, 19:27
(Dieser Beitrag wurde zuletzt bearbeitet: 28.04.2017, 19:29 von atilla.)
Hallo zusammen, Stefan, das siehst du nicht richtig. Der Code geht theoretisch auch ohne Transponieren, wenn man ihn so aufbaut: Code: Sub prcWindlaeufer() Dim vArr As Variant Dim i As Integer, j As Integer Dim strT As String Dim k As Integer Dim vOut As Variant Dim strBenutzer As String Dim letzte As Long
strT = 1 'die Variablen werden zugeordnet strBenutzer = "Mustermann1"
letzte = Worksheets("Daten").Cells(Rows.Count, 1).End(xlUp).Row 'gehe zur letzten Zeile 'Bereich aus A&:O??? wird in ein Array eingelesen vArr = ThisWorkbook.Worksheets("Daten").Range("A1:E" & letzte).Value '<< anpassen!
'Neues Array in der Größe des Array vArr wird spiegelverkehrt erstellt ReDim vOut(0 To UBound(vArr, 1) - 1, 0 To UBound(vArr, 2) - 1) 'die erste Dimension des Arr vArr wird durchlaufen For i = 1 To UBound(vArr, 1) 'wenn die Abfrage nach Benutzer und ... erfüllt ist If vArr(i, 2) = strT And vArr(i, 3) = strBenutzer Then ' für Suchspalte Spalte 10 und 15 'wird die zweite Dimension des Array vArray durchlaufen For j = 1 To UBound(vArr, 2) 'und der Wert in das Array vOut geschrieben vOut(k, j - 1) = vArr(i, j) Next j k = k + 1 End If Next i
i = UBound(vOut) With ListBox1 .Clear 'falls in den "links oben" im Array was eingetragen ist If vOut(0, 0) <> "" Then 'wird das Array vOut neu dimensioniert ' ReDim Preserve vOut(0 To k - 1, 0 To UBound(vArr, 2) - 1) .ColumnCount = UBound(vArr, 2) 'und das Array gedreht in die Listbox eingefügt .List = (vOut) End If End With End Sub
Du siehst, dass ich Redim Preserve auskommentiert habe. Und da liegt das Theoretische und warum der Code wie vom TE eingestellt eher geeignet ist. Denn durch die If Abfrage können weniger Einträge in das Array geschrieben werden, als es anfänglich dimensioniert wurde. Es wurde nämlich in den Grenzen der Daten dimensioniert. Um beim Schreiben in die Listbox leere Zeilen zu vermeiden wird vorher redimensioniert und zwar auf so viele Zeilen wie eingelesen. Das Redimensionieren funktioniert aber nur in der Zweiten Dimension und nicht in der ersten. Deshalb habe ich es auskommentiert. Wenn Du die Zeile zulässt, wirst Du sehen, dass es dort zum Fehler kommt. Also der Code ist deswegen so, wie er ist, damit man am Ende redimensionieren kann. Kompliziert erklärt, aber ich hoffe verständlich.
Gruß Atilla
Folgende(r) 1 Nutzer sagt Danke an atilla für diesen Beitrag:1 Nutzer sagt Danke an atilla für diesen Beitrag 28
• Windlaeufer
Registriert seit: 18.04.2016
Version(en): 2010
Hallo Stefan, danke für die wunderbare Erklärung, ich merke aber ich habe Nachholbedarf in der Richtung.
mfg. Juergen
Registriert seit: 11.04.2014
Version(en): Office 2007
Hallo Atilla,
ich habe den vom TE eingestellten Code nicht geändert sondern nur die Kommentierungen eingefügt und nur nach denen hat der TE auch in seinem ersten Beitrag gefragt, damit er den Ablauf des Codes besser versteht.
Wenn ich es aber richtig sehe, hat in deiner Version das Array vOut zu viele Zeilen.
Gruß Stefan Win 10 / Office 2016
Registriert seit: 14.04.2014
Version(en): 2003, 2007
Hallo Stefan,
ich habe Deine antwort anscheinend nicht richtig gelesen und verstanden. Sorrry.
Im Grunde habe ich mit vielen Worten versucht das Dir zu Erklären, was Du dem TE schon sehr plastisch erklärt hast. :16: Ich stell mich in die Ecke und schäme mich bis morgen Früh. :17:
Gruß Atilla
|