Registriert seit: 18.01.2022
Version(en): 2019
Servus,
ich habe folgendes Problem und hoffe jemand kann mir dabei weiterhelfen.
Es geht um Tabellen, die mehr Zeilen als Spalten beinhalten.
Zum einfacheren Verständnis sagen wir mal eine 20 *10 Matrix.
Jetzt soll die gößtmögliche Summe aus jeweils einem Wert aus jeder Spalte gebildet werden, wobei jedoch aus jeder Zeile auch nur ein Wert vorkommen kann.
Einfaches Summieren der Spaltenmaxima ist also nicht möglich, da in einer Zeile mehrere Spaltenmaxima vorkommen könnten.
Ich hoffe ich hab es verständlich genug erklärt.
Grüße
Registriert seit: 03.04.2020
Version(en): Office 365 und 2010
Hallo,
eine ganz einfache Variante wäre diese Formel (bei einem auszuwertenden Bereich von A2:C4 - geprüft):
PHP-Code:
=SUMME(MAX(A2:A4);MAX(B2:B4);MAX(C2:C4))
Vermutlich gibt es noch kürzere Lösungen mit Index und Matrixformeln usw.
Grüße
Norbert
Registriert seit: 18.01.2022
Version(en): 2019
Das beinhaltet aber noch nicht die Bedingung, dass nur ein Wert aus einer Zeile angenommen werden darf.
Registriert seit: 21.12.2017
Version(en): MS 365 Family (6 User x 5 Geräte für jeden) Insider-Beta
19.01.2022, 00:35
(Dieser Beitrag wurde zuletzt bearbeitet: 19.01.2022, 00:56 von LCohen.)
=SUMME(NACHZEILE(A1:J20;LAMBDA(arr;MAX(arr))))
=SUMME(NACHSPALTE(A1:J20;LAMBDA(arr;MAX(arr))))
selbsterklärend, nur mit der 365 Insider Beta
Deine Limitation, dass ein zu summierender Wert sowohl in seiner Zeile wie auch seiner Spalte allein steht, funktioniert nur bei quadratischen Matrizen (also 10x10 oder 20x20, aber nicht 10x20). Deshalb folge ich Dir nicht.
0 1 0 0
1 0 0 0
0 0 0 1
0 0 1 0 wäre dann erlaubt,
0 1 0 0
1 0 0 0
0 1 0 0
0 0 1 0 nicht! (1 stellt einen zu summierenden Wert, also hier ein erlaubtes "Folgemaximum", dar)
Registriert seit: 12.04.2014
Version(en): Office 365
Moin
Wie wäre es mit einem konkreten Beispiel mit Wunschergebnis?
Wir sehen uns!
... Detlef
Meine Beiträge können Ironie oder Sarkasmus enthalten.
Registriert seit: 18.01.2022
Version(en): 2019
6 2 4
3 2 5
2 3 7
3 2 8
3 6 9
Hab mal ne 5x3 Matrix hier genommen.
Nehmen wir mal als Beispiel, wir haben 5 Personen, welche als die Zeilen dargestellt werden und wir haben 3 Tätigkeiten, welche durch die Spalten dargestellt werden.
Die Matrixeinträge stellen nun dar, wie Person X in Tätigkeit Y eine Leistung abruft und je höher die Zahl, desto besser.
Ich versuche jetzt die Kombination zu finden, wo die größtmögliche Leistung abgerufen wird, wobei eine Tätigkeit nur einmal ausgeübt wird und eine Person nur eine Tätigkeit zur gleichen Zeit ausüben kann. Daher soll nur ein Wert aus je einer Zeile und einer Spalte genommen werden.
In dem obrigen Beispiel wäre es damit: 6+6+8=20
6 2 4
3 2 5
2 3 7
3 2 8
3 6 9
Registriert seit: 16.08.2017
Version(en): 2007 / 2010 / Web
Hi
Um sicher die beste Kombi zu finden gibt es eigentlich nur die Möglichkeit alle Kombinationen zu testen.
Ob überhaupt und in welcher Zeit das Möglich ist, hängt von der Anzahl der Kombi's ab. Also wie groß ist deine Matrix denn nun.
(VBA oder Solver bieten sich hier an)
Gruß Elex
Registriert seit: 03.04.2020
Version(en): Office 365 und 2010
Hallo,
hier trage ich noch eine VBA - Lösung nach:
Code:
Sub Makro_MaxSumme()
Dim x As Long
Dim y As Long
Dim j As Long
Dim k As Long
Dim z As Long
Dim zl As Long
Dim s As Long
Dim Bereich As Range
'dieser Test läuft im der Zahlenmatrix von A2 (s. "z") bis letzte benutzte Spalte bis zur Zeile 13 (s."zl")
z = 2 'erste Zeile der Matrix - ggf. korrigieren
zl = 13 ' letzte Zeile der Matrix an die Liste anpassen
s = 1 'Spalte
k = zl + 1 'Unter der lezten Zeile werden die Max - Ergebnisse eingetragen
j = Tabelle1.Cells(z, Columns.Count).End(xlToLeft).Column
Tabelle1.Rows(z & ":" & zl).EntireRow.Hidden = False
Do Until s = j + 1
x = Tabelle1.Application.WorksheetFunction.Max(Range(Cells(z, s), Cells(zl, s)).SpecialCells(12))
Tabelle1.Cells(k, s).Value = x
For y = z To zl
Select Case True
Case Tabelle1.Cells(y, s).Value = x
Tabelle1.Rows(y).EntireRow.Hidden = True
Case Else
End Select
Next
s = s + 1
Loop
s = 1
Set Bereich = Tabelle1.Range(Cells(k, s), Cells(k, j + 1))
'die Summe = Ergebnis wird in die Zelle A15 geschrieben:
Tabelle1.Range("A15").Value = Application.WorksheetFunction.Sum(Bereich)
End Sub
Der Code durchläuft einfach jede Spalte und findet die Max - Zahl, - anschließend blendet er diese Zeile aus und durchläuft die nächste Spalte, findet wieder die Max - Zahl ohne Berücksichtigung der ausgeblendeten Zeile und blendet diese Zeile ebenfalls aus bis zur letzten benutzen oder definierten Spalte. Anschließend werden die Max - Zahlen summiert und in die gewünschte Zelle (hier "A15") eingetragen. Meine Test - Matrix im Beispiel umfasst die Zellen "A2 bis F13". Den Code habe ich getestet. Die entsprechenden Zeilen und ggf. Spalten müssen bei den Variablen auf Deine Tabelle angepasst werden, ebenso die verwendete Tabelle1.
Grüße
Norbert
Registriert seit: 21.12.2017
Version(en): MS 365 Family (6 User x 5 Geräte für jeden) Insider-Beta
20.01.2022, 12:38
(Dieser Beitrag wurde zuletzt bearbeitet: 20.01.2022, 12:45 von LCohen.)
@Norbert: Wenn Du für den ersten Treffer eine 8 hast und sich in den ausgeblendeten Zellen eine 7 verbirgt und die nächste noch zulässige Zeile/Spalte als Maximum eine 6 ausweist, bist Du nur einen denkbaren Pfad im Ergebnisraum gegangen. Die anderen Pfade bleiben versperrt.
Registriert seit: 03.04.2020
Version(en): Office 365 und 2010
Hallo LCohen,
danke, dass Du Dir die Mühe gemacht hast den von mir geposteten Code anzuschauen. - Für mich sind solche Feedbacks sehr interessant, da ich noch ein blutiger Anfänger in Sachen VBA bin. Nun habe ich mir die Vorgabe von Erikzo noch einmal genau durchgelesen und meine, dass Du vermutlich Recht hast mit Deiiner Aussage:
Zitat:Jetzt soll die gößtmögliche Summe aus jeweils einem Wert aus jeder Spalte gebildet werden, wobei jedoch aus jeder Zeile auch nur ein Wert vorkommen kann.
Der Code ermittelt zwar die jeweiligen Max - Werte aus jeder Spalte und schließt die Zeile der Ermittlung jeweils für die Ermittlung in der nächsten Spalte aus, wie es vorgegeben war, - das muss aber noch nicht heißen, dass dadurch am Ende die größtmögliche Summe gebildet wird! Hier wüßte ich auf Anhieb nicht, wie dies dann im Code umzusetzen wäre.
Danke dennoch für den Hinweis.
Grüße
Norbert