For Schleifen zu langsam, alternative?
Verfasst: So, 03.06.2012 19:50
Hallo Profis!
Folgendes Problem:
Ein Neuer und alter Katalog sollen vergleichen werden. Katalog besteht aus Artikelnummer, Artikelname, Preis.
Katalog = Tabelle. Und erhält über 30 000 Artikel.
Es ist so aufgebaut:
In Tabelle1 wird ermittelt wie viel Artikel drin sind und an diese Function übergeben. GesamtTab1.
Gleiche mit Tabelle2.
In erster For Schleife wird Artikelnummer 1 genommen und in 2ter Schleife in Tabelle2 gesucht. So bald gefunden weitere Manipulationen. Es lauft gut so lange Artikelnummern sortiert und da sind. So bald ein Artikel in Tabelle2 fehlt läuft die gesamte Tabelle2 durch und das dauert viel zu lange.
Kann man das anders lösen? Eine Schnelle Möglichkeit? Suchen Function ist nicht optimal, weil Artikelnummern müßen exakt passen. Artikel nummern sind unterschiedlicher Länge.
z.B. 1234 und der nächster 12345 und 12349 und alle mit 1234 werden gefunden. Das darf nicht sein. 1234 = 1234.
Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören
Folgendes Problem:
Ein Neuer und alter Katalog sollen vergleichen werden. Katalog besteht aus Artikelnummer, Artikelname, Preis.
Katalog = Tabelle. Und erhält über 30 000 Artikel.
Es ist so aufgebaut:
In Tabelle1 wird ermittelt wie viel Artikel drin sind und an diese Function übergeben. GesamtTab1.
Gleiche mit Tabelle2.
In erster For Schleife wird Artikelnummer 1 genommen und in 2ter Schleife in Tabelle2 gesucht. So bald gefunden weitere Manipulationen. Es lauft gut so lange Artikelnummern sortiert und da sind. So bald ein Artikel in Tabelle2 fehlt läuft die gesamte Tabelle2 durch und das dauert viel zu lange.
Kann man das anders lösen? Eine Schnelle Möglichkeit? Suchen Function ist nicht optimal, weil Artikelnummern müßen exakt passen. Artikel nummern sind unterschiedlicher Länge.
z.B. 1234 und der nächster 12345 und 12349 und alle mit 1234 werden gefunden. Das darf nicht sein. 1234 = 1234.
Code: Alles auswählen
Function Vergleichen (GesamtTab1, GesamtTab2)
TabelleNeu = thiscomponent.Sheets().getByName("Neue")
TabelleAlt = thiscomponent.Sheets().getByName("Alte")
Dim Color
Dim Ergebnis
Grosser = 0
Kleiner = 0
Gleich = 0
For i=0 To GesamtTab1 Step 1
Prefiks1 = TabelleNeu.getCellByPosition(0,i).getValue
Preis1 = TabelleNeu.getCellByPosition(2,i).getValue
For j=0 To GesamtTab2 Step 1
Prefiks2 = TabelleAlt.getCellByPosition(0,j).getValue
If Prefiks1 = Prefiks2 Then
Preis2 = TabelleAlt.getCellByPosition(2,j).getValue
If Preis1 < Preis2 Then
Color = 1832967
Kleiner = Kleiner + 1
Elseif Preis1 > Preis2 Then
Color = 16667675
Grosser = Grosser + 1
Elseif Preis1 = Preis2 Then
Color = 16251661
Gleich = Gleich + 1
Else
Color = 0
End If
TabelleVergleich = thiscomponent.Sheets().getByName("Vergleich")
TabelleVergleich.getCellByPosition(0,j).setValue(Prefiks1)
TabelleVergleich.getCellByPosition(1,j).setString(TabelleNeu.getCellByPosition(1,i).getString)
TabelleVergleich.getCellByPosition(2,j).setValue(Preis1)
TabelleVergleich.getCellByPosition(2,j).CellBackColor = Color
TabelleVergleich.getCellByPosition(3,j).setValue(Preis2)
TabelleVergleich.getCellByPosition(4,0).setValue(j)
GoTo weiter
End If
If GesamtTab2 < j Then
Preis2 = 0
TabelleVergleich = thiscomponent.Sheets().getByName("Vergleich")
TabelleVergleich.getCellByPosition(0,j).setValue(Prefiks1)
TabelleVergleich.getCellByPosition(1,j).setString(TabelleNeu.getCellByPosition(1,i).getString)
TabelleVergleich.getCellByPosition(2,j).setValue(Preis1)
TabelleVergleich.getCellByPosition(2,j).CellBackColor = Color
TabelleVergleich.getCellByPosition(3,j).setValue(Preis2)
GoTo weiter
End If
Next j
weiter:
Next i
If Kleiner > Grosser AND Kleiner > Gleich Then
Ergebnis = "Billiger"
Elseif Grosser > Kleiner AND Grosser > Gleich Then
Ergebnis = "Teuerer"
Elseif Gleich > Kleiner AND Gleich > Grosser Then
Ergebnis = "Gleich"
Else
Ergebnis = "Unverstaendlich"
End If
Ausgabe = "Ergebnis: " & Ergebnis & CHR$(10)
Ausgabe = Ausgabe & "Kleiner: " & Kleiner & CHR$(10)
Ausgabe = Ausgabe & "Grosser: " & Grosser & CHR$(10)
Ausgabe = Ausgabe & "Gleich: " & Gleich & CHR$(10)
MsgBox Ausgabe
End Function
Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören