Herbers Excel-Forum - das Archiv

geht´s auch schneller????

Bild

Betrifft: geht´s auch schneller????
von: Melanie

Geschrieben am: 29.12.2006 18:01:15
Hallo liebe Leute vom Forum!!!
Ich habe eine "etwas größere Tabelle" mit Materialnummern, die ich ursprünglich per S-Verweis um einige Datenfelder erweitern wollte, aber das dauerte super lange. Jetzt habe ich die ganze Geschichte mit Match-Befehlen gestaltet, aber das dauert auch super lange. Hat jemand eine Idee wie ich das noch schneller machen könnte??? Ich weiß, dass das mit dem "activate" nicht optimal ist, aber wie kann ich das umgehen - irgendwie muss ich die Felder ja ansteuern!??
Ich sag schon mal DANKE vorab.
Gruß,
Melanie
Sub Match()
Dim i As Long
Dim var As Variant
Dim material As Variant
Application.EnableEvents = False
Application.ScreenUpdating = False
On Error GoTo ERRORHANDLER
For i = 3 To 30000
If Not IsEmpty(Cells(3, 1)) Then
material = Cells(i, 1).Value
Cells(i, 1).Activate
var = Application.Match(material, Worksheets("Tabelle1").Columns(1), 0)
If Not IsError(var) Then
ActiveCell.Offset(0, 47).Value = Worksheets("Tabelle1").Cells(var, 31).Value
ActiveCell.Offset(0, 48).Value = Worksheets("Tabelle1").Cells(var, 20).Value
ActiveCell.Offset(0, 49).Value = Worksheets("Tabelle1").Cells(var, 40).Value
ActiveCell.Offset(0, 50).Value = Worksheets("Tabelle1").Cells(var, 41).Value
ActiveCell.Offset(0, 51).Value = Worksheets("Tabelle1").Cells(var, 35).Value
ActiveCell.Offset(0, 52).Value = Worksheets("Tabelle1").Cells(var, 43).Value
Else
ActiveCell.Offset(0, 47).Value = "-"
ActiveCell.Offset(0, 48).Value = "-"
ActiveCell.Offset(0, 49).Value = "-"
ActiveCell.Offset(0, 50).Value = "-"
ActiveCell.Offset(0, 51).Value = "-"
ActiveCell.Offset(0, 52).Value = "-"
End If
End If
Next i
ERRORHANDLER:
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Bild

Betrifft: AW: geht´s auch schneller????
von: Nepumuk

Geschrieben am: 29.12.2006 18:37:44
Hallo Melanie
If Not IsEmpty(Cells(3, 1)) Then

ist das richtig so, dass du immer die selbe Zelle abfragst?
Gruß
Nepumuk
Bild

Betrifft: AW: geht´s auch schneller????
von: Daniel Eisert

Geschrieben am: 29.12.2006 19:00:43
Hallo
du hast in deinem Code mehrere Bremsen drinnen:
1. Aktivieren von Zellen
unbedingt das Aktiviern von Zellen vermeiden, daß ist lahm.
Statt
Cells(x,y).acitvate
activecell.value = "xxx"

schreibt man einfacher
cells(x,y).value = "xxx"
noch besser wärs in deinem Falle, mit der With-Klammer zu arbeiten. dabei wird für das Objekt, das mit With beschrieben wird, nur noch ein Punkt gesetzt.
With cells(x,y)
.offset(0,2).value = "xxx"
.offset(0,3).value = "yyy"
end with 

2. Bremse ist die Match/VLookUp-Funktion
die ist bei grossen Datenmengen auch nicht die schnellste.
erster Schritt wäre, in
var = Application.Match(material, Worksheets("Tabelle1").Columns(1), 0)
den Zellbereich genau einzuschränken und nicht die gesamte Spalte zu nehmen.
was auch sehr starkt bremst, ist der 3. Parameter "0"
wesentlich schneller ist es, die MATCH-Funktion mit "1" bzw TRUE als 3.Parmeter zu verwenden.
Allerdings muß dann deine Datentabelle in "Tabelle1" aufsteigend sortiert sein und dir muß klar sein, daß bei nicht vorhanden Werten kein Fehler mehr ausgegeben wird, sondern der nächstpassende Wert verwendet wird.
Wenn das kein Problem ist, ist bei grossen Datenmengen der Geschwindigkeitszuwachs dramatisch (aufgrund der vorsortierung kann wesentlich effizienter gesucht werden)
das gilt gleichermaßen für MATCH und VLOOKUP.
3. Bremse ist die Schleife, mit der die Daten gefüllt werden.
besser wäre, die S-Verweisfunktion direkt als Formel in die Tabelle zu schreiben, nach unten zu kopieren und dann die Formeln durch die Werte zu ersetzen.
das kann man, wenns ne einmalige Aktion ist, auch ohne Makro recht zügig von Hand machen.
Gruß, Daniel
 Bild