Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1660to1664
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

Suche beschleunigen

Suche beschleunigen
18.12.2018 16:49:51
Heinzs
Hallo Excel-Profis,
ich loope durch ein Blatt1 und suche zu jeder Zeile etwas in einem weiteren Blatt. Finde ich den Eintrag schreibe ich Werte aus dem weiteren Blatt in Blatt1.
Blatt1 hat 500000 Zeilen.
Blatt Übersetzungen hat 100000 Zeilen.
Der Code arbeitet einwandfrei; einzig und alleine zu langsam; hat jemand Tuningideen?
'Zusatzangaben berechnen
Application.ScreenUpdating = False
e1=500000
For i1 = 2 To e1
If i1 Mod 100 = 0 Or i1 = e1 Then
Application.StatusBar = "Zusatzangaben ermitteln, Datensatz " & Format(i1, "0000000") & " von " & Format(e1, "0000000") & " Endzeit = " & Anfangszeit1 + (Now() - Anfangszeit1) / i1 * e1
DoEvents
End If
Sheets("Blatt1").Select
gn_such = Cells(i1, 4)
If gn_such "" Then
Sheets("Übersetzungen").Select
With Range("AQ:AQ")
Set c = .Find(gn_such, LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then
y = c.row
gn_configuration_id = Cells(y, 44)
Sheets(Blatt1).Select
Cells(i1, 6) = gn_configuration_id
End If
End With
End If
Next i1
Application.ScreenUpdating = True
Application.StatusBar = False
Vielen Dank für Hilfe!
Mit vorweihnachtlichen Grüßen,
Heinz

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Pseudo-Code
18.12.2018 17:02:27
Fennek
Hallo,
es sollte schneller gehen, wenn man zuerst alles in Array überträgt und dann dort sucht.

Sub Ar
B1 = Sheets(1).cells(1).currentregion
B2 = Sheets(2).cells(1).current region
For i = 1 to ubound(B1)
For ii = 1 to ubound(B2)
if B1(i,1) = B2(ii,1) then -------------
next ii
next i
end sub
mfg
AW: Pseudo-Code
18.12.2018 18:08:38
Daniel
Hi Fennek
bei der benannten Datenmenge würde ich die Wette eingehen, dass ich die Aufgabe ohne Makro schneller erledigen kann als ein Marko nach deinem Pseudocode.
Gruß Daniel
AW: Pseudo-Code
22.12.2018 18:40:43
Heinzs
Hallo Fennek,
vielen Danke für Deine Hilfe; ich werde jetzt in den letzten Tagen des Jahres Deine und die anderen Lösungen ausprobieren.
Dir und Deiner Familie Frohes Fest und alles Gute für 2019!
Mit vorweihnachtlichen Grüßen,
Heinz
Anzeige
AW: Suche beschleunigen
18.12.2018 17:31:21
Daniel
Hi
1. Referenziere deine Zellen immer mit Tabellenblattangabe davor. Dann musst du nicht jedesmal das Blatt wechseln, wenn du eine Zelle ansprichst:
Beispiel:
gn_such = Sheets("Blatt1").Cells(i1, 4)
2. du solltest hier auf Formeln zurück greifen, da du sehr viele Zellen zu bearbeiten hast.
beim Arbeiten mit reinem VBA so wie du es hier machst, musst du jede Zelle einzeln mit Werten füllen.
das kostet viel Zeit.
Bei Formeln hast du den Vorteil, dass du die Formel in alle Zellen gleichzeitig schreiben kannst, dass ist für Excel dann ein Vorgang.
3. Sortiere die Liste Übersetzungen nach Spalte AQ aufsteigend. In sortierten Listen kann Excel die Binäre Suche verwenden, welche wesentlich schneller ist als die einfache Suche in unsortierten Listen (Excel arbeitet hier genauso wie ein Mensch, eine unsortierte Liste müssen wir von oben nach unten durchgehen und jeden Wert mit dem Suchwert vergleichen, nach jedem Vergleich verkleinert sich die zu durchsuchende Restmenge um einen Wert.
In einer sortierten Liste können wir wesentlich schneller suchen, wenn wir in die Mitte der Liste gehen und dann mit einem Vergleich sofort entscheiden können, ob der gesuchte Wert in der oberen oder unteren Hälfte liegt und somit mit einem einzigen Vergleich die Restmenge auf die Hälfte verkleinern)
Allerdings steht diese Suchmethode nur in den Excelformeln VERGLEICH, VERWEIS und SVERWEIS zur verfügung, auch daher empfiehlt es sich, Formeln zu verwenden.
kleiner Nachteil ist, dass man keine Rückmeldung bekommt, ob der gesuchte Wert vorhanden ist oder nicht, daher muss man die Formel noch etwas erweitern:
sieht im Prinzip dann so aus:
'--- Sortieren, falls erforderlich
with Sheets("Übersetzungen")
.usedrange.Sort Key1:=.Cells(1, 43), order1:=xlascending, Header:=xlguess
end with
'--- Suchen und einfügen
With Sheets("Blatt1").Range("F2:F500000")
.FormulaLocal = _
"=WENN(SVerweis(D2;Übersetzungen!AQ:AQ;1;1)=D2,SVerweis(D2;Übersetzungen!AQ:AR;2;1);"""")
.Formula = .Value
End with
das ist nicht nur viel kürzer, sondern auch sehr viel schneller.
Gruß Daniel
Anzeige
AW: Suche beschleunigen
18.12.2018 19:25:34
Sulprobil
Hallo,
Ich schlage vor:
1. Application.Calculation auf manuell setzen.
2. Beide Sheets sortieren.
3. Beide Sheets in Variants laden.
4. Nicht mehr suchen, sondern in einem Durchgang durch beide Sheets wandern.
5. Für gefundene Einträge Variant 1 erweitern.
6. Variant 1 in Sheet 1 zurückschreiben.
7. Application.Calculation auf vorigen Wert zurücksetzen.
Viele Grüße,
Bernd P
AW: Suche beschleunigen
22.12.2018 18:43:30
Heinzs
Hallo Sulprobil,
vielen Dank für Deine Hilfe; ich werde jetzt in den letzten Tagen des Jahres Deine und die anderen Lösungen ausprobieren.
Dir und Deiner Familie Frohes Fest und alles Gute für 2019!
Mit vorweihnachtlichen Grüßen,
Heinz
Anzeige
AW: Suche beschleunigen
19.12.2018 01:25:26
Daniel
Hi
mal drei Codevarianten, um die Aufgabe bei der gegebenen Datenmenge in kurzer Zeit zu lösen.
Makro VLU ist die von mir schon beschriebene Formelvariante mit dem SVerweis / VLookUp
Makro DoS basiert auf der Idee von Sulprobil mit der doppelten Sortierung
Makro Dic verwendet das Dictionary-Objekt.
die Makros wurden hier für Sheet(1) und Sheet(2) mit den Werten in Spalte A und B geschrieben.
Sub DoS()
Dim x1, x2, e1
Dim z1 As Long, z2 As Long
Sheets(1).UsedRange.Sort key1:=Sheets(1).Cells(1, 1), order1:=xlAscending, Header:=xlYes
Sheets(2).UsedRange.Sort key1:=Sheets(2).Cells(1, 1), order1:=xlAscending, Header:=xlYes
x1 = Sheets(1).UsedRange.Columns(1).Value
e1 = Sheets(1).UsedRange.Columns(2).Value
x2 = Sheets(2).UsedRange.Columns(1).Resize(, 2).Value
z2 = 1
For z1 = 2 To UBound(x1, 1)
If x1(z1, 1) = x1(z1 - 1, 1) Then
e1(z1, 1) = e1(z1 - 1, 1)
Else
For z2 = z2 To UBound(x2)
If x2(z2, 1) > x1(z1, 1) Then
If x2(z2 - 1, 1) = x1(z1, 1) Then
e1(z1, 1) = x2(z2 - 1, 2)
Else
e1(z1, 1) = ""
End If
Exit For
End If
Next
End If
Next
Sheets(1).UsedRange.Columns(2).Value = e1
End Sub

Sub VLU()
Sheets(2).UsedRange.Sort key1:=Sheets(2).Cells(1, 1), order1:=xlAscending, Header:=xlYes
With Sheets(1).UsedRange.Columns(2)
.FormulaR1C1 = "=If(VLookup(RC1,Tabelle2!C1,1,1)=RC1,VLookUp(RC1,Tabelle2!c1:c2,2,1),"""")"
.Copy
.PasteSpecial xlPasteValues
Application.CutCopyMode = False
.Cells(1, 1).Value = "B"
End With
End Sub

Sub Dic()
Dim Dic As Object
Dim a, x
Dim z As Long
Set Dic = CreateObject("Scripting.dictionary")
a = Sheets(2).UsedRange.Columns(1).Resize(, 2)
For z = 2 To UBound(a, 1)
Dic(a(z, 1)) = a(z, 2)
Next
With Sheets(1).UsedRange.Columns(1)
a = .Value
For z = 2 To UBound(a, 1)
If Dic.exists(a(z, 1)) Then
a(z, 1) = Dic(a(z, 1))
Else
a(z, 1) = ""
End If
Next
a(1, 1) = "B"
.Offset(0, 1).Value = a
End With
End Sub
zu den Verarbeitungsgeschwindigkeiten:
getestet habe ich auf meinem Rechner mit 500.000 Zeilen in Tabelle1 und 100.000 Zeilen in Tabelle2
Dic: 8,2
VLU: 3,6
DoS: 4,3
nimmt man die Sortierung aus der Zeit heraus und geht davon aus, dass die Listen bereits passend sortiert sind, sehen die Zeiten so aus:
Dic: 5,2
VLU: 3,2
DoS: 1,9
überraschend ist für mich hier vor allem, dass auch die Dictionary-Methode durch die Sortierung deutlich schneller wird.
Gruß Daniel
Anzeige
AW: Suche beschleunigen
22.12.2018 18:42:03
Heinzs
Hallo Daniel,
vielen Dank für Deine Hilfe; ich werde jetzt in den letzten Tagen des Jahres Deine und die anderen Lösungen ausprobieren.
Dir und Deiner Familie Frohes Fest und alles Gute für 2019!
Mit vorweihnachtlichen Grüßen,
Heinz

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige