Hallo,
tatsächlich ist das in VBA relativ leicht umzusetzen:
Function suchMal(zielWert As Double) As String
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim maxLines As Integer
Dim diffToTarget As Double
Application.ScreenUpdating = False
Application.Volatile
maxLines = 100
diffToTarget = 1000
suchMal = "no Result" With ActiveSheet
For i = 1 To maxLines
For j = i + 1 To maxLines
For k = j + 1 To maxLines
If (Abs(.Cells(i, 1) + .Cells(j, 1) + .Cells(k, 1) - zielWert) < diffToTarget) Then
diffToTarget = Abs(.Cells(i, 1) + .Cells(j, 1) + .Cells(k, 1) - zielWert)
suchMal = "Zeilen: " & i & ", " & j & ", " & k & "; Diff= " & Format(diffToTarget, "0.00#,###")
If (diffToTarget = 0) Then
GoTo idealMatchFound
End If
End If
Next k
Next j
Next i
End With
idealMatchFound:
Application.ScreenUpdating = True
End Function
(Irgendwie kriege ich es nicht hin, Code vernünftig einzufügen…)
Zur Frage der „optimalen“ Lösungen: Ich habe das Beispiel von lipi probiert. Ich finde drei Lösungen… Ob das immer klappt? Keine Ahnung!
Aber: Wie befürchtet ist das sehr langsam! Bei den hier „nur“ zugelassenen 100 Zeilen ca. 3 Sekunden… Bei 1000 glaube ich an 1,5 Stunden!
Zur Optimierung könnten folgende Gedanken helfen:
Messwerte vorab „verdichten“, also keine gleichen zulassen. Weiß man, wie viele Werte man verdichtet hat, kann man dann eben einen streichen. Sofern die Anzahl der Werte damit nicht deutlich geringer wird, hilft dass aber nicht.
Zusätzliches Abbruchkriterium: Sind die Werte sortiert, kann man schon abbrechen, wenn die folgenden Werte für den dritten Parameter eine größere Abweichung ergeben würden. Sofern der „Best Match“ aber erst am Ende gefunden wird, hilft das auch nichts.
Eine Frage aber noch: Was soll das? Oftmals hilft es die Aufgabe besser zu verstehen, um ggfs. andere Lösungen zu ermöglichen. Kannst du uns da noch was helfen?
fg
Drik_P