Excel soll mir was ausknobeln

Hallo Ihr da,

für einen Profi in Excel sicher kein Problem, aber ich bin blutiger Anfänger…

Ich bekomme ca. 1000 Messwerte in Spalte A, also von A1 bis A1000, jeweils mit
zwei Kommastellen. Ganz normale Zahlen halt wie z.B. 15,64.
Alle Messwerte liegen zw. 14,xx bis max. 16,xx.

Ich möchte dann in z.B. B1 den gewünschten Wert 47,00 vorgeben und Excel soll aus
allen Spalte-A-Werten durch Addition von jeweils drei Werten den „best match“ herausfinden
und mir mitteilen das ich z.B. A701 A41 und A123 als beste Näherung an den B1 Wert nehmen soll.

Danach entferne ich die gefundenen drei A-Werte und lasse wieder nach „best match“ suchen, u.s.w…

Frage an den netten Rest der WWW-Mannschaft… geht das mit Excel?

Grüße TK

Hallo,

vielen Dank an die Helfer die sich die Mühe gemacht haben
und mir helfen wollten. Ich denke der Ansatz mit dem Script
in VBA und auch die Hinweise die Anzahl der Werte zu reduzieren
wird zum Ziel führen.

Grüße Till

hi,

falls es gehen sollte wäre es aber möglich, dass dir so weitere günstige Kombinationen entwischen.

nehmen wir mal die 15 als Wert
und als Messung: 1, 2, 3, 5, 5, 5, 7, 8, 9

optimal gehen 3 mal 15, aber nicht, wenn das System falsch zusammen stellt und mit 5+5+5 beginnt.
ich würde meinen, du benötigst eine weitaus komplexere Auswertung.

grüße
lipi

Hallo,

da kommst du mit „einfachen“ Excel-Formeln nicht weiter. Hierfür musst du m.E. ein Programm in VBA schreiben.

Dafür ist auch fraglich, ob du immer 1000 Werte hast, da du die verschiedenen Kombinationen alle durchprobieren lässt vom PC in einer bzw. mehrerer Schleifen. Das kostet sehr viel Rechenzeit und -leistung.

Ich bin aber nicht so weit in der VBA-Programmierung drin. Kann dir also kein Script mal eben runterschreiben.

Vielleicht bekommst du da von fähigeren Personen Hilfe.

LG Jonas

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