Hallo Forum,
ich habe ein komisches Problem um wollte mal fragen, ob vielleicht jemand helfen kann.
Hintergrundinfo: Ich programmiere eine Hilfe zu dem PC-Spiel Elite Dangerous, die bei der Suche nach einer guten Handelsroute helfen soll. Dabei gibt es Stationen, auf denen man verschiedene Waren kaufen und auch wieder verkaufen kann. Dieser Teil des Script, vergleicht die Ein- und Verkaufspreise jedes Rohstoffs für jede Start- und Zielstation und notiert die besten Profite.
Problem: Nach dem Öffnen der Datei läuft das Script in etwa 5 Sekunden durch. Starte ich es danach noch mal, so dauert der Durchlauf schon 45 Sekunden. Beim dritten Start dann an die 4 Minuten. Es wird also bei jedem Start langsamer und ich verstehe nicht wieso. Ich vermute, es hat etwas mit den beiden Arrays zu tun. Aber die werden doch nach dem Verlassen der Sub aus dem Speicher gelöscht und beim nächsten Aufruf neu erstellt, oder?
Bin für jeden Tipp dankbar.
Gruß,
Mick
ich habe ein komisches Problem um wollte mal fragen, ob vielleicht jemand helfen kann.
Hintergrundinfo: Ich programmiere eine Hilfe zu dem PC-Spiel Elite Dangerous, die bei der Suche nach einer guten Handelsroute helfen soll. Dabei gibt es Stationen, auf denen man verschiedene Waren kaufen und auch wieder verkaufen kann. Dieser Teil des Script, vergleicht die Ein- und Verkaufspreise jedes Rohstoffs für jede Start- und Zielstation und notiert die besten Profite.
Problem: Nach dem Öffnen der Datei läuft das Script in etwa 5 Sekunden durch. Starte ich es danach noch mal, so dauert der Durchlauf schon 45 Sekunden. Beim dritten Start dann an die 4 Minuten. Es wird also bei jedem Start langsamer und ich verstehe nicht wieso. Ich vermute, es hat etwas mit den beiden Arrays zu tun. Aber die werden doch nach dem Verlassen der Sub aus dem Speicher gelöscht und beim nächsten Aufruf neu erstellt, oder?
Bin für jeden Tipp dankbar.
Gruß,
Mick
Code:
Sub Kalkulation_oneway()
'VERKAUFSPREIS = PREIS ZU DEM DIE STATION VERKAUFT
'EINKAUFSPREIS = PREIS ZU DEM DIE STATION KAUFT
'Blatt löschen und Überschriften eintragen
With Sheets(4)
.UsedRange.ClearContents
.Range("A1").Value = "Start"
.Range("B1").Value = "Ziel"
.Range("C1").Value = "Ware"
.Range("D1").Value = "Profit/t "
.Range("E1").Value = "Profit"
End With
'Ermittlung der Startwerte
Anzahl_Stationen = Sheets("Ankauf").Cells(Rows.Count, 1).End(xlUp).Row - 1
Anzahl_Rohstoffe = Sheets("Ankauf").Cells(1, 256).End(xlToLeft).Column - 1
MaxProfit = 0
Kapital = Sheets(1).Range("B1").Value
Slots = Sheets(1).Range("D1").Value
'Arrays einrichten
ReDim Einkaufspreis(Anzahl_Stationen, Anzahl_Rohstoffe) As String
ReDim Verkaufspreis(Anzahl_Stationen, Anzahl_Rohstoffe) As String
'Array Einkaufspreis füllen
For i = 1 To Anzahl_Stationen
For j = 1 To Anzahl_Rohstoffe
Einkaufspreis(i, j) = Sheets("Ankauf").Cells(i + 1, j + 1).Value
Next j
Next i
'Array Verkaufspreis füllen
For i = 1 To Anzahl_Stationen
For j = 1 To Anzahl_Rohstoffe
Verkaufspreis(i, j) = Sheets("Verkauf").Cells(i + 1, j + 1).Value
Next j
Next i
'Berechnung starten
For i = 1 To Anzahl_Stationen 'Äußerste Schleife durchläuft alle Stationen (Start)
For k = 1 To Anzahl_Stationen 'Zweite Schleife durchläuft alle Stationen (Ziel)
For j = 1 To Anzahl_Rohstoffe 'Dritte Schleife durchläuft alle Rohstoffe
'Prüfung, ob ein Verkaufspreis vorhanden ist. Wenn nicht, dann weiter zum nächsten Rohstoff
If Verkaufspreis(i, j) <> "" Then
'Prüfung, ob es einen Einkaufspreis gibt. Wenn nicht, dann weiter zum nächsten Rohstoff
If Einkaufspreis(k, j) <> "" Then
'Möglichen Einkauf berechnen unter Berücksichtigung des Kapitals und der Slots
Anzahl_Ware = WorksheetFunction.RoundDown(Kapital / Verkaufspreis(i, j), 0)
If Anzahl_Ware > Slots Then
Anzahl_Ware = Slots
End If
Profit = Anzahl_Ware * (Einkaufspreis(k, j) - Verkaufspreis(i, j))
'Prüfung, ob es schon einen besseren Rohstoffdeal gibt. Falls nicht, werden die Werte ausgelesen
If MaxProfit < Profit Then
MaxProfit = Profit
MaxRohstoff = Sheets("Ankauf").Cells(1, j + 1).Value
ProfitProT = WorksheetFunction.RoundDown(MaxProfit / Anzahl_Ware, 0)
End If
End If
End If
Next j 'Nächster Rohstoff
'Falls es einen Rohstoffdeal gibt, wird der beste nun eingetragen
If MaxProfit > 0 Then
'Neue Zeile einfügen
Sheets("Kalkulation2").Rows(2).Insert
'Werte speichern
Sheets("Kalkulation2").Range("A2").Value = Sheets("Ankauf").Cells(i + 1, 1).Value 'Start
Sheets("Kalkulation2").Range("B2").Value = Sheets("Ankauf").Cells(k + 1, 1).Value 'Ziel
Sheets("Kalkulation2").Range("C2").Value = Anzahl_Ware & "x " & MaxRohstoff 'Anzahl und Ware
Sheets("Kalkulation2").Range("D2").Value = ProfitProT 'Profit
Sheets("Kalkulation2").Range("E2").Value = MaxProfit 'Profit
End If
'Variable wieder freigeben
MaxProfit = 0
MaxRohstoff = ""
'Debug Kontrolle um den Fortschritt zu sehen:
Application.StatusBar = "Von: " & i & " nach " & k
Next k 'Nächste Zielstation
Next i 'Nächste Startstation
'Automatische Spaltenbreite
Sheets(4).UsedRange.EntireColumn.AutoFit
End Sub