Frage

Ich habe eine 2 variable 100x100 Datentabelle in Excel.

Ich brauche eine Funktion zu haben, die alle möglichen Sätze von Variablen gibt, die einen bestimmten Zielwert ergeben. Was ich bin auf der Suche ist eine Art von reursive 2-dimensionalen Lookup-Funktion. Kann jemand mich in die richtige Richtung?

War es hilfreich?

Lösung

Es kann ohne VBA, ziemlich kompakt gemacht werden, wie so.

Angenommen, Ihre 100x100 Tabelle ist in B2: CW101, und wir hatten eine Liste von Nummern 1 bis 100 nach unten links von A2 bis A101, und wieder 1 bis 100 über die Oberseite von B1 bis CW1

Erstellen

eine Spalte von Zellen unter, beginnend (sagen wir) in B104

 B104=MAX(($A$2:$A$101*100+$B$1:$CW$1<B103)*($B$2:$CW$101=TargetValue)*($A$2:$A$101*100+$B$1:$CW$1))

Dies ist eine "Array" Formel, so drücken Sie Ctrl-Shift-Enter statt eingeben und geschweiften Klammern {} um die Formel angezeigt werden soll.

Kopieren Sie dann für so viele Zeilen nach unten, wie Sie benötigen. Sie müssen auch eine große Zahl über Ihre erste Formel bringen, in B103, dh, zB 999999.

Was die Formel tut, ist Rowx100 + Säule, sondern nur für jede erfolgreiche Zelle, und die MAX-Funktion findet das größte Ergebnis, ohne alle vorherigen Ergebnisse zu berechnen, dh es das Ziel führt eine zu einer Zeit findet, von unten nach oben Recht und Aufarbeiten nach links oben. (Mit einem wenig Aufwand man konnte es in die andere Richtung zu suchen, erhalten).

Dies wird Ihnen Ergebnisse wie 9922, die Zeile 99, Spalte 22, und Sie können leicht diese Werte aus der Zahl extrahieren.

Hoffe, dass dies Sinn macht.

Andere Tipps

Es gibt keine integrierte Funktion, die das tun, was Sie wollen, ich bin 99% sicher.

Eine VBA-Funktion, die ein Array zurückgibt könnte gebaut werden, entlang der Linien des schnellen und unsauberen Sub bereits gezeigt. Erstellen Sie eine Variante um die Ausgabe zu halten, vielleicht auf die maximal mögliche Anzahl von Ergebnissen Redimmed und Redim Konserve-d am Ende der eigentlichen Nummer. Dann kehrt, dass als Ergebnis der Funktion, die dann als Array-Funktion aufgerufen werden muss (Strg-Umschalt-Enter).

Ein Nachteil davon ist, dass Sie sicherstellen müssen, dass der Zielbereich war groß genug, das ganze Ergebnis zu halten. Excel wird die automatisch nicht tun

Ich habe versucht, dies viel ohne VBA aber scheint nicht möglich zu sein, ohne es. Um dieses Problem zu lösen, musste ich eine Schleife durch das gesamte Feld und am nächsten Wert gefunden. Diese Werte wurden dann derefernced mit Anrufen und Bereich Eigenschaften und der Ausgang wurde in einem Bereich erzeugt bei jedem gültigen Spiel erhöht wird.

Die schnelle und schmutzige Implementierung ist wie unter:

Dim arr As Range
Dim tempval As Range
Dim op As Integer

Set arr = Worksheets("sheet1").Range("b2:ao41")
op = 1
Range("B53:D153").ClearContents





For Each tempval In arr
If Round(tempval.Value, 0) = Round(Range("b50").Value, 0) Then

Range("b52").Offset(op, 0).Value = Range("a" & tempval.Row).Value
Range("b52").Offset(op, 1).Value = Cells(tempval.Column, 1).Value
Range("b52").Offset(op, 2).Value = tempval.Value
op = op + 1

End If

Next
Range("b50").Select

Ich bin noch auf der Suche nach einem Ansatz ohne VBA.

Ich habe eine Lösung erhielt, die nicht VBA nicht verwendet, aber es ist ziemlich chaotisch. Es geht um eine weitere eindimensionale Tabelle in Excel erstellen und Lookups auf das zu tun. Für eine 100x100 Datentabelle würde die neue Tabelle 10.000 Zeilen benötigen.

Entschuldigt, wenn dies nicht Ihren Bedürfnissen passt.

Eine Zusammenfassung ist unter - lassen Sie mich wissen, wenn Sie mehr Details benötigen. N = die Dimension der Daten, z.B. 100 in Ihrem Beispiel.

Erstellen Sie zunächst eine neue Tabelle mit fünf Spalten und Reihen NxN. In jedem Fall ersetzt meine Spaltennamen mit der entsprechenden Excel-Referenz

Die erste Spalte (nennen wir es INDEX) enthält lediglich eine Liste 1, 2 ... NxN.

Die zweite Spalte (datarow) enthält eine Formel Schleife durch 1, 2 ... N, 1, 2 ... N ... Dies kann getan werden, so etwas wie = MOD (INDEX-1, N) unter Verwendung + 1

Die dritte Spalte (DATACOL) enthält, 1, 1, 1 ... 2, 2, 2 ... (N-mal pro Stück). Dies kann mit = INT ((INDEX-1) / N) + 1

erfolgen

Die vierte Spalte (VALUE) enthält den Wert aus der Datentabelle, mit so etwas wie: = OFFSET ($ A $ 1, datarow, DATACOL), Ihre Datentabelle auf $ A $ 1 beginnt unter der Annahme,

Wir haben nun bekam eine eindimensionale Tabelle hält alle Ihre Daten.

Die fünfte Spalte (VERWEIS) enthält die Formel: MATCH = (Ziel, OFFSET (Valuerange, [lookup-1], 0), 0) + [lookup-1]

wobei [lookup-1] auf die Zelle bezieht sich unmittelbar oberhalb (beispielsweise in der Zelle F4 bezieht sich dies auf F3). Sie werden in der Nachschlagespalte a 0 über der ersten Zelle benötigen.

Valuerange sollte ein festes (benannt oder mit $ Zeichen) Verweis auf die gesamte Spalte WERT werden.

Die Nachschlagespalte hält dann INDEX Zahlen, die verwendet werden können, datarow und DATACOL nachzuschlagen, um die Position des Spiels in den Daten zu finden.

Dies funktioniert für die Spiele in Valuerange durch die Suche, dann nach Übereinstimmungen in einem eingestellten Bereich Start der Suche nach dem vorherigen Spiel.

Es ist viel einfacher in einer Tabelle dann über die Erklärung oben, aber das ist das Beste, was ich im Moment tun kann ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top