Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
380to384
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
380to384
380to384
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Kombination???

Kombination???
11.02.2004 15:03:34
Oliver Barz
Guten Tag,
vorweg möchte ich sagen, daß ich die Suche Funktion nur bedingt genutzt habe, da mir leider nicht klar ist, unter welchem Begriff ich mein Problem suchen soll.
Ich habe in A1 bis A6 folgende Werte stehen. 1,2,4,8,16,32
Nun möchte ich alle Ergebnisse erhalten, die möglich sind, wenn man immer 3 dieser Werte addiert. Hoffentlich drücke ich mich verständlich aus, vielleicht ein Beispiel:
1+2+4 = 7
1+2+8 = 11
1+2+16 = 19
1+2+32 = 35
usw.
Ich möchte auch erreichen, daß die Werte miteinander addiert werden. Also z.B.
1+1+1 = 3
1+2+2 = 5
2+2+16 = 20
usw.
Alle Möglichkeiten möchte ich addiert haben. Das Ganze möchte ich dann auch mit 4 und 5 Zahlen addiert haben.
Ich habe es schon mit "Kombination" versucht, aber das war der verkehrte Weg.
Für den einen oder anderen Tip wäre ich sehr dankbar.
Oliver Barz

Ich möchte erreichen, daß mir alle Ergebnisse

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kombination???
11.02.2004 16:09:33
Dieter Klemke
Hallo Oliver,
du kannst das z.B. so machen:

Sub Kombinationen_mit_Wiederholung_Ordnung3()
Dim Anzahl As Long
Dim wsDat As Worksheet
Dim wsErg As Worksheet
Dim i1 As Long
Dim i2 As Long
Dim i3 As Long
Dim wert As Long
Dim zeileErg As Long
Dim zf As String
Set wsDat = ThisWorkbook.Worksheets(1)
Anzahl = wsDat.Cells(wsDat.Rows.Count, 1).End(xlUp).Row
Set wsErg = ThisWorkbook.Worksheets(2)
zeileErg = 1
For i1 = 1 To Anzahl
For i2 = 1 To Anzahl
For i3 = 1 To Anzahl
zf = CStr(wsDat.Cells(i1, 1)) & "+" & _
CStr(wsDat.Cells(i2, 1)) & "+" & _
CStr(wsDat.Cells(i3, 1))
wert = wsDat.Cells(i1, 1) + wsDat.Cells(i2, 1) + wsDat.Cells(i3, 1)
wsErg.Cells(zeileErg, 1) = zf
wsErg.Cells(zeileErg, 2) = wert
zeileErg = zeileErg + 1
Next i3
Next i2
Next i1
End Sub

Eine Erweiterung auf Kombinationen 4. und 5. dürfte nicht schwer fallen.
MfG
Dieter
Anzeige
AW: Kombination???
11.02.2004 20:11:29
Oliver Barz
Hallo Dieter,
danke für die schnelle Hilfe. Leider sind meine VBA Kenntnisse fast gleich null.
Ich hatte auf eine Excel gehofft. Da wir nun aber schon dabei sind...deine Antwort muß ich in ein Modul einfügen???
Gruß Olli
AW: Kombination???
11.02.2004 20:17:46
Oliver Barz
Edit:
Auf eine Excel Formel soll das natürlich heißen.
Gruß Olli
AW: Kombination???
11.02.2004 20:38:35
Dieter Klemke
Hallo Olli,
mit einer Excel-Formel kann ich leider nicht dienen.
Mein Programm fügst du in einen Modul ein (Extras | Makro | Visual Basic-Editor, dann von der Visual Basic-Editor-Oberfläche aus: Einfügen | Modul, das Programm wird in die weiße Fläche auf der rechten Seite eingefügt).
Du kannst dir einen Button in eine Excel-Tabelle einfügen (am einfachsten über Ansicht | Symbolleisten | Formular) und über diesen Button das Makro starten.
Das Ergebnis des Programms erscheint im 2. Tabellenblatt.
MfG
Dieter
Anzeige
AW: Kombination???
11.02.2004 20:55:09
Oliver Barz
Hallo Dieter,
klasse, es funktioniert. Allerdings, und ich denke ich habe mich nicht ganz korrekt ausgedrückt, soll jede Kombination nur einmal auftauchen.
Also: 1+1+2 ergibt 4. Das ist ok. Dann brauche ich aber 1+2+1 nicht mehr. Und auch 2+1+1 wird überflüssig. Am Ende soll jedes Ergebniss nur einmal vorkommen. Ist mir auch egal ob 1+1+2 oder 1+2+1 genommen wird.
Und wie sieht das Makro dann mit 4 und 5 Kombinationen aus?
Also nochmals herzlichen Dank für Deine Bemühungen.
Gruß Olli
AW: Kombination???
12.02.2004 08:57:58
Dieter Klemke
Hallo Oliver,
das war eine echte Herausforderung.
In der Kombinatorik sind Kombinationen mit Wiederholung und mit Berücksichtigung der Anordnung einfach zu liefern (s. meinen ersten Beitrag), davon gibt es jeweils n^k Stück.
Was du willst sind aber Kombinationen mit Wiederholung und ohne Berücksichtigung der Anordnung. Davon gibt es (n+k-1 über k) Stück.
Mein Ergebnis sieht so aus:

Sub Haupt()
Dim fehl As Boolean
Dim Feld() As Long
Dim GrundElem As Long
Dim Ordnung As Long
Dim spalte As Long
Dim Werte() As Long
Dim wsEin As Worksheet
Dim wsAus As Worksheet
Dim zeile As Long
Dim zf As String
' Zu kombinierende Werte aus Tabelle 1 einlesen
' (Die Werte stehen in Spalte A, lückenlos ab A1)
Set wsEin = ThisWorkbook.Worksheets(1)
GrundElem = wsEin.Cells(wsEin.Rows.Count, 1).End(xlUp).Row
ReDim Werte(1 To GrundElem)
For zeile = 1 To GrundElem
Werte(zeile) = wsEin.Cells(zeile, 1)
Next zeile
' Ordnung der zu erstellenden Kombinationen eingeben
zf = InputBox("Bitte die Ordnung eingeben (1 <= Zahl <= " & GrundElem & ")")
If zf = "" Then Exit Sub
Ordnung = CLng(zf)
If Not (1 <= Ordnung And Ordnung <= GrundElem) Then
MsgBox "Fehlerhafte Eingabe" & vbNewLine & _
"Ordnung = " & Ordnung & "  Grundelem = " & GrundElem
Exit Sub
End If
' Ausgabeblatt (Tabelle 2) vorbereiten
Set wsAus = ThisWorkbook.Worksheets(2)
wsAus.UsedRange.ClearContents
wsAus.Cells(1, 1) = "Kombinationen " & Ordnung & "-ter Ordnung von " & _
GrundElem & " Elementen, mit Wiederholung, " & _
"ohne Berücksichtigung der Anordnung"
' Kombinationen berechnen
Komb_mitWied_ohneBerück_Anord GrundElem, Ordnung, Feld(), fehl
If fehl Then
MsgBox "Bei der Berechnung ist ein Fehler aufgetreten"
Exit Sub
End If
' Kombinationen in das Ausgabeblatt schreiben
If UBound(Feld, 1) + 1 > wsAus.Rows.Count Then
MsgBox "Zuviele Zeilen: " & UBound(Feld, 1) + 1
Exit Sub
End If
If UBound(Feld, 2) > wsAus.Columns.Count Then
MsgBox "Zuviele Spalten: " & UBound(Feld, 2)
Exit Sub
End If
For zeile = 2 To UBound(Feld, 1) + 1
For spalte = 1 To UBound(Feld, 2)
wsAus.Cells(zeile, spalte) = Werte(Feld(zeile - 1, spalte))
Next spalte
Next zeile
End Sub


Sub Komb_mitWied_ohneBerück_Anord(N As Long, K As Long, Feld() As Long, Fehler As Boolean)
' Kombinationen K-ter Ordnung von N Elementen
' mit Wiederholung ohne Berücksichtigung der Anordnung
' Anzahl der Kombinationen: (N + K - 1 über K )
' Ergebnis: Die i-te Kombination steht in Feld(i, j)  [j = 1, ..., K]
'           [i = 1, ..., (N + K - 1 über K )]
Dim i As Long
Dim j As Long
Dim l As Long
Dim og1 As Long
Dim og2 As Long
Teilmengen N + K - 1, K, Feld(), Fehler
If Fehler Then Exit Sub
og1 = UBound(Feld, 1)
og2 = UBound(Feld, 2)
For i = 1 To og1
For j = 1 To og2
For l = 1 To K - 1
If Feld(i, j) = N + l Then Feld(i, j) = Feld(i, l)
Next l
Next j
Next i
End Sub


Sub Teilmengen(N As Long, K As Long, Feld() As Long, Fehler As Boolean)
' K-elementige Teilmengen einer N-elementigen Menge
' (Kombinationen K-ter Ordnung von N Elementen
' ohne Wiederholung ohne Berücksichtigung der Anordnung)
' Anzahl der Teilmengen: (N über K )
' Ergebnis: Die i-te Teilmenge steht in Feld(i, j) [j = 1, ..., K]
'           [i = 1, ..., (N  über K )]
Dim Hilfs1() As Long
Dim Hilfs2() As Long
Dim i As Long
Dim j As Long
Dim og1 As Long
Dim og2 As Long
If K > N Then
MsgBox "Fehlerhafter Aufruf" & vbNewLine & _
"N = " & N & " K = " & K
Fehler = True
Exit Sub
End If
If K = 1 Then
ReDim Feld(1 To N, 1 To 1)
For i = 1 To N
Feld(i, 1) = i
Next i
Exit Sub
End If
If K = N Then
ReDim Feld(1 To 1, 1 To K)
For i = 1 To K
Feld(1, i) = i
Next i
Exit Sub
End If
If N - 1 = 1 And K = 1 Then
ReDim Hilfs1(1 To 1, 1 To 1)
Hilfs1(1, 1) = 1
Else
Teilmengen N - 1, K, Hilfs1(), Fehler
If Fehler Then Exit Sub
End If
If N - 1 = 1 And K - 1 = 1 Then
ReDim Hilfs2(1 To 1, 1 To 1)
Hilfs2(1, 1) = 1
Else
Teilmengen N - 1, K - 1, Hilfs2(), Fehler
If Fehler Then Exit Sub
End If
og1 = UBound(Hilfs1, 1)
og2 = UBound(Hilfs2, 1)
ReDim Feld(1 To og1 + og2, 1 To K)
For i = 1 To og1
For j = 1 To K
Feld(i, j) = Hilfs1(i, j)
Next j
Next i
For i = og1 + 1 To og1 + og2
For j = 1 To K - 1
Feld(i, j) = Hilfs2(i - og1, j)
Next j
Feld(i, K) = N
Next i
End Sub

Du kopierst das Ganze in einen Modul und startest das Haupt-Programm.
Erläuterung stehen im Programm.
MfG
Dieter
Anzeige
AW: Kombination???
12.02.2004 09:52:29
Oliver Barz
Hallo Dieter,
Ich bin begeistert. Es ist perfekt.
1000 Dank für Deine Unterstützung.
Gruß Olli

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige