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

Frage zu Performance: Welche Lösung ist schneller?

Frage zu Performance: Welche Lösung ist schneller?
Martin
Hallo liebe Excel-Gemeinde,
ich habe eine Excel-Liste mit mehreren tausend Zeilen Daten (alphabetisch sortiert) und möchte diese durch den Import einer CSV-Datei ergänzen bzw. einige Werte abgleichen und aktualisieren. Dafür suche ich die schnellste VBA-Lösung. Ist es besser die "alte" Tabelle in ein Array einzulesen, den Datenabgleich in dem Array vorzunehmen und dieses anschließend in die Tabelle zu übertragen oder sollte ich den Datenabgleich direkt mit der Excel-Datentabelle vornehmen?
Für Antworten bin ich wie immer sehr dankbar!
Viele Grüße
Martin
AW: Frage zu Performance: Welche Lösung ist schneller?
11.04.2010 10:53:56
Christian
Hallo Martin,
jeder Zugriff auf die Tabelle benötigt Zeit. Der Array-Weg ist daher auf jeden Fall performanter.
Gruß
Christian
AW: Frage zu Performance: Welche Lösung ist schneller?
11.04.2010 10:59:24
Ramses
Hallo
"...Der Array-Weg ist daher auf jeden Fall performanter...."
Das würde ich so nicht gelten lassen. Es ist immer abhängig davon was du machen willst.
C## Funktonen in EXCEL nutzen, oder sinnlose VBA-Schleifen konstruieren um Datensatz für Datensatz auf Übereinstimmung abzuklappern und zu ändern ?
Da ist EXCEL auf jeden Fall, oder zumindest zu 99,9%, schneller
Gruss Rainer
AW: Frage zu Performance: Welche Lösung ist schneller?
11.04.2010 11:56:16
Christian
Hallo Rainer,
da verstehst du wohl die Frage anders als ich.
"... oder sollte ich den Datenabgleich direkt mit der Excel-Datentabelle vornehmen?"
hierzu sage, eben nicht die einzelnen Zellen abklappern, weil jeder Zugriff auf die Zellen das Teil ausbremst.
Ich bin aber mit dir d'accord, dass sinnlose Schleifen sinnlos sind.
Gruß
Christian
Anzeige
AW: Frage zu Performance: Welche Lösung ist schneller?
11.04.2010 10:54:38
Ramses
Hallo
Mach es direkt in der EXCEL Tabelle.
Da kommst du auf jeden Fall schneller zum Ziel, als dass wir hier jetzt einen Code konstruieren müssen von dem wir nicht mal ahnen können was er leisten soll.
Gruss Rainer
AW: Frage zu Performance: Welche Lösung ist schneller?
11.04.2010 11:43:21
Martin
Hallo Rainer,
vielen Dank für deine Antwort. Ich erwarte nicht, dass Ihr mir einen Code schreiben sollt. Wäre es okay für dich, wenn ich einen Code schreibe und du diesen für mich überfliegst? Ich würde eine Array-Lösung mal probieren. Dann kannst du mir anschließend sagen, was du ändern würdest?
Viele Grüße
Martin S.
AW: Frage zu Performance: Welche Lösung ist schneller?
11.04.2010 15:02:01
Ramses
Hallo
"...Wäre es okay für dich, wenn ich einen Code schreibe und du diesen für mich überfliegst?.."
Klar, anschauen kann man immer. Denn im Moment weisst nur Du allein WAS die Anforderungen zum Abgleich sind.
Gruss Rainer
Anzeige
AW: Frage zu Performance: Welche Lösung ist schneller?
11.04.2010 15:34:32
Martin
Hallo Ramses,
vielen Dank, dass du über meinen Code siehst. Ich habe im (etwas kleinen) Rahmen meiner VBA-Kentnisse mein Bestes gegeben. Bitte schau dir mal an, was du an meinem Makro ändern würdest. Ich habe es ausprobiert und es scheint zu funktionieren.
Option Explicit
Sub UpdateDatenliste()
Dim ImportFile As Variant
Dim FileRow As String, ArrFileRow As Variant
Dim i As Integer
Dim ArrDatenliste As Variant
ImportFile = Application.GetOpenFilename("Aktuelle Datenliste (*.csv; *.txt), *.csv; *.txt," _
, 1, "Importdatei auswählen...")
If ImportFile = False Then Exit Sub
'Bestandsdaten transponiert in Array übertragen
ArrDatenliste = Application.Transpose(Range("Datenliste"))
'Importdatei öffnen
Open ImportFile For Input As #1
While Not EOF(1)
'Zeilenweise Importdatei einlesen
Line Input #1, FileRow
Line Input #1, FileRow
ArrFileRow = Split(FileRow, ";")
'Suche, ob Datensatz bereits enthalten
For i = 1 To UBound(ArrDatenliste, 2)
If ArrDatenliste(1, i) = ArrFileRow(0) And ArrDatenliste(2, i) = ArrFileRow(1) And  _
ArrDatenliste(4, i) = ArrFileRow(3) Then
'Datensatz gefunden -> Daten erneuern
ArrDatenliste(3, i) = ArrFileRow(4)
ArrDatenliste(5, i) = ArrFileRow(2)
ArrDatenliste(6, i) = ArrFileRow(8)
ArrDatenliste(7, i) = ArrFileRow(9)
Exit For
End If
If i = UBound(ArrDatenliste, 2) Then
'Datensatz nicht gefunden -> Daten hinzufügen
'Array erweitern
ReDim Preserve ArrDatenliste(1 To UBound(ArrDatenliste, 1), 1 To i + 1)
ArrDatenliste(1, i + 1) = ArrFileRow(0)
ArrDatenliste(2, i + 1) = ArrFileRow(1)
ArrDatenliste(3, i + 1) = ArrFileRow(4)
ArrDatenliste(4, i + 1) = ArrFileRow(3)
ArrDatenliste(5, i + 1) = ArrFileRow(2)
ArrDatenliste(6, i + 1) = ArrFileRow(8)
ArrDatenliste(7, i + 1) = ArrFileRow(9)
Exit For
End If
Next i
Wend
Close #1
With Sheets("Datenliste")
'Array transponiert übertragen
.Cells(2, 2).Resize(UBound(ArrDatenliste, 2), UBound(ArrDatenliste, 1)) = Application. _
Transpose(ArrDatenliste)
'Zellennamen neu zuweisen
.Range(.Cells(2, 2), .Cells(UBound(ArrDatenliste, 2) + 1, 8)).Name = "Datenliste"
'Daten sortieren
.Range("Datenliste").Sort Key1:=.Range("B2"), Key2:=.Range("C2"), Order2:=xlAscending,  _
Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
End Sub
Viele Dank für deine Mühe! Ich hoffe, dass meine Gedankengänge nachvollziehbar sind und meine Kommentare ausreichen.
Viele Grüße
Martin
Anzeige
Fehler: Nur einmal "Line Input #1, FileRow"
11.04.2010 15:37:36
Martin
Hallo Ramses,
ich habe gerade festgestellt, dass ich versehentlich 2mal "Line Input #1, FileRow" verwendet habe.
Viele Grüße
Martin
AW: Frage zu Performance: Welche Lösung ist schneller?
11.04.2010 13:51:13
Daniel
Hi
das hängt natürlich davon ab, was du konkret machen willst.
es gibt Aktionen, die lassen sich schneller per Array durchführen und es gibt Aktionen, die gehen mit Formeln besser und schneller.
Vorallem, wenn deine Daten sortierte sind, kann man gut und schnell mit dem SVERWEIS bzw INDEX und VERGLEICH arbeiten (Bereich-Verweis = WAHR)
gerade bei grossen Datenmengen kann das eine gute Option sein. (schließlich ist das Array ja auch eine Kopie der Daten, die zusätzlich Speicherplatz belegt)
mittlerweile ist das bei mir in vielen Makros so, daß das Makro nur noch darin besteht, die Daten in eine günstige Reihenfolge zu sortieren und die Berechnungsformeln einzufügen. Die Hauptrechenarbeit wird dann durch die Formeln erledigt.
Das hat auch den Vorteil, daß du die Formel ohne VBA direkt in Excel entwickeln und prüfen kannst. Das ist in komplexen Makros, die sonst nur im vollständigen Lauf getestet werden können, eine grosse Erleichterung (weil z.B. die Daten nicht jedesmal neu geladen werden müssen)
Gruß, Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige