Thema Datum  Von Nutzer Rating
Antwort
24.10.2018 12:54:03 Thorsten
NotSolved
24.10.2018 12:58:59 Gast33805
NotSolved
24.10.2018 18:18:40 Thorsten
NotSolved
24.10.2018 18:35:09 Gast65695
NotSolved
24.10.2018 18:46:03 Thorsten
NotSolved
24.10.2018 13:01:14 Gast91579
NotSolved
24.10.2018 18:19:50 Thorsten
NotSolved
24.10.2018 13:22:42 Gast36166
NotSolved
24.10.2018 18:25:10 Thorsten
NotSolved
24.10.2018 18:25:15 Thorsten
NotSolved
24.10.2018 18:48:00 Gast67887
NotSolved
24.10.2018 19:22:54 Gast89641
NotSolved
24.10.2018 19:25:30 Thorsten
NotSolved
24.10.2018 21:56:06 Jedi
NotSolved
Rot Mehrere Rückgabewerte
26.10.2018 00:39:33 Ulrich
NotSolved
03.11.2018 11:32:00 Thorsten
NotSolved

Ansicht des Beitrags:
Von:
Ulrich
Datum:
26.10.2018 00:39:33
Views:
591
Rating: Antwort:
  Ja
Thema:
Mehrere Rückgabewerte

Hallo,

sorry, ich habe mir jetzt nicht den ganzen Thread durchgelesen... wenns nicht passt, dann schreibt es einfach.

 

Zu 1.

Also, ich bin auch nicht so der Profi, der ganz genau weiß, wann wie oft welche Tabellenblattfunktionen berechnet werden.

Deswegen probiere ich so etwas immer aus. Man kann aber selbstverständlich wie bei Matrixformeln auch Arrays an ein Tabellenblatt zurückgeben.

Hier zwei Beispiele

Function udf_Array_Zeile(a As Variant) As Variant
MsgBox "die Funktion udf_Array_Zeile wird gerade durchlaufen"
udf_Array_Zeile = Array(1, 2, "hallo")
End Function

Function udf_Array_Spalte(a As Variant) As Variant
MsgBox "die Funktion udf_Array_Spalte wird gerade durchlaufen"
udf_Array_Spalte = Application.Transpose(Array(1, 2, "hallo"))
End Function

Jetzt kannst du einfach die Zellen A1:A3 markieren und =udf_Array_Spalte(B1) eingeben und die Eingabe mit Strg+Shift+Enter beenden (Matrixformel!). Immer wenn die Funktion berechnet wird, wird eine MsgBox angezeigt => du erkennst, dass die Funktion nur ein mal durchlaufen wird, um alle drei Werte ins Tabellenblatt einzutragen. Das lässt sich mit 2d-Arrays auf beliebig große, rechteckige Bereiche erweitern.

 

Zu 2.

"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"

Dadurch, dass du deine Daten direkt mit einem Schlag in ein Array einließt

 X = Worksheets("Versands Kosten").Range("A14:I54")

und dann nicht mehr auf das Tabellenblatt zugreifst, hast du bereits den größten Zeitfresser (den Zellzugriff) minimiert. Das ist schon mal sehr gut! Ich habe es jetzt nicht ausprobiert, doch dass du deine Datenfelder innerhalb der Schleife ständig neu dimensionierst
(Redim Preserve ...)
ist, wenn ich es richtig in Erinnerung habe, ein  Zeitfresser (geringer als der Tabellenblattzugriff), den du leicht umgehen könntest, indem du vorher (evtl. zu groß) dimensionierst (zum Beispiel auf 0 to ubound(x,1)-1). Wenn es dir dann wichtig ist, dass die Größe passt, kannst du nachher mit einem einmaligen Redim Preserve dein Datenfeld auf die richtige Länge stutzen - auch das in der Regel nicht wirklich notwendig.
Aber so, wie dein Code im Augenblick aufgebaut ist, benötigst du die beiden Felder ja überhaupt nicht - weißt du aber wahrscheinlich selbst.

Noch was zur Geschwindigkeit: ich halte das alles bei 40 Zeilen für völlig irrelevant.

Zu 3.

"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"

Das widerspricht ein bisschen deinem Code, denn dein Code basiert darauf, dass die Liste sortiert ist.
Also, um alle verwendeten Kategorien in einer unsortierten Liste zu erfassen würde ich eine collection
https://excelmacromastery.com/excel-vba-collections/
benutzen. Eine Schleife über alle Werte machen:

Sub bspl()
Dim X As Variant
Dim categorys As Collection
Dim i As Long

X = Range("A1:A100").Value

Set categorys = New Collection
On Error Resume Next     ' Es treten Fehler auf, wenn eine Kategorie mehrmals vorkommt
For i = 1 To UBound(X, 1)
    categorys.Add CStr(X(i, 1)), CStr(X(i, 1))
Next
Err.Clear
On Error GoTo 0         ' Fehler wieder normal behandeln

msgbox categorys.Count & "   " & categorys.Item(1)

End Sub

 

 

"Achja was ich sehr irritierend finde ist, dass der Index von X bei 1 startet, der Index von categorys aber bei 0"
Das finde ich auch irritierend, ist aber so, bzw. bei deinem Array kannst du die Grenzen mit dim oder redim frei festlegen:

dim myArray(-5 to 5) as String

Leider haben manche "Dinge" 0 als Basis und manche 1. Hier ist es wirklich gemischt. Du kannst auch nach "Option Base" googeln.

 

 

Was mir noch auffällt:

Dim side1, side2, side3, i, counter As Integer

In dieser Zeile werden alle Variablen als Variant deklariert, außer counter. Variant ist einfach der Default-Typ in VBA. Was du willst geht so:

Dim side1 As Integer, side2 As Integer, side3 As Integer, i As Integer, counter As Integer

analoges gilt natürlich auch für die anderen Dim Anweisungen.

 

Grüße, Ulrich


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
24.10.2018 12:54:03 Thorsten
NotSolved
24.10.2018 12:58:59 Gast33805
NotSolved
24.10.2018 18:18:40 Thorsten
NotSolved
24.10.2018 18:35:09 Gast65695
NotSolved
24.10.2018 18:46:03 Thorsten
NotSolved
24.10.2018 13:01:14 Gast91579
NotSolved
24.10.2018 18:19:50 Thorsten
NotSolved
24.10.2018 13:22:42 Gast36166
NotSolved
24.10.2018 18:25:10 Thorsten
NotSolved
24.10.2018 18:25:15 Thorsten
NotSolved
24.10.2018 18:48:00 Gast67887
NotSolved
24.10.2018 19:22:54 Gast89641
NotSolved
24.10.2018 19:25:30 Thorsten
NotSolved
24.10.2018 21:56:06 Jedi
NotSolved
Rot Mehrere Rückgabewerte
26.10.2018 00:39:33 Ulrich
NotSolved
03.11.2018 11:32:00 Thorsten
NotSolved