Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1644to1648
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
VBA-Code beschleunigen
23.09.2018 22:41:41
Markus
Liebes Forum,
besteht eine Möglichkeiten den unten angehängten Code etwas zu "beschleunigen". Dauert leider bei der Menge an Daten ungefähr 25 Sekunden bis die UserForm aufgeht, auf die sich der Code bezieht.
Private Sub ComboBox1_Change()
If Not Bypass Then
FillListbox 2, 1
End If
End Sub

Private Sub ComboBox2_Change()
If Not Bypass Then
FillListbox 2, 1
End If
End Sub

Private Sub ComboBox3_Change()
If Not Bypass Then
FillListbox 2, 1
End If
End Sub
Private Sub ComboBox4_Change()
If Not Bypass Then
FillListbox 2, 1
End If
End Sub
Private Sub ComboBox5_Change()
If Not Bypass Then
FillListbox 2, 1
End If
End Sub

Private Sub CommandButton1_Click()
Unload Me
End Sub

Private Sub UserForm_Initialize()
' Bypass...
Bypass = True
' Comboboxen füllen...
FillCombobox "ComboBox1", 2, 1
FillCombobox "ComboBox2", 2, 2
FillCombobox "ComboBox3", 2, 3
FillCombobox "ComboBox4", 2, 4
FillCombobox "ComboBox5", 2, 5
' Listbox Einstellungen...
ListBox1.ColumnCount = 5
' Listbox füllen...
FillListbox 2, 1
' Bypass...
Bypass = False
End Sub

Private Function FillCombobox(Control As String, Row As Long, Column As Long)
Dim n As Long
Dim t As String
Dim v As String
Dim c As Collection
Dim d() As String
' Fehler abschalten...
On Error Resume Next
' Collection erzeugen...
Set c = New Collection
' Clear...
Me.Controls(Control).Clear
' Alles...
Me.Controls(Control).AddItem "All"
' Tabelle1...
With ThisWorkbook.Worksheets("Tabelle1")
'   Einlesen...
For n = 1 To 3000
v = ""
v = .Cells(n + Row - 1, Column).Value
t = ""
t = c("Key=" & v)
If Len(t) 

Private Function FillListbox(Row As Long, Column As Long)
Dim b As Boolean
Dim n As Long
' Clear...
ListBox1.Clear
' Tabelle1...
With ThisWorkbook.Worksheets("Tabelle1")
'   Einlesen...
For n = 1 To 3000
'     Reset...
b = True
'     Bedingungen...
If ComboBox1.ListIndex > 0 Then
b = b And Not CBool(CStr(.Cells(n + Row - 1, Column + 0).Value)  _
(ComboBox1.List(ComboBox1.ListIndex, 0)))
End If
If ComboBox2.ListIndex > 0 Then
b = b And Not CBool(CStr(.Cells(n + Row - 1, Column + 1).Value)  _
(ComboBox2.List(ComboBox2.ListIndex, 0)))
End If
If ComboBox3.ListIndex > 0 Then
b = b And Not CBool(CStr(.Cells(n + Row - 1, Column + 2).Value)  _
(ComboBox3.List(ComboBox3.ListIndex, 0)))
End If
If ComboBox4.ListIndex > 0 Then
b = b And Not CBool(CStr(.Cells(n + Row - 1, Column + 3).Value)  _
(ComboBox4.List(ComboBox4.ListIndex, 0)))
End If
If ComboBox5.ListIndex > 0 Then
b = b And Not CBool(CStr(.Cells(n + Row - 1, Column + 4).Value)  _
(ComboBox5.List(ComboBox5.ListIndex, 0)))
End If
'     Hinzufügen...
If b Then
ListBox1.AddItem
ListBox1.List(ListBox1.ListCount - 1, 0) = .Cells(n + Row - 1, Column + 0).Value
ListBox1.List(ListBox1.ListCount - 1, 1) = .Cells(n + Row - 1, Column + 1).Value
ListBox1.List(ListBox1.ListCount - 1, 2) = .Cells(n + Row - 1, Column + 2).Value
ListBox1.List(ListBox1.ListCount - 1, 3) = .Cells(n + Row - 1, Column + 3).Value
ListBox1.List(ListBox1.ListCount - 1, 4) = .Cells(n + Row - 1, Column + 4).Value
End If
Next
End With
' Index...
If ListBox1.ListCount > 0 Then
ListBox1.ListIndex = 0
End If
End Function
Vielen Dank euch!

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA-Code beschleunigen
23.09.2018 23:38:30
Daniel
HI
also wenn ich deinen Code richtig interpretiere, dann brauchst du in den Comboboxen eine Duplikatfreie Liste aus der jeweiligen Tabellenspalte.
die Beschleunigungsansätze wären da folgende:
1. prüfen, ob die Schleife über die Zellen auch wirklich bis 3000 laufen muss, ggf kann hier die tatsächliche Anzahl ermittelt werden.
2. die Daten aus der Tabelle in ein Array lesen und dann die Schleife über das Array laufen lassen.
3. zur Erstellung der Duplikatfreien Liste besser ein Dictionary verwenden. Dem Dictionary kannst du einfach die Elemente ohne Prüfung hinzufügen, Duplikate werden dabei automatisch vermieden. Außerdem kannst du dann am Schluss alle Werte auf einmal der Combobox hinzufügen und musst nicht jeden Wert einzeln hinzufügen (damit würde dann dein Change-Event auch nur einmal aufgerufen und nicht zig-mal.
4. Wenn im Change-Event auf eine Eingabe des Anwenders reageiert werden soll, dann nimm besser das Klick-Event. Change reagiert auf alle Ändrungen auch z.B. auf das Hinzufügen von Elementen und ist daher in den meisten Fällen nicht sinnvoll.
die Umsetzung der Punkte 1-3 siehst du in diesem Codebeispiel (nicht getestet, da ich von dir keine Beispieldatei habe:
Private Function FillCombobox(Control As String, Row As Long, Column As Long)
Dim arr, a
Dim d As Object
' Dictionary erzeugen...
Set d = CreateObject("Scripting.Dictionary")
' Alles...
d("all") = 0
' Tabelle1...
With ThisWorkbook.Worksheets("Tabelle1")
'   Einlesen...
arr = .Range(.Cells(Row, Column), .Cells(.Rows.Count, Column).End(xlUp)).Value
For Each a In arr
d(a) = 0
Next
End With
Me.Controls(Control).List = d.keys
' Index...
Me.Controls(Control).ListIndex = 0
End Function
noch ein Hinweis:
ein pauschales: On Error Resume Next am Anfang eines Makros ist grober Unfug.
wenn das Makro fertig ist, sollte es fehlerfrei laufen und sowas nicht notwendig sein.
wenn das Makro noch nicht fertig ist und Fehler enthalten könnte, sollten diese möglichst schnell auffallen und behoben werden. Dazu ist es hilfreich, wenn der Code an der Fehlerverursachenden Stelle stoppt und du noch alle Variablen und sonstigen Größen prüfen kannst, um die Fehlerursache zu finden.
Wenn man sowas einsetzt, dann gezielt nur an solchen Stellen im Code, bei denen im Normalbetrieb ein Fehler auftreten kann und wo es sinnvoll ist, dann einfach mit dem nächsten Schritt weiter zu machen.
Danach sollte man das On Error Resume Next sofort wieder aufheben.
noch ein Hinweis:
verwende für Variablen möglichst keine Benennungen, die in VBA Schlüsselwörter sind (Row, Column).
es kann funktionieren, es kann aber auch schief gehen, wenn es in einer Programmsituation nicht eindeutig ist, was gemeint ist.
Außerdem könnte jemand der den Code lesen und verstehen muss, verwirrt werden.
Gruß Daniel
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige