Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1656to1660
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
Range Find Methode VBA
19.11.2018 00:34:06
SteinApfel
Könnte mir jemand diese Methode näher erklären?
Bezogen auf:
https://docs.microsoft.com/de-de/office/vba/api/Excel.Range.Find#example
Mein Bsp:
A B C
1 0 9 3
2 2 7
3 4 5
4 6 3
5 8 1
Gesuchter Wert ist C1, also 3.
Meine Bezugstabelle ist A1 bis A5, dort soll die Zahl 3 gefunden werden, bzw. einmal der kleinere Wert und einmal der nächst größere Wert. Ausgegeben werden soll die Zellennummer, also in diesem Fall 2 (nächst kleinere) und 3 (nächst größere). Es soll nicht in Spalte B suchen!
Dim Wert As Double
Wert = Tabelle1.Range("C1").Value
Dim j As Integer
j = Tabelle1.Cells.Find(Wert, LookIn:=xlValues, lookat:=xlPart, searchdirection:=xlNext).Row
--- j = 2
j = Tabelle1.Cells.Find(Wert, LookIn:=xlValues, lookat:=xlPart, searchdirection:=xlPrevious).Row
--- j = 4 Was nicht passieren soll!
Wenn ich aber statt Cells einen Bereich (Range("A1:A5") angebe, erscheint ein Laufzeitfehler 91.
Ich kann es mir nicht erklären...
Vielen Dank für Eure Bemühungen!
Beste Grüße
Hendrik

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Range Find Methode VBA
19.11.2018 06:50:33
MCO
Sorry, ich bau es nicht nach.
Als wennn das Hochladen von Tabellen schwieriger wäre als eine Textbeschreibung...
Gruß, MCO
AW: Range Find Methode VBA
19.11.2018 09:36:51
Daniel
Hi
.Find gibt dir immer die erste Fundstelle eines Wertes zurück, bezogen auf die Suchreihenfolge.
mit Searchdirection:=xlnext werden die Zellen von links nach rechts und von oben nach unten durchsucht.
mit Searchdirection.=xlprevious werden die Zellen von rechts nach links und von unten nach oben durchsucht (umgekehrte Suchreihenfolge).
mit .Cells.Find werden alle Zellen auf dem Tabellenblatt durchsucht.
mit .Range("A1:A5").Find wird nur der Zellbereich A1:A5 durchsucht.
mit diesem Wissen sollest du dir deine Frage eigentlich selbst beantworten können
in deinem ersten Beispiel ist die Zelle D2 die erste Fundstelle, weil der gesamte Zellbereich von links nach rechts und von oben nach unten.
in deinem zweiten Beispiel ist die Zelle B4 die erste Funstelle, aufgrund der umgekehrten Suchreihenfolge.
in deinem Dritten Beispiel bekommst du den Fehlerabbruch, weil der gesuchte Wert (5) nicht im durchsuchten Bereich vorhanden ist.
im übrigen möchte mich mich der Anmerkung von Matthias anschließen.
Es ist schon seltsam, wenn die Datei in der Beschreibung nicht mit der Beispieldatei übereinstimmt.
Da fragt man sich dann schon, was im Kopf des Fragestellers so vorgeht und was er sich dabei denkt, wenn er sowas macht.
Gruß Daniel
Anzeige
AW: Range Find Methode VBA
19.11.2018 11:15:59
SteinApfel
Das habe ich dann unter:
https://docs.microsoft.com/de-de/office/vba/api/excel.xlsearchdirection
wohl falsch verstanden. Nach deren Erklärung dachte ich an xlNext = nächst höheren Wert und xlPrevious = nächst kleineren Wert.
Aber das Problem mit dem Laufzeitfehler wenn ich Range("A1:A6").find(...) eingebe bleibt nach wie vor, mit Cells führt Excel es aus, aber nicht wie ich möchte...
AW: Range Find Methode VBA
19.11.2018 11:33:33
Daniel
die Erklärung ist dort doch ziemlich gut und passend.
Gruß Daniel
AW: Range Find Methode VBA
19.11.2018 11:37:33
SteinApfel
Löst aber weiterhin mein Problem mit Range und Cells nicht. Da habe ich das Problem und das wird nicht ausreichend für mich erklärt.
Daher rührt auch meine Fragestellung hier.
Anzeige
AW: Range Find Methode VBA
19.11.2018 11:44:39
Daniel
wie ich schon schrieb:
mit Cells.Find durchsucht du alle Zellen
mit Range("a1:A5") nur die Zellen A1:A5
wenn du nicht sicher bist ob der gesuchte Wert im durchsuchten Bereich vorkommt, musst du das vorher prüfen:
If Worksheetfunction.CountIf(Range("A1:A5"), Wert) > 0 Then
j = Range("A1:A5").Find(what:=Wert, ...).Row
End if 
oder erstmal die Fundstelle einer Range-Variable zuweisen und dann prüfen , ob der Wert gefunden wurde:
dim rng as range
set rng = Range("A1:A5").Find(what:=Wert, ...)
if not rng is Nothing then j = rng.Row
Gruß Daniel
Anzeige
sehr abwechslungsreich ...
19.11.2018 09:21:10
Matthias
Hallo
In der Frage:
Wert = Tabelle1.Range("C1").Value
In der Datei:
Wert = Tabelle1.Range("Wert").Value
wobei Range("Wert") die Zelle D2 ist.
Immer wieder fragwürdig, warum man potentielle Helfer falsch informiert :-(
Gruß Matthias
AW: sehr abwechslungsreich ...
19.11.2018 11:12:04
SteinApfel
Es sind keine falschen Informationen, es ist das gleiche Problem bzw die gleiche Frage nur mit anderen Werten.
Für "Wert" müsste ich mehr erklären, welche Zelle "Wert" ist etc. als einfach "D2", da weiß jeder was gemeint ist.
Wirklich voneinander abweichen tun die beiden Beispiele nicht.
Falsche Informationen
19.11.2018 11:53:20
Daniel
doch da sind viele falsche Informationen drin.
Allein schon in deiner Beschreibung, ohne dass man die nachgereichte Beispieldatei betrachtet.
bespielsweise schreibst du:
"Gesuchter Wert ist C1, also 3."
allerdings steht deiner Beschreibung nach in C1 die 9 und die 3 allenfalls in D1:
Mein Bsp:
A B C
1 0 9 3
und der Rest, den du schreibst, passt dann auch nicht zueinander.
Bespielsweise bekomme ich mit deinen Daten für
"Wenn ich aber statt Cells einen Bereich (Range("A1:A5") angebe, erscheint ein Laufzeitfehler 91."
keinen Laufzeitfehler 91, sondern das Ergebnis j = 3, weil der Wert 3 in der Zelle A3 gefunden wird.
wie du siehst, schon deine Beschreibung allein steckt voller falscher Informationen, und dass dann deine Beispieldatei nicht zu deiner Beschreibung passt, macht die Sache nicht besser.
Gruß Daniel
Anzeige
AW: Falsche Informationen
19.11.2018 12:07:12
SteinApfel
Das liegt an der Homepage, da ich mit Leerzeichen gearbeitet habe und eine Tabelle darstellen wollte, linke Reihe Zeilen (1 bis ....), obere Reihe Spalten (A bis ...) und dann die Werte zuordnen. Dann passt es mit C1 etc. (Wusste nicht, dass die Formatierung dann so umgehauen wird, wollte nur eine Tabelle abbilden)
Langsam komme ich aber hinter den Fehler... anscheinend muss der Wert der gesucht wird auch EXAKT übereinstimmen und darf nicht der aufgerundete oder nächst höhere Wert sein bzw. auch nicht der abgerundete oder nächst kleinere Wert sein.
Da 3 nicht in der Zahlenfolge 0, 2, 4, 6, 8 vorkommt, wollte ich die Zeile mit 2 und mit 4 herausfinden um anschließend zu interpolieren.
Da der Code für die Interpolationsformel recht kompliziert ist (zumindest für mich, da ich auch wenig Befehle in VBA kenne). Und Codes von anderen müsste man mir erklären, da ich dort ebenfalls nicht durchblicke...
Anzeige
AW: Falsche Informationen
19.11.2018 12:20:42
Daniel
Hi
.FIND findet immer nur exakte Übereinstimmung, allerdings können bei TEXT-Suche auch Joker verwendet werden.
was du brauchst kannst du nur mit der Funktion VERGLEICH erreichen (in VBA dann bei Bedarf mit APPLICATION.MATCH), in der Variante mit 3. Paramter = 1
allerdings gelten hier ein paar Bedingungen, die du einhalten musst:
1. durchsucht werden kann immer nur ein Zellbereich, der aus einer Zeile oder eine Spalte besteht, aber kein rechteckiger Zellbereich mit mehreren Zeilen und mehreren Spalten.
2. die Werte müssen innherhalb des Zellbereichs aufsteigend sortiert sein.
3. Besteht keine exakte Übereinstimmung, wird als Ergebnis der nächstkleinere Wert als Ergebnis verwendet.
4. das Ergebnis von VERGLEICH/MATCH ist nicht die absolute Zeilennummer der Fundzelle, sondern die Position innerhalb des durchsuchten Bereichs (nur wenn der durchsuchte Bereich in Zeile/Spalte 1 beginnt, sind Positionsnummer und Zeilennummer gleich)
5. suchst du den nächstgrößeren Wert, musst du zum Ergbnis noch 1 hinzuaddieren um den Wert aus der folgenden Zeile/Spalte zu bekommen.
Gruß Daniel
Anzeige
AW: Falsche Informationen
19.11.2018 12:48:47
SteinApfel
Das klingt super, ich habe gerade zwar nicht die Möglichkeit es auszutesten, aber zu morgen werden ich es definitiv machen.
Vielen Dank für die Hilfe!
Und entschuldigt bitte das Chaos, ich werde nächstes mal besser darauf achten und direkt eine Datei mit anheften.
Beste Grüße und einen angenehmen Tag noch. :)
Hendrik
AW: Falsche Informationen
20.11.2018 13:50:56
SteinApfel
Du hast mich damit echt gerettet :D
Es funktioniert super! Danke für deine Erklärung, bin Punkt für Punkt abgegangen (vorher die Funktion auch noch durchgelesen) und es klappt endlich :)
Mein Code:
Public Sub Test()
Dim Wert As Double
Wert = Tabelle1.Range("Wert").Value
Dim Var1 As Integer
Dim Var2 As Integer
Dim Liste1 As Range
Set Liste1 = Tabelle1.Range("A1:A5")
Var1 = Application.WorksheetFunction.Match(Wert, Liste1, 1)
Var2 = Var1 + 1
Dim X1 As Double
Dim X2 As Double
Dim Y1 As Double
Dim Y2 As Double
Dim IntWert As Double
X1 = Cells(Var1, 1)
X2 = Cells(Var2, 1)
Y1 = Cells(Var1, 2)
Y2 = Cells(Var2, 2)
IntWert = Y1 + ((Y2 - Y1) / (X2 - X1)) * (Wert - X1)
End Sub

Nur noch die Überprüfungen vorher abfragen und dann sollten auch keine Fehler entstehen. Wenn der letzte Wert der Tabelle gefunden wird, soll ja nicht die Leerzelle danach eingesetzt werden.
Beste Grüße und einen angenehmen Dienstag noch
Hendrik
Anzeige
Es sind keine falschen Informationen? is'n Witz ?
19.11.2018 12:02:18
Matthias
.

76 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige