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

For/Next mit großen Zahlen beschleunigen

For/Next mit großen Zahlen beschleunigen
05.05.2022 15:24:41
Seb
Hallo,
ich muss >20.000 Werte in Spalte B einzeln darauf prüfen, ob sie in Spalte A vorkommen. Die Werte für beide Spalten A und B beziehe ich jeweils aus zwei externen Exceldateien, deren Pfad als "Eingabe1" bzw. 2 im ersten Tabellenblatt eingetragen wird. In Spalte C soll anschließend "verfügbar" stehen, sonst "nicht verfügbar". Der Code funktioniert leider nur für kleinere Grenzen in der For-Schleife (bis ca. 1000), danach dauert der Prozess so lange, dass das Programm keine Rückmeldung mehr gibt. Ich habe diverse Befehle eingefügt, um den Prozess zu beschleunigen, bin damit aber noch unzufrieden. Hat jemand eine Idee, um den Code zu vereinfachen?

Sub Datenvergleich()
Dim Eingabe1 As String
Dim Eingabe2 As String
Dim Lastrow1 As Long
Dim Lastrow2 As Long
Dim n As Long
With Application
.ScreenUpdating = False
.DisplayAlerts = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
On Error GoTo 0
Eingabe1 = Sheets(1).Cells(1, 2).Value
Eingabe2 = Sheets(1).Cells(2, 2).Value
Workbooks.Open (Eingabe1)
Lastrow1 = ActiveWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
ActiveWorkbook.Sheets(1).Range("A2:A" & Lastrow1).Copy
ActiveWorkbook.Close
ThisWorkbook.Sheets(2).Range("A2").PasteSpecial
ThisWorkbook.Sheets(2).Cells(1, 1).Value = Sheets(1).Cells(1, 1).Value
Workbooks.Open (Eingabe2)
Lastrow2 = ActiveWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
ActiveWorkbook.Sheets(1).Range("A2:A" & Lastrow2).Copy
ActiveWorkbook.Close
ThisWorkbook.Sheets(2).Range("B2").PasteSpecial
ThisWorkbook.Sheets(2).Cells(1, 2).Value = Sheets(1).Cells(2, 1).Value
Sheets(2).Select
For n = 2 To 300
If WorksheetFunction.CountIf(Range("A:A"), Cells(n, 2)) > 0 Then
Cells(n, 3).Value = "verfügbar"
Else
Cells(n, 3).Value = "nicht verfügbar"
End If
Next n
Columns("A:C").EntireColumn.AutoFit
With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.Calculation = xlCalculationAutomatic
End With
End Sub

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: For/Next mit großen Zahlen beschleunigen
05.05.2022 15:46:05
Michael
Moin,
statt Range("A:A") schreib Range("A2:A20000").
Für 6stellige Werte der Form "AB1234" braucht die Schleife bei mir (i7-8700k) fast eine halbe Minute.
Dein Code arbeitet 1.028.576 weitere Zellen ab, die leer sind.
VG Michael
AW: For/Next mit großen Zahlen beschleunigen
05.05.2022 16:15:26
UweD
Hallo
so, ohne Schleife

Sub Datenvergleich()
Dim Eingabe1 As String
Dim Eingabe2 As String
Dim Lastrow1 As Long
Dim Lastrow2 As Long
Dim Lastrow3 As Long
Dim n As Long
With Application
.ScreenUpdating = False
.DisplayAlerts = False
.EnableEvents = False
End With
On Error GoTo 0
Eingabe1 = Sheets(1).Cells(1, 2).Value
Eingabe2 = Sheets(1).Cells(2, 2).Value
Workbooks.Open (Eingabe1)
Lastrow1 = ActiveWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
ActiveWorkbook.Sheets(1).Range("A2:A" & Lastrow1).Copy
ActiveWorkbook.Close
ThisWorkbook.Sheets(2).Range("A2").PasteSpecial
ThisWorkbook.Sheets(2).Cells(1, 1).Value = Sheets(1).Cells(1, 1).Value
Workbooks.Open (Eingabe2)
Lastrow2 = ActiveWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
ActiveWorkbook.Sheets(1).Range("A2:A" & Lastrow2).Copy
ActiveWorkbook.Close
ThisWorkbook.Sheets(2).Range("B2").PasteSpecial
ThisWorkbook.Sheets(2).Cells(1, 2).Value = Sheets(1).Cells(2, 1).Value
With Sheets(2)
Lastrow3 = .Cells.SpecialCells(xlCellTypeLastCell).Row 'Letzte Zeile des gesamten Blattes
With .Cells(2, 3).Resize(Lastrow3 - 1, 1)
.FormulaR1C1 = _
"=IF(COUNTIF(R2C1:R" & Lastrow3 & "C1,RC[-1])>0,""verfügbar"",""nicht verfügbar"")"
.Value = .Value
End With
.Columns("A:C").EntireColumn.AutoFit
End With
With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
End With
End Sub
LG UweD
Anzeige
AW: For/Next mit großen Zahlen beschleunigen
05.05.2022 16:11:56
ChrisL
Hi Seb
Irrtum vorbehalten, ich glaube Application.Match() (=Formel VERGLEICH anstelle ZÄHLENWENN) ist noch ein klein wenig schneller, aber einen grossen Unterschied wird es nicht machen. Via Datenfeld/Array dürfte eine weitere Beschleunigung machbar sein.
Aber idealerweise würde ich über eine Datenbank-Anwendung gehen. Aufgrund der Datenmenge (wie viele Einträge hat eigentlich Spalte A) und aufgrund der externen Quellen, scheint mir die Aufgabe hierfür prädestiniert.
Innerhalb Excel hätte ich Power-Query gewählt. Für XL2013 benötigt es jedoch den Download/Installation des gratis Add-On. Bist du dazu bereit?
Oder hast du vielleicht sowieso Access zur Verfügung? Hier den Beispiel SQL-String für Access:

SELECT Tabelle1.Eingabe1, Tabelle2.Eingabe2, IIf(IsNull([Tabelle1]![Eingabe1]),"nicht vorhanden","vorhanden") AS Ergebnis
FROM Tabelle1 RIGHT JOIN Tabelle2 ON Tabelle1.Eingabe1 = Tabelle2.Eingabe2;
Ansonsten kannst du die Frage auch wieder als offen markieren bzw. auf den Vorschlag von Michael eingehen.
cu
Chris
Anzeige
AW: For/Next mit großen Zahlen beschleunigen
05.05.2022 18:43:00
Daniel
Hi
1. Spalte A aufsteigend sortieren
2. in Spalte C kannst du dann mit dieser Formel prüfen, der Wert aus B in C vorhanden ist. Aufgrund der Sortierung ist das sehr schnell:

=Wenn(SVerweis(B1;A:A;1;wahr)=B1;"verfügbar";"nicht verfügbar")
bei VBA gut solltest du den Code dafür selber hinbekommen, falls du das brauchst.
wenn nicht sortiert werden kann, kannst du das auch mit hilfe von dictionarys beschleunigen.

dim arrA, arrB
dim z as long
dim dic as object
set dic = CreateOject("Scripting.Dictionary")
arrA = Range(Cells(1, 1), Cells(1, 1).End(xldown)).value
arrB = Range(Cells(1, 2), Cells(1, 2).End(xldown)).Value
for z = 1 to ubound(arrA, 1)
dic(arrA(z, 1)) = 0
Next
for z = 1 to ubound(arrB, 1))
if dic.Exists(arrB(z, 1)) then
arrB(z, 1) = "verfügbar"
else
arrB(z, 1) = "nicht verfügbar"
end if
Next
Cells(1, 3).Resize(ubound(arrB, 1), 1) = arrB
gruß Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige