Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1948to1952
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
Inhaltsverzeichnis

Code braucht sehr lange zum Einlesen der Daten

Code braucht sehr lange zum Einlesen der Daten
29.10.2023 13:09:52
Andreas
Hallo,
habe ein Makro was sehr lange zum Laden braucht. Es muss auch in diesem Beispiel ca. 6500 Zeilen abarbeiten.

Habe dieses Makro schon aus dem Userform, mit dem ständig gearbeitet wird, herausgenommen-und in ein eigenständiges Userform gesetzt, da es eigentlich selten gebraucht wird. Vielleicht gibt es eine Möglichkeit dieses doch zu beschleunigen?



hier mal zum testen.... Klicke auf "Finde Räume"

https://www.herber.de/bbs/user/163873.xlsm

Der Code lautet:
Sub sbFillCmb() 'fülle die Raumbox auf


Dim lloRow As Long, liIdx As Integer, larstrCmb() As String, lboExist As Boolean

ReDim larstrCmb(0)

With Sheets("Bearbeiten")
For lloRow = 1 To .Cells(.Rows.count, 2).End(xlUp).Row
For liIdx = 0 To UBound(larstrCmb)
If .Range("B" & lloRow).Value = larstrCmb(liIdx) Then
lboExist = True
Exit For
End If
Next
If lboExist = True Then
lboExist = False
Else
larstrCmb(UBound(larstrCmb)) = .Range("B" & lloRow).Value
ReDim Preserve larstrCmb(UBound(larstrCmb) + 1)
End If
Next

On Error Resume Next 'wegen Neu und Leer-Unrelevanter Fehler

ReDim Preserve larstrCmb(UBound(larstrCmb) - 1)
For liIdx = 0 To UBound(larstrCmb)
UserForm105.ComboBox00094X.AddItem larstrCmb(liIdx)
Next
End With

End Sub


Gruß Andreas

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code braucht sehr lange zum Einlesen der Daten
29.10.2023 13:37:46
GerdL
Moin Andreas,

eine Freihandzeichnung zum Testen.
Option Explicit

Sub sbFillCmb() 'fülle die Raumbox auf

Dim lloRow As Long, liIdx As Integer, larstrCmb() As String, lboExist As Boolean
Dim vntListe As Variant
ReDim larstrCmb(0)

With Sheets("Bearbeiten")
vntListe = .Range(.Cells(1, 2), .Cells(.Rows.Count, 2).End(xlUp)).Value
End With

For lloRow = 1 To UBound(vntListe, 1)

For liIdx = 0 To UBound(larstrCmb)
If vntListe(lloRow, 1) = larstrCmb(liIdx) Then

lboExist = True
Exit For
End If
Next
If lboExist = True Then
lboExist = False
Else
larstrCmb(UBound(larstrCmb)) = vntListe(lloRow, 1)
ReDim Preserve larstrCmb(UBound(larstrCmb) + 1)
End If
Next

On Error Resume Next 'wegen Neu und Leer-Unrelevanter Fehler

ReDim Preserve larstrCmb(UBound(larstrCmb) - 1)
For liIdx = 0 To UBound(larstrCmb)
UserForm105.ComboBox00094X.AddItem larstrCmb(liIdx)
Next


End Sub

Gruß Gerd
Anzeige
AW: Code braucht sehr lange zum Einlesen der Daten
29.10.2023 20:33:06
daniel
HI
so wie ich das sehe, willst du die Raumnummern ohne Duplikate in der der Reihenfolge, wie sie in der Liste vorkommen in der Combobox.
Wenn die Angaben von Mikrosoft stimmen ( was leider nicht immer der Fall ist), dann verfügt dein Excel über die Funktion EINDEUTIG.
Diese könntest du hier nutzen, was die Sache ganz einfach macht:

Private Sub UserForm_Initialize()

ComboBox00094X.List = WorksheetFunction.Unique(Range(Cells(1, 2), Cells(1, 2).End(xlDown)))
End Sub


auch sortiert wäre kein Problem, wenn dein Excel schon über die Funtion SORTIEREN verfügt (Microsoft sagt so, muss aber nicht stimmen)
Private Sub UserForm_Initialize()

ComboBox00094X.List = WorksheetFunction.Sort(WorksheetFunction.Unique(Range(Cells(1, 2), Cells(1, 2).End(xlDown))))
End Sub


wenn nicht könntest du die Inhalte in eine freie Spalte kopieren, dort das Duplikate-Entfernen und ggf das Sortieren anwenden (zwei einfach Excelmenüfunktionen, die jeder kennen sollte)
Hier also der Weg über die Excelmenüfunktionen, bei WITH Columns(9) solltest du eine freie Spalte rechts der Daten angeben, die temporeär genutzt werden kann, auch die Spalten links und rechts daneben sollten leer sein.
Private Sub UserForm_Initialize()

With Columns(9)
Columns(2).Copy .Cells
.RemoveDuplicates 1, xlNo
.Sort key1:=.Cells(1, 1), order1:=xlAscending, Header:=xlNo
ComboBox00094X.List = .CurrentRegion.Value
.Clear
End With
End Sub


um duplikat-Freie Listen zu erstellen kann man die Listbox auch selber nutzen mit wenig aufand.

nicht ganz so schnell, aber probrammiertechnisch auch sehr einfach wäre es, die Combobox selbst für die Duplikatsprüfung zu nutzen:
Private Sub UserForm_Initialize()

Dim c As Long
Dim Raum
With ComboBox00094X
For Each Raum In Range(Cells(1, 2), Cells(1, 2).End(xlDown)).Value
For c = 0 To .ListCount - 1
If .List(c) = CStr(Raum) Then Exit For
Next
If c = .ListCount Then .AddItem CStr(Raum)
Next
End With
End Sub

und auch damit ließen sich sogar gleich sortierte Listen erstellen.
Private Sub UserForm_Initialize()

Dim c As Long
Dim Raum, R As String
With ComboBox00094X
For Each Raum In Range(Cells(1, 2), Cells(1, 2).End(xlDown)).Value
R = CStr(Raum)
For c = 0 To .ListCount - 1
If .List(c) >= R Then Exit For
Next
If c = .ListCount Then
.AddItem R
Else
If .List(c) > R Then .AddItem R, c
End If
Next
End With
End Sub


Gruß Daniel
Anzeige
AW: Code geht ja ganz schnell
29.10.2023 13:43:38
Andreas
Danke Gerd,
ich bin beeindruckt.
Das läuft wie geschmiert.....

Gruß Andreas


AW: Code geht noch viel schneller
29.10.2023 19:06:05
Uduuh
Hallo,
ca. 23x schneller und erheblich kürzer:
Sub sbFillCmb() 'fülle die Raumbox auf


Dim lloRow As Long
Dim objCBXList As Object, vntARR
Dim t
t = Timer
Set objCBXList = CreateObject("scripting.dictionary")

With Sheets("Bearbeiten")
vntARR = .Range(.Cells(2, 2), .Cells(Rows.Count, 2).End(xlUp)).Value
End With

For lloRow = 1 To UBound(vntARR)
objCBXList(vntARR(lloRow, 1)) = 0
Next lloRow
UserForm105.ComboBox00094X.List = Application.Transpose(objCBXList.keys)

Debug.Print Timer - t
End Sub

Gruß aus'm Pott
Udo
Anzeige
AW: Code geht noch viel schneller
30.10.2023 14:49:37
Andreas
Danke Udo, das geht ja noch schneller und sortiert.

Auch danke an Gerd und Daniel für die Hilfe und Erläuterungen.

Gruß Andreas
AW: Code geht noch viel schneller
30.10.2023 14:56:02
daniel
Hi

Der Code von Udo sortiert?
Das wundert mich, eigentlich müsste er so genau die Reihenfolge wiedergeben, wie die Werte in der Liste stehen.

Gruß Daniel
AW: Code geht noch viel schneller
31.10.2023 07:43:42
Andreas
Hallo Daniel, der Code von Udo geht schnell, und mit der Funktion


ComboBox00094X.List = WorksheetFunction.Sort(WorksheetFunction.Unique(Range(Cells(1, 2), Cells(1, 2).End(xlDown))))
am Ende

sortiert er auch noch-

Diese Funktion wird nun auch noch in anderen Comboboxen eingesetzt.

Gruß Andreas



Anzeige
AW: Code geht noch viel schneller
31.10.2023 09:46:34
daniel
ich weiß dass der Code von Udo schnell ist, ich nutze das auch gerne.
nur sortieren kann man so nicht.
aber seit dem man die Excelfunktion EINDEUTIG verwenden kann, braucht man das Dictionary zum Entfernen von Duplikaten in einem Array nicht mehr, weil man das jetzt mit einem Befehl machen kann (trotzdem sollte man sich das Dictionary-Objekt merken, weil man damit auch viele andere schöne Sachen machen kann, wenn es darum geht, Listen und Tabellen zu bearbeiten, umzuformen oder auszuwerten)
Und wenn man EINDEUTIG als Excelfunktion hat, hat man auch SORTIEREN um die Daten dann noch im Array zu sortieren, dafür gabs bisher in VBA auch noch keinen Befehl (es gab das Objekt ArrayList, aber das war nie so richtig in der Hilfe dokumentiert)
also der Codeauschnitt, den du hier zeigst, ersetzt den Code von Udo vollständig und sortiert dabei auch noch.
Gruß Daniel
Anzeige
vba worksheetfunction.sort
31.10.2023 11:47:27
Andreas
Ja , das stimmt- da brauche ich das vorhergehnde gar nicht....

Habe auch dies hier ändern können-

Dim objDic As Object, Zelle As Range

Set objDic = CreateObject("Scripting.Dictionary")
With Sheets("Bearbeiten")
For Each Zelle In .Range("C1:C" & .Cells(Rows.count, 3).End(xlUp).Row)
objDic(Zelle.Value) = 0
Next
ComboBox719.List = objDic.keys
Set objDic = Nothing
End With

durch
ComboBox719.List = WorksheetFunction.Sort(WorksheetFunction.Unique(Range(Cells(1, 3), Cells(1, 3).End(xlDown))))

und nun sortiert...




Nur der neugier nach-

Die Reihenfolge beim Sortieren der Werte mit Zahlen ist derzeit: z.B. 3; 30; 300; 4; 400; 404; 5; 501
Kann man noch Pararmeter hinzufügen- das es 3; 4; 5; 30; 300.... usw. wird?

https://learn.microsoft.com/de-de/office/vba/api/project.application.sort - naja bei meinen VBA Kenntnissen....

Gruß Andreas

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige