Clever-Excel-Forum

Normale Version: Excel VBA .Find Datumssuche funktioniert nicht immer
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Also Ich habe eine Excel Datei mit der man Mitarbeiter einspeichern kann. Man trägt die Daten in eine Userform1 ein und die Daten werden in eine Tabelle1 automatisch gespeichert.
Um die Daten wieder zu finden habe ich eine Suchfunktion in welcher man zuerst den Namen oder die Personalnummer eines Mitarbeiters angeben kann. Das Programm sucht dann alle Vorhandenen Datensätze zu der Person heraus und listet die Datums in einer Kombobox auf. Anschließend Wählt man das gewünschte Datum aus und klickt auf laden woraufhin das Programm mit .find das Datum sucht und anschließend überprüft ob es mit dem gesuchten Namen übereinstimmt anschließend werden alle Daten in eine Userform geladen wo an die Daten betrachten/ändern und neu abspeichern kann.
Alles hat wunderbar funktioniert aber seit gestern findet er zwar die Datums zu den Personen und läd sie in die Kombobox aber wenn man jetzt auf laden klickt findet er das Datum nur manchmal, Mal funktioniert es mal nicht sogar wenn es die gleiche Person ist findet er nur bestimmte Daten obwohl er sie vorher in die box geladen hat und die Daten existieren.

Ich hoffe ich konnte die Sache einigermaßen gut erklären. :20:

hier einmal der betreffende Code befindet sich in der Userform "Suche" der rote Bereich ist der meiner Meinung nach relevante.

  1. Private Sub CommandButton_laden_Click()
  2. Dim eingabe As Range 'nach name oder personalnummer suchen
  3. Dim finden As Range 'durchsucht die spalte nach dem suchbegriff
  4. Dim treffer As String 'speichert den ersten gefundenen wert und wird als abbruch bedingung gebraucht da sonst die tabbelle immer wieder von vorne durchgesucht wird so stoppt die suche wenn sie wieder bei der addresse ist
  5. Dim suchfeld As String   'speichert den aktuell gefundenen wert
  6. Dim w As Integer 'wenn man nach name sucht muss w = -1 gesetzt werden weil sonst alles um eine spalte verrutsch
  7. w = 0
  8. Tabelle1.Activate ' hier liegen die "Rohdaten"
  9. Dim datumeingabe As Date
  10. datumeingabe = Suche.ComboBox_Date.Value 'hier wurde das Datum reingeladen und ausgewählt
  11. Set finden = Tabelle1.Columns(108).Find(what:=datumeingabe, LookAt:=xlPart)
    blau markiert weil die stelle eigentlich keine Rolle spielt da die werte erst nach dem finden verwendet werden
  12. If IsNumeric(Suche.TextBox_s.Value) = True Then   'das brauche ich um zu wissen mit welcher spalte die TextBox_s.value verglichen werden soll
  13.     w = -1
  14. End If
  15. If Not finden Is Nothing Then 'hier bricht er dann ab weil finden manchmal fälschlicher weise nothing ist
Bei Rückfragen mehr Code oder der Datei bitte melden versuche so schnell wie möglich zu antworten Angel
Moin!
Ein Datum ist eine serielle Ganzzahl.
iVm einer Userform wird es ganz gerne mal als Text eingetragen; dann gibt es Probleme.
Außerdem bei "ungewöhnlichen" Datumsformaten.
Deshalb hilft es meist, nach CLng(Datum) zu suchen.
Warum überhaupt xlPart??

Wenn es nicht bereits jetzt hilft, wäre eine Datei nicht verkehrt.

Gruß Ralf
Vielen Dank für die schnelle Antwort Blush

So einfügen oder anders?:
Set finden = Tabelle1.Columns(108).Find(what:=CLng(datumeingabe), LookAt:=xlPart)

XlPart war nur ein Versuch gewesen hatte erst nichts und dann XlWhole hat nichts geändert :(

Hier noch die Datei falls das mehr hilft :)
Wenn Du Spalte DD mal breiter ziehst, siehst Du unterschiedliche Ausrichtungen der Daten.
Mal ein selbstzufriedenes Eigenzitat:  :21:
Zitat:iVm einer Userform wird es ganz gerne mal als Text eingetragen; dann gibt es Probleme.

Ich war jetzt aber zu faul, die Codestelle zu suchen.
Deshalb nur ein Pseudo-Code:
Code:
If IsDate(Textbox1) Then Cells(Zeile, Spalte) = CDate(Textbox1)

Gruß Ralf
Super vielen Dank es hat funktioniert Heart Heart Heart

für die Nachwelt: in UserForm1  bei Sub Speichern_Click():


'aktuelles Datum abspeichern

Tabelle1.Cells(last, 108).Value = CDate(UserForm1.TextBox_Date.Value) 

und nicht vergessen das alte Datum abspeichern rauzunehmen.

Um die bestehenden Daten umzu formatieren:

in ein neues modul:

Sub asdate()

Dim n As Integer
For n = 2 To 100 'statt 100 kann beliebiger wert genommen werden jenachdem wie viele Einträge man hat
Cells(n, 108).Value = CDate(Cells(n, 108).Value)
Next
End Sub

viele Grüße
Florian
Hallo Florian,

ich denke, wenn Du der Nachwelt wirklich Deine Erkenntnisse zukommen lassen willst,
dann solltest Du ihr eine funktionierende Datei hinterlassen. Ich glaube kaum, daß für
jemanden, der sich auf der Lösungssuche befindet, in Deinen letzten Worten eine Lösung
erkennt.
Natürlich freue ich mich, daß Du hier für Dich eine passende Lösung entwickeln konntest.
Viel Spaß damit.
Moin Peter!
Die Sub asdate() diente ihm ja nur dazu, seine falschen "Text-Datümer" (ja, ich weiß, dass es Daten heißt) in echte Daten umzuwandeln.
Dass das schneller und besser geht, ist ja erst mal unerheblich.
Der "eigentliche Kniff", nämlich TextBoxes niemals direkt, sondern immer per Umwandlungsfunktion zu übergebe, kam glaube ich korrekt rüber.

Gruß Ralf
Auch wenn ich weiß, dass ihr jeden Thread auch für Einsteiger verständlich abgeschlossen haben möchtet:
Der TE hat mir durch seine erste Antwort gezeigt, dass er Grundkenntnisse hat und eine maßgeschneiderte Lösung wünscht.

Er ist zufrieden, also warum um Himmels willen soll ich (oder er) jedem Querleser die Geschichte von Adam, Eva, der Rippe und der Schlange erzählen?
Dies könnte dem Sinn eines Forums nicht nur widersprechen, sondern interessierte Querleser eher abschrecken.

Ist zumindest meine Meinung.

Freundlicher Gruß vom manchmal grummelig wirkenden
Ralf
Hallo Ralf,

ich wollte ja nur darauf hinweisen, daß eine Datei aussagekräftiger ist als 1.000 Worte.

In diesem Fall habe ich den Thread gar nicht wirklich mitgelesen.
Alles gut!
(siehe auch meine Antwort im anderen Thread)

kollegiale Grüße!