Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Feldindizes bestimmen, welche die nächste kleinere bzw. größere Zahl beinhalten
#1
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.
Antworten Top
#2
Hallo,

in Deiner XL2007- Excelversion z.B. mit einer Matrixformel. Wenn Du eine Beispieldatei einstellst könne wir es auch konkreter angeben.
Gruß Werner
.. , - ...
Antworten Top
#3
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.
Antworten Top
#4
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
ich muss mich erst wieder ganz langsam heran robben. Also bitte ich um Nachsicht

"Wer immer tut, was er schon kann, bleibt immer das, was er schon ist." - Henry Ford
Antworten Top
#5
Hallo Lupy,

 sorry, aus VBA-Lösungen halte ich mich heraus. Es findet sich hier aber garantiert jemand, der Dir weiterhilft.
Gruß Werner
.. , - ...
Antworten Top
#6
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
Antworten Top
#7
Hallo,

wenn keine einfache Schleife, dann vielleicht mit binärer suche.

https://de.wikipedia.org/wiki/Bin%C3%A4re_Suche


Zitat: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.





Antworten Top
#8
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?!
Antworten Top
#9
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)
Antworten Top
#10
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)
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste