PDA

Vollständige Version anzeigen : Find gibt falschen Wert zurück


StefanHo
30.06.2017, 07:09
Guten Morgen zusammen,

ich stehe gerade vor einem Phänomen, dass ich mir nicht erklären kann.

Ich habe ein Tabellenblatt mit Datumswerten in Zeile 1 Spalte A bis L: 01.01.2017 bis 01.12.2017.

Ein simples Makro soll nun nach einem bestimmten Datum suchen und mir die entsprechende Spalte ausgeben.


Public Sub Finde()
Dim x As Object
Dim revdate As Date
Dim col As Double

revdate = "01.01.2017"
Set x = Sheets("Sheet1").Range("A1:L1").Find(What:=revdate, LookIn:=xlValues)
col = x.Column

End Sub

Das funktioniert so weit auch super. Suche ich jedoch nach dem Datum 01.01.2017, findet der Code statt Spalte A, Spalte K, was dem 01.11.2017 entspricht.

Suche ich nach einem anderen Datum oder schließe ich Spalte K aus der Suche aus, liefert der Code wie erwartet Spalte A zurück.

Im Anhang eine Beispieldatei.

Jemand ne Idee, was das Problem ist?

VG
Stefan

Case_Germany
30.06.2017, 07:17
Hallo, :)

nimm: ;)

.Find(What:=revdate, LookIn:=xlValues, LookAt:=xlWhole)

Schau Dir das auch mal in der Hilfe an. Bestimmte Parameter sollten angegeben werden, da sonst der "alte" angenommen wird. :cool:

Servus
Case

Hajo_Zi
30.06.2017, 07:26
Hallo Stefan,

und ich gebe immer viele an
Set Rafound1 = Columns(1).Find("Erledigt", Range("A" & Rows.Count), xlFormulas, _
xlWhole, , xlNext)

<img src="http://Hajo-Excel.de/images/grusz1.gif" align="middle" height="40" alt="Grußformel"><a href="http://Hajo-Excel.de/index.htm"><img border="0" src="http://Hajo-Excel.de/images/logo_hajo3.gif" align="middle" height="40" alt="Homepage"></a>

StefanHo
30.06.2017, 07:28
Danke Case, für die schnelle Hilfe!

Es funktioniert mit "LookAt:=xlWhole".

Verstehe auch deine Erklärung und habe auch schon davon gelesen. Jedoch hatte ich die Wirkung dieses Parameters unterschätzt:cool:


VG
Stefan

StefanHo
30.06.2017, 07:31
Danke Hajo,

viel hilft viel:grins:

Aber du hast natürlich Recht.


VG
Stefan

hary
30.06.2017, 07:35
Moin
Und wo wir schon dabei sind ;-)
Bau eine Pruefung ein, sonst kommt wenn das Datum nicht vorhanden ist der Debugger.
If Not x Is Nothing Then
col = x.Column
End If
gruss hary

StefanHo
30.06.2017, 08:41
Danke hary,

im original Code ist die Prüfung vorhanden. Habe das Beispiel auf das Wesentliche reduziert.

VG
Stefan

Luschi
30.06.2017, 08:57
Hallo StefanHo,

der eigentliche Grund, warum die Find-Funktion nicht in 'A1' beginnt, findest Du in der Vba-Hilfe: h i e r (https://msdn.microsoft.com/de-de/library/office/ff839746.aspx)
siehe: Parameter 'After'. Soll also in Zelle 'A1' begonnen werden zu suchen, dann so:revdate = CDate("01.01.2017")
Set x = Sheets("Sheet1").Range("XFD1048576,A1:L1").Find(revdate, , xlFormulas, _
xlWhole, xlByColumns, xlNext, False, False, False)
If Not (x Is Nothing) Then
col = x.Column
End IfWarum als 3. Parameter 'xlFormulas' statt 'xlValues'?
Wenn die Datumsangaben formatiert sind (Sonntag, 1. Januar 2017 statt 01.01.2017), wird das Datum mit 'xlValues' nicht gefunden - deshalb 'xlFormulas'

Gruß von Luschi
aus klein-Paris

StefanHo
30.06.2017, 10:24
Hi Luschi,

das kann ich nicht nachvollziehen. Wenn ich das Datum 01.11.2017 nicht mit in die Suche einbeziehe, in dem ich z.B. den Suchbereich begrenze (A1:J1 anstelle von A1:L1), dann bekomme ich das gewünschte Ergebnis auch ohne deine vorgeschlagene Code-Modifikation.

Ich verstehe nur immer noch nicht, warum "Find" den 01.11.2017 findet und Spalte K ausgibt, obwohl ich nach dem 01.01.2017 suche und Spalte A erwarte. Nach deiner Erklärung hätte ich gar keinen Rückgabewert erhalten dürfen, weil A1 ja nicht berücksichtigt würde.

Hoffe, du kannst mir folgen ;)

VG
Stefan

Luschi
30.06.2017, 10:38
Hallo StefanHo,

im von mir geposteten Link steht folgende Aussage:
Erreicht die Suche das Ende des angegebenen Suchbereichs, beginnt sie erneut am Anfang dieses Bereichs.

Es herrscht also Kreisverkehr: bei A1:L1 und A1:J1 wird immer begonnen in B1.
im 1. Fall wird K1 gefunden
im 2. Fall wird bis J1 nichts gegefunden und beginnt dann automatisch neu bei A1

Gruß von Luschi
aus klein-Paris

StefanHo
30.06.2017, 11:14
Okay, das mag ja sein. Aber warum findet der Code den 01.11.2017? Dieses Datum unterscheidet sich von dem gesuchten Wert.

Gruß
Stefan

Luschi
30.06.2017, 11:51
Hallo StefanHo,

mit dem Datumstyp hat M$ immer wieder mal seine Probleme. Solltest Du mal ein Vba-Programm schreiben, wo das Filtern von Datumswerten eine Rolle spielt, wirst Du Dich wundern, warum in den verschiedenen Excel-Versionen so untershiedliche Lösungsansätze gibt und die Kompatibilität zwischewn den Versionen auf der Strecke bleibt.
Auch die Verbindung von Word & Excel bei Serienbriefen ist in Bezug auf das Datum ist eine einzige Katastrophe und die Hilferufe in den foren riesengroß.
Nimm es für den Moment einfach so hin und studiere mehr die Infos in der Online-Vba-Hilfe.

Gruß von Luschi
aus klein-Paris

PS:Okay, das mag ja sein.Diese Bemerkung zeigt, daß Du sehr locker durch die Vba-Welt jonglierst, ohne sich mehr Gedanken zu machen, zur Verfügung stehende Leselektüre auch zu vereinnahmen!

StefanHo
30.06.2017, 13:31
Danke Luschi, für die Belehrung.

Anstatt mit dem Finger auf andere zu zeigen und auf die Online-Hilfe zu verweisen, kannst du beim nächsten Mal auch einfach zugeben, dass du auch keine Ahnung hast, warum VBA sich so verhält. Kommt in aller Regel deutlich sympathischer rüber. :top:


Diese Bemerkung zeigt, daß Du sehr locker durch die Vba-Welt jonglierst, ohne sich mehr Gedanken zu machen, zur Verfügung stehende Leselektüre auch zu vereinnahmen!

Ja, tatsächlich "jongliere" ich relativ locker durch die VBA-Welt und bin damit stets gut gefahren. Mein gesamtes VBA-Wissen beruht auf der von dir angepriesenen "Leselektüre". In diesem Fall hatte ich halt noch ein Wissensdefizit. Verstehe nicht, wo genau da jetzt dein Problem liegt.

Dabei würde ich es dann auch jetzt gern belassen. Vielen Dank an Case und Hajo für die hilfreichen Antworten!

VG
Stefan

EarlFred
30.06.2017, 21:08
Hallo

Datumssuche möglichst nicht mit Range.Find(), sondern immer mit Application.Match().
Codebeispiele solltest Du hier im Forum finden. Wenn nicht, dann meld Dich nochmal.

Link (http://www.ms-office-forum.net/forum/showpost.php?p=1812963&postcount=2)

Grüße
EarlFred