Code funktioniert, aber warum?
#1
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
Top
#2
Hallo,

darf ich wenigstens fragen, warum mein Beitrag verschoben wurde, und wohin?

mfg. Juergen
Top
#3
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:
  • Windlaeufer
Top
#4
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
Top
#5
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'
 ABCDEF
1      
2 NummerKWNameEintragDEintragE
3 11Mustermann1EintragD1EintragE1
4 21Mustermann2EintragD2EintragE2
5 31Mustermann3EintragD3EintragE3
6 42Mustermann1EintragD4EintragE4
7 52Mustermann2EintragD5EintragE5
8 62Mustermann3EintragD6EintragE6
9 71Mustermann1EintragD7EintragE7
10 81Mustermann2EintragD8EintragE8
11 91Mustermann3EintragD9EintragE9
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'
 IJKLMNOPQR
2          
3 111222111
4 Mustermann1Mustermann2Mustermann3Mustermann1Mustermann2Mustermann3Mustermann1Mustermann2Mustermann3
5 EintragD1EintragD2EintragD3EintragD4EintragD5EintragD6EintragD7EintragD8EintragD9
6 EintragE1EintragE2EintragE3EintragE4EintragE5EintragE6EintragE7EintragE8EintragE9
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'
 IJK
15   
16 11
17 Mustermann1Mustermann1
18 EintragD1EintragD7
19 EintragE1EintragE7
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'
 CDEF
16    
171Mustermann1EintragD1EintragE1
181Mustermann1EintragD7EintragE7
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:
  • Windlaeufer
Top
#6
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:
  • Windlaeufer
Top
#7
Hallo Stefan,
danke für die wunderbare Erklärung,
 ich merke aber ich habe Nachholbedarf in der Richtung.

mfg. Juergen
Top
#8
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
Top
#9
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
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste