Excel - VBA Suche nach Werten in Zellen

Hallo,

ich schreibe gerade ein Makro in Excel und habe damit leider kaum Erfahrung. Zu dem Problem: In einem Excelsheet stehen in der ersten Spalte aufsteigende Zeitwerte, und ich möchte die Zeile bestimmen, in der ein bestimmter Zeitwert enthalten ist. Wenn die gesuchte Zeit in der ersten Spalte enthalten ist, bekomme ich das auch mit folgenden Befehlen hin:

Range(„a1“).Activate

Cells.Find(What:=Referenzzeit1, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False _, SearchFormat:=False).Activate

'Variable zeile1 wird die Zeilennummerder gefundenen Zeile zugewiesen
zeile1 = ActiveCell.Row

Es kommt allerdings vor, dass die genaue gesuchte Zeit nicht in der Spalte vorhanden ist. Für den Fall soll die Zeile gewählt werden, in der der erste Wert auftaucht, der größer ist als der gesuchte. Da die Zeiten aufsteigend sortiert und als normale Kommazahl gegeben sind, soll das Programm die Spalte also solange durchsuchen, bis der erste Wert erscheint, der größer ist als ein gegebener Referenzwert.
Weiß jemand, ob das einfach über einen Befehl in der Art
Cells.Find(What>Referenzzeit1, LookIn:=xlFormulas,…
möglich ist, oder muss ich dafür extra irgendeine Schleife programmieren?

Vielen Danke im Voraus!
Grüße,
Kari

[MOD] Titelzeile berichtigt

Hallo, Kari!

Weiß jemand, ob das einfach über einen Befehl in der Art
Cells.Find(What>Referenzzeit1, LookIn:=xlFormulas,…
möglich ist, oder muss ich dafür extra irgendeine Schleife
programmieren?

Extra eine Schleife, so ungefähr:

dim zeile as long
const spalte as long=1 ' Deine Spalte, in der Du suchst

zeile=2 ' die erste Zeile mit Daten
 ' hier: Spaltenüberschrift in der ersten Zeile 

do while Activesheet.Cells(zeile, spalte)"" \_
and Activesheet.Cells(zeile, spalte)Gruß, Manfred

Es kommt allerdings vor, dass die genaue gesuchte Zeit nicht
in der Spalte vorhanden ist. Für den Fall soll die Zeile
gewählt werden, in der der erste Wert auftaucht, der größer
ist als der gesuchte. Da die Zeiten aufsteigend sortiert und
als normale Kommazahl gegeben sind, soll das Programm die
Spalte also solange durchsuchen, bis der erste Wert erscheint,
der größer ist als ein gegebener Referenzwert.
Weiß jemand, ob das einfach über einen Befehl in der Art
Cells.Find(What>Referenzzeit1, LookIn:=xlFormulas,…
möglich ist, oder muss ich dafür extra irgendeine Schleife
programmieren?

Hi Kari,
nimm das von Manfred, andere Idee ist, sorry hab hier keine vba-Hilfe um was nachzulesen, nimm
Zeile=application.worksheetfunktion.match()
Match entspricht Verweis in Excel, also gleiche Syntax, halt in Vba-Schreibweise.
Aufgrund des letzten parameters von Match/Vergleich erhälst du schnell die Zeilennummer des Wertes was deinem Wert nahekommt.
Jetzt mußt dur noch rund um diese Zelle prüfen ob deine Bedingungen erfüllt sind.
Auf jeden Fall schneller als eine Schleife über alle Zellen wie von Manfred angeregt.
Excelfunktionen, also application.worksheetfunktion, sollen 10.000mal schneller sein als Vba Code, naja, da würde ich gerne mal genauer eine Zeitliste sehen was denn da was dauert.
Gruß
Reinhard

Hallo Manfred,
danke für den Tip. Habs damit erfolgreich zum Laufen gebracht!

Hi Kari,
nimm das von Manfred, andere Idee ist, sorry hab hier keine
vba-Hilfe um was nachzulesen, nimm
Zeile=application.worksheetfunktion.match()
Match entspricht Verweis in Excel, also gleiche Syntax, halt
in Vba-Schreibweise.
Aufgrund des letzten parameters von Match/Vergleich erhälst du
schnell die Zeilennummer des Wertes was deinem Wert nahekommt.
Jetzt mußt dur noch rund um diese Zelle prüfen ob deine
Bedingungen erfüllt sind.
Auf jeden Fall schneller als eine Schleife über alle Zellen
wie von Manfred angeregt.
Excelfunktionen, also application.worksheetfunktion, sollen
10.000mal schneller sein als Vba Code, naja, da würde ich
gerne mal genauer eine Zeitliste sehen was denn da was dauert.
Gruß
Reinhard

Hallo Reinhard,
so wie es Manfred vorgeschlagen hat, läuft es mittlerweile bei mir. Allerdings braucht es wegen der vielen Daten und Durchgänge doch ziemlich viel zeit. Deshalb wollte ich es auch mal mit Deinem Match-Befehl versuchen, habe das aber noch nicht hinbekommen. Die deutsche Excel-Hilfe hat als Beispiel „VERGLEICH(39;B2:B5;1)“, was die Zeile des größten Wertes in den Zellen B2 bis B5 angibt, der kleiner als 39 ist.
Jetzt habe ich es mit
zeile1=Match(Referenzzeit1, A1 : A30000, 1)+1
versucht, um die Zeile mit dem ersten Wert, der größer als die Referenzzeit ist, zu erhalten. Allerdings bekomme ich eine Fehlermeldung, dass zwischen A1 und A30000 statt „:“ ein Listentrennzeichen oder „)“ erwartet wird, und stehe da grade auf dem Schlauch, wie ich das umgehen kann. Weißt Du da was?
Ich habe auch grade in einem anderen Artikel von Screenupdate=false gelesen. An welcher Stelle muss ich das denn im Programm einfügen? Ich habe es mal direkt nach den Deklarationen der Variablen versucht, aber ich bekomme immer noch ein screenupdate (d.h. ich kann sehen, wie excel durch die einzelnen zellen springt und am Arbeiten ist).

Vielen Dank für Deine Hilfe,

Kari