Hallo,
bei mir kommt immer der Laufzeitfehler 5 bei folgender Programmierung. Wie kann ich dies beheben?
Option
Explicit
Public
Function
Günstigste()
As
String
Dim
Haefen
As
Collection
Rem min-Kosten pro hafen (wert 0 = noch nicht gefunden)
Dim
kostenBahn
As
Collection
Dim
kostenUmschlag
As
Collection
Dim
kostenSchiff
As
Collection
Dim
guenstigsteNameBahn
As
Collection
Dim
guenstigsteNameUmschlag
As
Collection
Dim
guenstigsteNameSchiff
As
Collection
Set
Haefen =
New
Collection
Set
kostenBahn =
New
Collection
Set
kostenUmschlag =
New
Collection
Set
kostenSchiff =
New
Collection
Set
guenstigsteNameBahn =
New
Collection
Set
guenstigsteNameUmschlag =
New
Collection
Set
guenstigsteNameSchiff =
New
Collection
Call
HaefenErmitteln(Haefen)
Call
KostenErmitteln(Haefen, kostenSchiff, guenstigsteNameSchiff, kostenBahn, guenstigsteNameBahn, kostenUmschlag, guenstigsteNameUmschlag)
Günstigste = GuenstigsteErmitteln(Haefen, kostenSchiff, guenstigsteNameSchiff, kostenBahn, guenstigsteNameBahn, kostenUmschlag, guenstigsteNameUmschlag)
MsgBox Günstigste
End
Function
Private
Function
HaefenErmitteln(Haefen
As
Collection)
Dim
hafenIdx
As
Integer
Dim
hafen
As
String
Dim
c
As
Object
Dim
firstAddress
As
Variant
Rem Ermitteln, von welchen Hafen Schiff zu Zielort möglich ist
With
Tabelle1.Range(
"C2:C65535"
)
Rem Zielort finden
Set
c = .Find(Tabelle2.Range(
"B2"
).Value)
If
Not
c
Is
Nothing
Then
firstAddress = c.Address
Do
Rem Zeitraum vergleichen
If
c.Offset(0, 1).Value = Tabelle2.Range(
"B3"
).Value
Then
Rem Hafennamen auslesen
hafen = c.Offset(0, -2).Value
Rem Prüfen, ob Hafenname schon mal verarbeitet
For
hafenIdx = 0
To
Haefen.Count - 1
If
Haefen.Item(hafenIdx + 1) = hafen
Then
Exit
For
End
If
Next
hafenIdx
If
hafenIdx = Haefen.Count
Then
If
Haefen.Count = 0
Then
Rem Hafen vorher noch nicht gefunden
Haefen.Add (
CStr
(hafen))
Else
If
Not
Haefen.Item(Haefen.Count) = hafen
Then
Rem Hafen vorher noch nicht gefunden
Haefen.Add (
CStr
(hafen))
End
If
End
If
End
If
End
If
Set
c = .FindNext(c)
Loop
While
Not
c
Is
Nothing
And
c.Address <> firstAddress
End
If
End
With
End
Function
Private
Function
KostenErmitteln(Haefen
As
Collection, kostenSchiff
As
Collection, guenstigsteNameSchiff
As
Collection, kostenBahn
As
Collection, guenstigsteNameBahn
As
Collection, kostenUmschlag
As
Collection, guenstigsteNameUmschlag
As
Collection)
Dim
hafenIdx
As
Integer
Dim
hafen
As
String
Dim
guenstigsteKosten
As
Integer
Dim
guenstigsteName
As
String
Dim
kosten
As
Integer
Dim
name
As
String
Dim
kostenZiel
As
Collection
Dim
guenstigsteNameZiel
As
Collection
Dim
logistikInZeile
As
String
Dim
c
As
Object
Dim
i
As
Integer
Dim
firstAddress
As
Variant
With
Tabelle1.Range(
"A2:A65535"
)
hafenIdx = 0
For
hafenIdx = 0
To
Haefen.Count - 1
hafen = Haefen(hafenIdx + 1)
Set
c = .Find(hafen)
firstAddress = c.Address
Do
logistikInZeile = c.Offset(0, 4).Value
Rem Sicherstellen, dass bei
"Schiff"
nur richtiger Zielort und Zeitraum bewertet wird
If
logistikInZeile <>
"Schiff"
Or
(logistikInZeile =
"Schiff"
And
c.Offset(0, 2).Value = Tabelle2.Range(
"B2"
).Value
And
c.Offset(0, 3).Value = Tabelle2.Range(
"B3"
).Value)
Then
Select
Case
logistikInZeile
Case
"Schiff"
Set
kostenZiel = kostenSchiff
Set
guenstigsteNameZiel = guenstigsteNameSchiff
Case
"Bahn"
Set
kostenZiel = kostenBahn
Set
guenstigsteNameZiel = guenstigsteNameBahn
Case
"Umschlag"
Set
kostenZiel = kostenUmschlag
Set
guenstigsteNameZiel = guenstigsteNameUmschlag
End
Select
i = 0
guenstigsteKosten = -1
guenstigsteName =
""
Do
While
Tabelle1.Range(
"F1"
).Offset(0, i).Value <>
""
And
Tabelle1.Range(
"F1"
).Offset(0, i).Value <>
""
name = Tabelle1.Range(
"F1"
).Offset(0, i).Value
kosten = c.Offset(0, 5 + i).Value
If
kosten <> 0
And
(guenstigsteKosten = -1
Or
kosten < guenstigsteKosten)
Then
guenstigsteName = name
guenstigsteKosten =
CInt
(kosten)
End
If
i = i + 1
Loop
If
hafenIdx = kostenZiel.Count
Then
kostenZiel.Add (guenstigsteKosten)
guenstigsteNameZiel.Add (guenstigsteName)
Else
Rem Überschreibe Wert an Stelle (nur möglich, wenn zwei gleiche Zeilen pro Hafen + Logistik)
kostenZiel(hafenIdx + 1) = guenstigsteKosten
guenstigsteNameZiel(hafenIdx + 1) = guenstigsteName
End
If
End
If
Set
c = .FindNext(c)
Loop
While
Not
c
Is
Nothing
And
c.Address <> firstAddress
Rem auffüllen, wenn etwas nicht gefunden (Schiff wird immer gefunden wg. sub HaefenErmitteln
If
hafenIdx = kostenUmschlag.Count
Then
kostenSchiff.Add (-1)
End
If
If
hafenIdx = kostenBahn.Count
Then
kostenBahn.Add (-1)
End
If
Next
hafenIdx
End
With
End
Function
Private
Function
GuenstigsteErmitteln(Haefen
As
Collection, kostenSchiff
As
Collection, guenstigsteNameSchiff
As
Collection, kostenBahn
As
Collection, guenstigsteNameBahn
As
Collection, kostenUmschlag
As
Collection, guenstigsteNameUmschlag
As
Collection)
As
String
Dim
hafenIdx
As
Integer
Dim
kosten
As
Integer
Dim
guenstigsteKosten
As
Integer
Dim
guenstigsteHafenIdx
As
Integer
hafenIdx = 0
guenstigsteKosten = -1
For
hafenIdx = 0
To
Haefen.Count - 1
Rem Ausschließen, wenn entweder keine Bahn oder kein Umschlag
If
kostenBahn(hafenIdx + 1) <> -1
And
kostenUmschlag(hafenIdx + 1) <> -1
Then
kosten = kostenSchiff(hafenIdx + 1) + kostenUmschlag(hafenIdx + 1) + kostenBahn(hafenIdx + 1)
If
guenstigsteKosten = -1
Or
kosten < guenstigsteKosten
Then
guenstigsteKosten = kosten
guenstigsteHafenIdx = hafenIdx
End
If
End
If
Next
hafenIdx
GuenstigsteErmitteln =
"Guenstigster Hafen: "
+ Haefen(guenstigsteHafenIdx + 1) +
" - Kosten: "
+
CStr
(guenstigsteKosten) +
" - Schiff: "
+ guenstigsteNameSchiff(guenstigsteHafenIdx + 1) +
" - Umschlag: "
+ guenstigsteNameUmschlag(guenstigsteHafenIdx + 1) +
" - Bahn: "
+ guenstigsteNameBahn(guenstigsteHafenIdx + 1)
End
Function