Hallo,
ich will eine kleine Versandskostenkalkulation schreiben. Im Prinzip gebe ich Höhe, Länge, Breite und das Gewicht ein und er ermittelt mir für verschiedene Versandsdienste den billigsten Versender. Ich habe die Liste so formatiert, dass der Preis aufsteigt.
Da ich nicht mehr weiter kam mit endlosen Wenn verschachtelungen habe ich mir gestern mal VBA angeschaut. Ich kann relativ gut C programmieren, habe aber noch keine Zeile VBA/Basic geschrieben.
1. Frage. Ich möchte das in eine Funktion schreiben. D.h. es wird dann in Excel aufgerufen. Der Rückgabewert soll dann in der Zelle stehen UND in den Nachbarzellen.
D.h. ich hätte gerde in Zelle A1 =CALCVERSAND(120;20;30;2500) Und dann soll in A1 -> Paket23 stehen in A2 -> der Preis in A3 die Länge oder ähnlich. Das habe ich leider nicht mit google rausbekommen.
2. Frage Ich laufe mit meinen Kenngrößen einfach in einer For Schleife alle Werte durch, bis ich einen gefunden habe der passt. Ist das okay so? Nach effizienten Programmieren sieht das irgendwie nicht aus :-) Auch das einlesen der Tabelle macht der ja JEDES mal wenn die Funktion aktualiesiert wird. Hier hätte ich gerne mal eure einschätzung
3. Wie würdet ihr eine komplett unsortierte Liste durchlaufen? Ich würde alle Elemente durchlaufen und die Speichern, welche funktionieren. Dann würde ich in den gefundenen Elementen die mit niedrigstem Preis nehmen.
Ich bin auf eure Antworten gespannt. (wie gesagt blutiger Anfänger, hauts mir um die Ohren) :-)
Achja was ich sehr irritierend finde ist, dass der Index von X bei 1 startet, der Index von categorys aber bei 0. Kann mir das einer erklären? Ich kenne Programmiersprachen mit start bei 0 und bei 1 aber nicht gemischt ....
Function CALCVERSAND(length, hight, width, weight)
Dim side1, side2, side3, i, counter As Integer
Dim X As Variant
Dim categorys(), types() As String
Dim Debug1, Debug2, Debug3 As Variant
X = Worksheets("Versands Kosten").Range("A14:I54")
'MsgBox X(UBound(X, 1), UBound(X, 2))
'MsgBox UBound(X, 1) ' 41 Zeilen
'MsgBox UBound(X, 2) ' 9 Spalten
'Find all categorys
counter = 0
ReDim categorys(0)
categorys(0) = CStr(X(1, 1))
For i = LBound(X, 1) To UBound(X, 1)
If CStr(X(i, 1)) <> categorys(counter) Then
ReDim Preserve categorys(counter + 1)
categorys(counter + 1) = X(i, 1)
counter = counter + 1
End If
Next
'Find all types
counter = 0
i = 0
ReDim types(0)
types(0) = CStr(X(1, 2))
For i = LBound(X, 1) To UBound(X, 1)
If CStr(X(i, 2)) <> types(counter) Then
ReDim Preserve types(counter + 1)
types(counter + 1) = X(i, 2)
counter = counter + 1
End If
Next
side1 = Application.Max(length, hight, width)
side2 = Application.Median(length, hight, width)
side3 = Application.Min(length, hight, width)
i = 0
For i = LBound(X, 1) To UBound(X, 1)
If side1 <= X(i, 3) And side2 <= X(i, 4) And side3 <= X(i, 5) And weight <= (X(i, 6) + X(i, 7)) Then
Debug1 = X(i, 3)
Debug2 = X(i, 4)
Debug3 = X(i, 7)
'MsgBox ("Habe was gefunden: " & X(i, 2))
Exit For
End If
Next
'Application.Caller.Address.Offset(0, 1) = 1
'ActiveCell.Value = "Eine Zelle"
CALCVERSAND = X(i, 2)
'Call Einlesen
End Function
|