Kombination finden mit VBA + Funktion (O2016 + O365)
26.03.2025 09:09:59
MCO
Moin!
Mit Solver kenn ich mich nicht aus, daher hab ich mal den Ansatz VBA gewählt.
Lösung A
Werte werden im Direktbereich ausgegeben, kannst du in beliebige Zellen schreiben
Sub Mittelwerte()
Dim rng As Range
Dim cell As Range
Dim wert_arr() As Variant
Dim i As Integer
Dim j As Integer
' Bereich mit konstanten Werten in Spalte A auswählen
Set rng = Range("A:A").SpecialCells(xlCellTypeConstants)
' Array mit passender Größe initialisieren
ReDim wert_arr(1 To rng.Cells.Count)
' Werte aus Range in 1D-Array übertragen
i = 1
For Each cell In rng
wert_arr(i) = cell.Value
i = i + 1
Next cell
' Doppelte Schleife für Mittelwert-Berechnung
For i = 1 To UBound(wert_arr) - 1
For j = i + 1 To UBound(wert_arr)
'Debug.Print i, wert_arr(i), j, wert_arr(j), (wert_arr(i) + wert_arr(j)) / 2
m_wert = (wert_arr(i) + wert_arr(j)) / 2
e_wert = (wert_arr(i) & "+" & wert_arr(j))
If m_wert = 10 Then
'werte = werte & IIf(werte > "", ";", "") & m_wert
e_werte = e_werte & IIf(e_werte > "", ";", "") & e_wert
End If
Next j
Next i
Debug.Print werte
Debug.Print e_werte
End Sub
Lösung B
O365: Eine Funktion, die die Parameter bekommt und die Wert entsprechend ausgibt:
| - | - | - | A | B | C | D | E | F | G |
|---|
| 1 | | 5 | | | | Vorgabewert | | 10 | | | | | | |
|---|
| 2 | | 15 | | | | Führn zum Vorgabewert | | 5+15 | | 7+13 | | 8+12 | | 9+11 |
|---|
| 3 | | 7 | | | | | | | | | | | | |
|---|
| 4 | | 13 | | | | | | | | | | | | |
|---|
| 5 | | 8 | | | | | | | | | | | | |
|---|
| 6 | | 12 | | | | | | | | | | | | |
|---|
| 7 | | 9 | | | | | | | | | | | | |
|---|
| 8 | | 11 | | | | | | | | | | | | |
|---|
| 9 | | 10 | | | | | | | | | | | | |
|---|
| 10 | | 1 | | | | | | | | | | | | |
|---|
| 11 | | 2 | | | | | | | | | | | | |
|---|
| 12 | | 3 | | | | | | | | | | | | |
|---|
| 13 | | 4 | | | | | | | | | | | | |
|---|
| 14 | | 6 | | | | | | | | | | | | |
|---|
| - | A | B | C | D | E | F | G |
|---|
| 1 | | 5 | | | | Vorgabewert | | 10 | | | | | | |
|---|
| 2 | | 15 | | | | Führn zum Vorgabewert | | =Kombination(A1:A14;D1) | | | | | | |
|---|
| 3 | | 7 | | | | | | | | | | | | |
|---|
| 4 | | 13 | | | | | | | | | | | | |
|---|
| 5 | | 8 | | | | | | | | | | | | |
|---|
| 6 | | 12 | | | | | | | | | | | | |
|---|
| 7 | | 9 | | | | | | | | | | | | |
|---|
| 8 | | 11 | | | | | | | | | | | | |
|---|
| 9 | | 10 | | | | | | | | | | | | |
|---|
| 10 | | 1 | | | | | | | | | | | | |
|---|
| 11 | | 2 | | | | | | | | | | | | |
|---|
| 12 | | 3 | | | | | | | | | | | | |
|---|
| 13 | | 4 | | | | | | | | | | | | |
|---|
| 14 | | 6 | | | | | | | | | | | | |
|---|
Die Funktion dazu (mit freundlicher Unterstützung von ChatGPT)
Function Kombination(Zahlen As Range, Vorgabewert As Long) As Variant
Dim wert_arr() As Variant
Dim i As Integer, j As Integer
Dim cell As Range
Dim ergebnis As Collection
Set ergebnis = New Collection
' Array mit passender Größe initialisieren
ReDim wert_arr(1 To Zahlen.Cells.Count)
' Werte aus Range in 1D-Array übertragen
i = 1
For Each cell In Zahlen
wert_arr(i) = cell.Value
i = i + 1
Next cell
' Doppelte Schleife für Mittelwert-Berechnung
For i = 1 To UBound(wert_arr) - 1
For j = i + 1 To UBound(wert_arr)
If (wert_arr(i) + wert_arr(j)) / 2 = Vorgabewert Then
ergebnis.Add wert_arr(i) & "+" & wert_arr(j)
End If
Next j
Next i
' Rückgabe als Array
If ergebnis.Count > 0 Then
Kombination = ergebnisToArray(ergebnis)
Else
Kombination = Array() ' Leeres Array, falls keine Kombination gefunden wird
End If
End Function
' Hilfsfunktion zur Umwandlung einer Collection in ein Array
Private Function ergebnisToArray(col As Collection) As Variant
Dim arr() As Variant
Dim i As Integer
ReDim arr(1 To col.Count)
For i = 1 To col.Count
arr(i) = col.Item(i)
Next i
ergebnisToArray = arr
End Function
Lösung C
O2016
Erweiterung zu Lösung B, dabei werden die Werte in verschiedene Zellen geschrieben
Sub AusgabeKombination()
Dim komb As String
komb = Kombination(Range("A1:A10"), 10)
Dim arr() As String
Dim i As Integer
Dim ws As Worksheet
Set ws = ActiveSheet
' Ergebnis aufteilen und in Spalte C schreiben
arr = Split(komb, "; ")
For i = LBound(arr) To UBound(arr)
ws.Cells(i + 1, 3).Value = arr(i)
Next i
End Sub
Gruß, MCO