Kann man den Code schneller machen?

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
UserForm ListBox
Bild

Betrifft: Kann man den Code schneller machen?
von: Frank H.
Geschrieben am: 07.09.2015 21:44:37

Hallo Zusammen!
Ich habe folgenden Code gebastelt:

Private Sub UserForm_Initialize()
With frmSpielverlegungen
    .ListBox1.ColumnCount = 17
    .ListBox1.ColumnWidths = "35;155;50;35;35;35;35;35;35;35;35;35;35;35;35;35;35"
    
End With
With frmSpielverlegungen
 .ListBox1.Clear
 
 Dim Daten(31, 17)
 
    For lng = 3 To 382
    
        For Z = 0 To 31
        
        'If Cells(Rows.Count, 25).End(xlUp).Row + 1 = "" Then Exit Sub
    If Sheets("Ansetzungen").Cells(lng, 25) = "x" Then
        
        Daten(Z, 0) = Sheets("Ansetzungen").Cells(lng, 3)
        Daten(Z, 1) = Sheets("Ansetzungen").Cells(lng, 4)
        Daten(Z, 2) = Sheets("Ansetzungen").Cells(lng, 5)
        Daten(Z, 3) = Sheets("Ansetzungen").Cells(lng, 6)
        Daten(Z, 4) = Sheets("Ansetzungen").Cells(lng, 7)
        Daten(Z, 5) = Sheets("Ansetzungen").Cells(lng, 8)
        Daten(Z, 6) = Sheets("Ansetzungen").Cells(lng, 9)
        Daten(Z, 7) = Sheets("Ansetzungen").Cells(lng, 10)
        Daten(Z, 8) = Sheets("Ansetzungen").Cells(lng, 11)
        Daten(Z, 9) = Sheets("Ansetzungen").Cells(lng, 12)
        Daten(Z, 10) = Sheets("Ansetzungen").Cells(lng, 13)
        Daten(Z, 11) = Sheets("Ansetzungen").Cells(lng, 14)
        Daten(Z, 12) = Sheets("Ansetzungen").Cells(lng, 15)
        Daten(Z, 13) = Sheets("Ansetzungen").Cells(lng, 26)
        Daten(Z, 14) = Sheets("Ansetzungen").Cells(lng, 27)
        Daten(Z, 15) = Sheets("Ansetzungen").Cells(lng, 28)
        Daten(Z, 16) = lng
        
        lng = lng + 1
        
     End If
     
        Next Z
        
        .ListBox1.List = Daten
        
    Next lng
     
End With
End Sub
Ich hoffe ihr könnt erkennen was der Code erledigt. Er befüllt mir 'ne ListBox. Ich finde aber, dass es recht lange dauert. Kann man das beschleunigen, oder was mache ich grundsätzlich falsch?
Gruß Frank H.

Bild

Betrifft: AW: Kann man den Code schneller machen?
von: Nepumuk
Geschrieben am: 07.09.2015 21:57:07
Hallo,
teste mal:

Private Sub UserForm_Initialize()
    
    Dim Daten(31, 17) As Variant, avntValues As Variant
    
    With Worksheets("Ansetzungen")
        avntValues = .Range(.Cells(3, 3), .Cells(382, 28)).Value
    End With
    
    With frmSpielverlegungen
        
        .ListBox1.ColumnCount = 17
        .ListBox1.ColumnWidths = "35;155;50;35;35;35;35;35;35;35;35;35;35;35;35;35;35"
        .ListBox1.Clear
        
        For lng = LBound(avntValues) To UBound(avntValues)
            
            If avntValues(lng, 25) = "x" Then
                
                For Z = 0 To 31
                    
                    Daten(Z, 0) = avntValues(lng, 3)
                    Daten(Z, 1) = avntValues(lng, 4)
                    Daten(Z, 2) = avntValues(lng, 5)
                    Daten(Z, 3) = avntValues(lng, 6)
                    Daten(Z, 4) = avntValues(lng, 7)
                    Daten(Z, 5) = avntValues(lng, 8)
                    Daten(Z, 6) = avntValues(lng, 9)
                    Daten(Z, 7) = avntValues(lng, 10)
                    Daten(Z, 8) = avntValues(lng, 11)
                    Daten(Z, 9) = avntValues(lng, 12)
                    Daten(Z, 10) = avntValues(lng, 13)
                    Daten(Z, 11) = avntValues(lng, 14)
                    Daten(Z, 12) = avntValues(lng, 15)
                    Daten(Z, 13) = avntValues(lng, 26)
                    Daten(Z, 14) = avntValues(lng, 27)
                    Daten(Z, 15) = avntValues(lng, 28)
                    Daten(Z, 16) = lng
                    
                    lng = lng + 1
                    
                End If
            Next Z
            
            .ListBox1.List = Daten
            
        Next lng
    End With
End Sub

Gruß
Nepumuk

Bild

Betrifft: Ooooooooops
von: Nepumuk
Geschrieben am: 07.09.2015 22:04:05
Da waren noch ein paar Fehler drin:

Private Sub UserForm_Initialize()
    
    Dim Daten(31, 17) As Variant, avntValues As Variant
    Dim lng As Long, z As Long
    
    With Worksheets("Ansetzungen")
        avntValues = .Range(.Cells(3, 1), .Cells(382, 28)).Value
    End With
    
    With frmSpielverlegungen
        
        .ListBox1.ColumnCount = 17
        .ListBox1.ColumnWidths = "35;155;50;35;35;35;35;35;35;35;35;35;35;35;35;35;35"
        .ListBox1.Clear
        
        For lng = LBound(avntValues) To UBound(avntValues)
            
            If avntValues(lng, 25) = "x" Then
                
                For z = 0 To 31
                    
                    Daten(z, 0) = avntValues(lng, 3)
                    Daten(z, 1) = avntValues(lng, 4)
                    Daten(z, 2) = avntValues(lng, 5)
                    Daten(z, 3) = avntValues(lng, 6)
                    Daten(z, 4) = avntValues(lng, 7)
                    Daten(z, 5) = avntValues(lng, 8)
                    Daten(z, 6) = avntValues(lng, 9)
                    Daten(z, 7) = avntValues(lng, 10)
                    Daten(z, 8) = avntValues(lng, 11)
                    Daten(z, 9) = avntValues(lng, 12)
                    Daten(z, 10) = avntValues(lng, 13)
                    Daten(z, 11) = avntValues(lng, 14)
                    Daten(z, 12) = avntValues(lng, 15)
                    Daten(z, 13) = avntValues(lng, 26)
                    Daten(z, 14) = avntValues(lng, 27)
                    Daten(z, 15) = avntValues(lng, 28)
                    Daten(z, 16) = lng
                    
                    lng = lng + 1
                    
                Next z
            End If
        Next lng
        
        .ListBox1.List = Daten
        
    End With
End Sub


Bild

Betrifft: AW: Ooooooooops
von: Frank H.
Geschrieben am: 07.09.2015 22:15:07
Hallo Nepumuk!
Jetzt läuft er bedeutend schneller. Jedoch zeigt er mir nun in der ListBox 'ne Menge Daten an, obwohl in Spalte 25 nur einmal ein x vorkommt, also soll auch nur ein Datensatz angezeigt werden! Wo liegt da eventuell noch ein Fehler?
Gruß Frank H.

Bild

Betrifft: AW: Kann man den Code schneller machen?
von: Frank H.
Geschrieben am: 07.09.2015 22:09:14
Hallo Nepumuk!
Leider kein Erfolg, dauert genau so lange und bei deinem Code bleibt die ListBox sogar leer, obwohl sie einen Eintrag haben müsste! Trotzdem danke für dein Interesse, vielleicht schaust du noch mal drüber?
Gruß Frank H.

Bild

Betrifft: AW: Kann man den Code schneller machen?
von: Nepumuk
Geschrieben am: 07.09.2015 22:16:59
Hallo Frank,
ich bin mit deinen Arrays durcheinander gekommen. So sollte es passen:

Private Sub UserForm_Initialize()
    
    Dim Daten() As Variant, avntValues As Variant
    Dim lng As Long, lngCount As Long
    
    With Worksheets("Ansetzungen")
        avntValues = .Range(.Cells(3, 1), .Cells(382, 28)).Value
    End With
    
    With frmSpielverlegungen
        
        .ListBox1.ColumnCount = 17
        .ListBox1.ColumnWidths = "35;155;50;35;35;35;35;35;35;35;35;35;35;35;35;35;35"
        .ListBox1.Clear
        
        For lng = LBound(avntValues) To UBound(avntValues)
            
            If avntValues(lng, 25) = "x" Then
                
                lngCount = lngCount + 1
                
                Redim Preserve Daten(0 To 16, 1 To lngCount)
                
                Daten(0, lngCount) = avntValues(lng, 3)
                Daten(1, lngCount) = avntValues(lng, 4)
                Daten(2, lngCount) = avntValues(lng, 5)
                Daten(3, lngCount) = avntValues(lng, 6)
                Daten(4, lngCount) = avntValues(lng, 7)
                Daten(5, lngCount) = avntValues(lng, 8)
                Daten(6, lngCount) = avntValues(lng, 9)
                Daten(7, lngCount) = avntValues(lng, 10)
                Daten(8, lngCount) = avntValues(lng, 11)
                Daten(9, lngCount) = avntValues(lng, 12)
                Daten(10, lngCount) = avntValues(lng, 13)
                Daten(11, lngCount) = avntValues(lng, 14)
                Daten(12, lngCount) = avntValues(lng, 15)
                Daten(13, lngCount) = avntValues(lng, 26)
                Daten(14, lngCount) = avntValues(lng, 27)
                Daten(15, lngCount) = avntValues(lng, 28)
                Daten(16, lngCount) = lngCount
                
            End If
        Next lng
        
        .ListBox1.Column = Daten
        
    End With
End Sub

Und was heißt lange? Das Ganze dauert bei mir 8 Millisekunden.
Gruß
Nepumuk

Bild

Betrifft: AW: Kann man den Code schneller machen?
von: Frank H.
Geschrieben am: 07.09.2015 22:28:06
Hallo Nepumuk!
So funzt es prima! Vielen lieben Dank und eine Gute Nacht!
Gruß Frank H.

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Kann man den Code schneller machen?"