Registriert seit: 01.08.2016
Version(en): 2007
09.08.2016, 15:53
(Dieser Beitrag wurde zuletzt bearbeitet: 09.08.2016, 15:53 von Lupy.)
Hallo,
ich hätte da mal eine Kurzfrage an euch.
Ich habe eine Feld welches mit ganz normalen natürlichen Zahlen gefüllt ist. Von Index zu Index werden die Zahlen dieses Feldes ständig größer. Desweiteren habe ich mit x = beliebige Zahl, eine Zahl gegeben, die irgendwo innerhalb der Zahlen von diesem Feld liegt. Wie bestimme ich die beiden Feldindizes, die die nächste größere bzw. kleiner Zahl zu meiner gegebenen Zahl x beinhalten.
Ich suche hier selbstverständlich keine Schleifenlösung, mit der ich durch einen größer bzw. kleiner Vergleich mit der Zahl aus der Variablen x die beiden Feldindizes bestimmen könnte. Geht so etwas? Danke für eure Hilfe im voraus.
Registriert seit: 05.05.2014
Version(en): 2010 + 2016 Home and Business
Hallo,
in Deiner XL2007- Excelversion z.B. mit einer Matrixformel. Wenn Du eine Beispieldatei einstellst könne wir es auch konkreter angeben.
Gruß Werner .. , - ...
Registriert seit: 01.08.2016
Version(en): 2007
zur Verdeutlichung folgendes Beispiel:
f(1) = 10 f(2) = 19 f(3) = 26 f(4) = 35 f(5) = 44 f(6) = 51
mit z.B. x = 37 wäre der gesuchte Feldindex mit der nächsten kleineren Zahl also 4 oder dementsprechend 5 für die nächste größere Zahl.
Habe noch vergessen zu erwähnen, dass ich unbedingt eine VBA Lösung brauche. Wenn so etwas nicht geht ist auch gut.
Mir fällt dazu nichts ein, wie ich so etwas ohne Schleife bewerkstelligen könnte. Aber hier im Forum gibt es viele
Leute mit hoher Fachkompetenz.
Registriert seit: 10.04.2014
Version(en): Office 2019
09.08.2016, 16:51
(Dieser Beitrag wurde zuletzt bearbeitet: 09.08.2016, 16:54 von Jockel.)
Hallo, schau mal hier solltest du fündig werden..: http://www.herber.de/excelformeln und bitte suchen .../formeln.html?welcher=38 Hab zu spät gesehen, dass du eine VBA-Lösung suchst...
Gruß Jörg stolzes Mitglied im ----Excel-Verein Freund einer excellenten Power Query-Abfrage
Registriert seit: 05.05.2014
Version(en): 2010 + 2016 Home and Business
Hallo Lupy,
sorry, aus VBA-Lösungen halte ich mich heraus. Es findet sich hier aber garantiert jemand, der Dir weiterhilft.
Gruß Werner .. , - ...
Registriert seit: 01.08.2016
Version(en): 2007
Danke für eure Hilfe, aber ich glaube die Schleifenlösung ist doch die beste und kürzeste Lösung. (Leider! Lasse mich aber liebend gerne eines Besseren belehren.) Also so: (wobei vorausgesetzt wird, dass x immer größer oder kleiner als jeder der Feldwerte ist, aber nie gleich): Code: Sub Beispiel_Indexberechnung_für_nächste_kleiner_bzw_größere_Zahl() Dim i As Integer, x As Integer ReDim f(1 To 10)
'Beispielfeld erzeugen For i = 1 To UBound(f) f(i) = 2 * i + 5 Next
x = 14 'Nächster Feldindex der kleiner als x ist i = 1: Do While (f(i) < x): i = i + 1: Loop: i = i - 1 Debug.Print "Nächster Index bei " & i
x = 20 'Nächster Feldindex der größer als x ist i = UBound(f): Do While (f(i) > x): i = i - 1: Loop: i = i + 1 Debug.Print "Nächster Index bei " & i
End Sub
Registriert seit: 21.06.2016
Version(en): 2021
09.08.2016, 17:55
(Dieser Beitrag wurde zuletzt bearbeitet: 09.08.2016, 17:55 von Ego.)
Hallo, wenn keine einfache Schleife, dann vielleicht mit binärer suche. https://de.wikipedia.org/wiki/Bin%C3%A4re_SucheZitat:Somit liegt die binäre Suche, in der Landau-Notation ausgedrückt, in der Komplexitätsklasse O ( log n ) . Damit ist sie deutlich schneller als die lineare Suche dh. bei 1.000.000 Einträgen maximal 30 Vergleiche statt maximal 999.999 Vergleiche bei linearer suche.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Registriert seit: 01.08.2016
Version(en): 2007
Nun, die Landau-Notation und binäre Suche mögen ja eine Super-Sache sein. Die Vorschläge sind sicherlich dementsprechend den von mir hier angegeben Code weit überlegen. Doch letztendlich lautet die Frage, wie sieht diesbezüglich der VBA - Code dazu aus?!
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
Hallöchen, das könnte so aussehen. Das geht bestimmt noch zu optimieren, sollte aber erst mal laufen. Code: Sub test() 'Variablendeklarationen 'Integer Dim iMedi%, iWert%, iSel%, iMin%, iMax% 'boolean Dim lTreffer As Boolean 'Variant-Array Dim arrDat, arrEqual 'Array mit Werten fuellen. Beachte: erster Index = 0! arrDat = Array(10, 19, 26, 35, 44, 51) 'Array mit Operatoren - ist eigentlich unnuetz arrEqual = Array("<=", "=", ">=") 'Ausgangsgroessen festlegen, 'Vergleichswert und Operator iWert = 37: iSel = 2 'Grenzinizees des Arrays iMin = 0: iMax = UBound(arrDat) 'Schleife, solange kein Treffer While Not lTreffer 'Median der Indizees errechnen 'Durch Integer-Variable automatisch als Ganzzahl iMedi = (iMin + iMax) / 2 'Auswahl entsprechend Operator 'Operator 1 nicht programmiert. Select Case iSel 'lt/eq Case 0 'Wenn der Wert kleiner/gleich ist, dann If arrDat(iMedi) <= iWert Then 'min-Index setzen iMin = iMedi 'oder wenn nicht, Else 'max-Index setzen iMax = iMedi 'Ende Wenn der Wert kleiner/gleich ist, dann End If 'Wenn min und max gleich sind, dann Treffer If iMin = iMax Then lTreffer = True 'Wenn letzter Index erreicht ist, dann Treffer If iMin = UBound(arrDat) Then lTreffer = True 'Wenn beim vorletzten Index der letzte Wert groesser ist, dann Treffer If iMin = iMax - 1 And arrDat(iMax) > iWert Then lTreffer = True 'Bei treffer Meldung ausgeben If lTreffer Then MsgBox iMin & vbTab & arrDat(iMin) Case 1 'gt/eq Case 2 'Wenn der Wert groesserer/gleich ist, dann If arrDat(iMedi) >= iWert Then 'max-Index setzen iMax = iMedi 'Oder wenn nicht, Else 'min-Index setzen iMin = iMedi 'Ende Wenn der Wert groesserer/gleich ist, dann End If 'Wenn min und max gleich sind, dann Treffer If iMax = iMin Then lTreffer = True 'Wenn erster Index erreicht ist, dann Treffer If iMax = LBound(arrDat) Then lTreffer = True 'Wenn beim zweiten Index der erste Wert groesser ist, dann Treffer If iMax = iMin + 1 And arrDat(iMin) < iWert Then lTreffer = True 'Bei treffer Meldung ausgeben If lTreffer Then MsgBox iMax & vbTab & arrDat(iMax) 'Ende Auswahl entsprechend Operator End Select 'Ende Schleife, solange kein treffer Wend End Sub
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
11.08.2016, 07:27
(Dieser Beitrag wurde zuletzt bearbeitet: 11.08.2016, 07:27 von RPP63.)
Moin! Ist das zu einfach? :19: Sub RPP()
Dim f(1 To 6) As Long
Dim x As Long
Dim low As Byte, high As Byte
x = 37
f(1) = 10
f(2) = 19
f(3) = 26
f(4) = 35
f(5) = 44
f(6) = 51
low = Application.Match(x, f, 1)
high = low + 1
End Sub Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
|