Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA - VLOOKUP beschleunigen?

Forumthread: VBA - VLOOKUP beschleunigen?

VBA - VLOOKUP beschleunigen?
22.07.2024 17:56:55
Markus
Hallo,

durch fleißiges Lesen im Forum konnte ich Neuling doch schon ein paar Ansätze in VBA erfolgreich umsetzen. Nun weiß ich grad nicht weiter und würde eure Hilfe benötigen:

in einem VBA Projekt habe ich einen Code, welcher nacheinander mehrere Tabelleblätter erstellt und diese auch umbenennt. Hier wird als Vorlage ein weiteres Tabellenblatt verwendet welches kopiert und umbenannt wird. Das klappt, vor allem dank euch, gut.

Nach jeder Erstellung eines Tabellenblattes läuft mit dem aktiven Tabellenblatt folgender Code durch um eine Art "Zwischenspeicher" aus einem anderen Blatt (MA_ZS) wieder in das aktive Tabellenblatt zu schreiben. Ich habe das mit VLOOKUP versucht, jedoch macht dieser Code so den ganzen Ablauf ziemlich träge.

Welche Möglichkeiten habe ich diesen Teil zu beschleunigen?
Mit Vlookup sollen nur Werte kopiert werden, wenn diese in der "MA_ZS"_Tabelle auch existieren. Leere Zellen in "MA_ZS" sollen übersprungen werden.
Ob das so Sinn macht hinterfrage ich gerade und ob VLOOKUP die Lösung ist auch. Ich weiß auch nicht nach was ich hier im Forum suchen könnte. Bin über Tipps sehr dankbar.



Dim zp2 As Long
Dim lzp2 As Long



With ActiveSheet
lzp2 = ActiveSheet.Range("A50").End(xlUp).Row

On Error Resume Next
For zp2 = 7 To lzp2

If Len(WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 2, False)) > 0 Then Cells(zp2, "U").Value = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 2, False)
If Len(WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 3, False)) > 0 Then Cells(zp2, "V").Value = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 3, False)
If Len(WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 4, False)) > 0 Then Cells(zp2, "W").Value = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 4, False)
If Len(WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 5, False)) > 0 Then Cells(zp2, "X").Value = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 5, False)
If Len(WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 6, False)) > 0 Then Cells(zp2, "Y").Value = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 6, False)
If Len(WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 7, False)) > 0 Then Cells(zp2, "Z").Value = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 7, False)
If Len(WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 8, False)) > 0 Then Cells(zp2, "DS").Value = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 8, False)
If Len(WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 9, False)) > 0 Then Cells(zp2, "DT").Value = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 9, False)
If Len(WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 10, False)) > 0 Then Cells(zp2, "DU").Value = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 10, False)
If Len(WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 11, False)) > 0 Then Cells(zp2, "DV").Value = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 11, False)
If Len(WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 12, False)) > 0 Then Cells(zp2, "DW").Value = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 12, False)
If Len(WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 13, False)) > 0 Then Cells(zp2, "DX").Value = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 13, False)
If Len(WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 14, False)) > 0 Then Cells(zp2, "DY").Value = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), 14, False)

Next zp2
End With


Am Anfang und am Ende des gesamten Codes sind die Werte
Application.screenupdating = False
bzw. "True" eingebaut.
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - VLOOKUP beschleunigen?
22.07.2024 19:11:07
Onur
Sollte so laufen (TESTEN kann ich ja nicht, da du keine Datei gepostet hast):

    Dim zp2, lzp2, i, VL, ii

lzp2 = ActiveSheet.Range("A50").End(xlUp).Row
On Error Resume Next
For zp2 = 7 To lzp2
For i = 2 To 14
VL = WorksheetFunction.VLookup(Cells(zp2, "B").Value, Sheets("MA_ZS").Range("A1:S500"), i, False)
ii = i + 20: If i > 6 Then ii = i + 116
If Len(VL) > 0 Then Cells(zp2, ii).Value = VL
Next i
Next zp2
Anzeige
AW: VBA - VLOOKUP beschleunigen?
23.07.2024 13:18:12
Markus
Hallo Onur,

vielen Dank für Deine Hilfe. Der Code funktioniert, jedoch hat sich zeitlich nichts geändert, da die von Yal erkannten 26 Loops pro Wert nach wie vor so bestehen bleiben. Jedoch ist Dein Code so wesentlich schöner verpackt als meine untereinander kopierten VLOOKUP's. Da sieht man, dass man mit weniger Zeilen gleich viel erreichen kann.

Grüße
Markus
Anzeige
AW: VBA - VLOOKUP beschleunigen?
23.07.2024 13:25:08
Onur
Dein Code hat die SVerweise zusätzlich verdoppelt, da du den selben SVerweis 2x in die gleiche Zeile eingebaut hast, statt ihn in eine Variable zu packen.
Bei mir sind es dadurch "nur noch" 13 Loops bzw SVerweise.
Wenn du die Datei posten und erklären würdest, was genau du mit dem Makro erreichen willst, gibt es vermutlich eine viel einfachere Lösung dafür.
Anzeige
AW: VBA - VLOOKUP beschleunigen?
22.07.2024 19:26:33
Yal
Hallo Markus,

es liegt daran, dass für genau denselben Wert 26 Lookups rechnen lässt.

Dim Z As Long

Dim Tr As Range 'Tr für Treffer
Dim i As Long
Dim Elt

On Error Resume Next
With ActiveSheet
For Z = 7 To .Range("A50").End(xlUp).Row
Set Tr = Sheets("MA_ZS").Range("A1:A500").Find(.Cells(Z, "B").Value, LookAt:=xlWhole)
If Not Tr Is Nothing Then 'Wenn was gefunden wurde
Set Tr = Tr.EntireRow
i = 3
For Each Elt In Split("U V W X Y Z DS DT DU DV DW DX DY")
If Tr.Cells(i).Value > 0 Then .Cells(Z, Elt) = Tr.Cells(i).Value
i = i + 1
Next
End If
Next
End With


VG
Yal
Anzeige
AW: VBA - VLOOKUP beschleunigen?
23.07.2024 13:25:47
Markus
Hallo Yal,

Vielen Dank für Deine Hilfe. Mit Deinem Code (kleine Anpassung, "i=2" statt "i=3") konnte ich die Berechnungen wesentlich beschleunigen und Excel benötigt weniger als 1/3 der Zeit für die gesamte Ausführung des Codes. Dies ist für mich mehr als ausreichend.
Auch bei dir sieht man gut, dass man mit wesentlich weniger Zeilen viel mehr erreichen kann.

Danke und Grüße
Markus
Anzeige
AW: VBA - VLOOKUP beschleunigen?
23.07.2024 13:58:52
Yal
Hallo Markus,

sorry, vergessen: setze
Application.ScreenUpdating = False

Application.EnableEvents = False

davor und
Application.ScreenUpdating = True

Application.EnableEvents = True

danach.
So wird noch eine Stufe schneller laufen.

VG
Yal
Anzeige
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige