Datum aus einer Userform in einer Tabelle finden
#1
Moin zusammen,
ich habe eine Art Kalender erstellt und möchte jetzt ein paar weitere Spalten mittels Userform füllen.

Problem, ich habe es nicht geschafft, ein eingegebenes Datum in einer Textbox in dem Kalender zu finden, sodass die weiteren Eingaben richtig abgelegt werden können.

In dem Bereich von C5-C370 stehen die Datumsangaben von 01.01.22 - 31.12.2022
In der Spalte E und F möchte ich Zeiten (Arbeitsbeginn und Arbeitsende aus der Userform) eingeben und mittels CommandButton übernehmen.


1. Dieser Code aus dem Internet war der Vielversprechendste, funktionierte aber nicht.

Private Sub CommandButton1_Click()
'Nach Eintrag (Datum) suchen
Dim zelle As Range

With Sheets("Arbeitskalender")
If TextBox1.Value <> "" Then
 Set zelle = .Columns("C:C").Find(TextBox1.Value, LookIn:=xlValues)
  If Not zelle Is Nothing Then
   .Cells(zelle.Row, 5).Value = TextBox2.Value
   .Cells(zelle.Row, 6).Value =  TextBox3.Value

  Else
    'MsgBox "Es gibt noch keinen Eintrag für das Datum " & TextBox1.Value
    'FelderLöschen
    TextBox1.SetFocus
  End If
End If
End With
End Sub



2. Dann habe ich eine Änderung eingefügt mit dem Problem, dass nicht das Datum, sondern die Zeile 44562 gesucht wurde und dort in den Spalten 5 und 6 die Einträge übernommen wurden (wenigstens das ...).

Set zelle = .Columns("C:C").Find(CDate(TextBox1.Value), LookIn:=xlValues)

Wie ich erlesen konnte, hat CDate das eingegebene Datum in die Zahl 44562 konvertiert und aus einem mir unverständlichen Grund auch gefunden.
Eigentlich soll nur in Spalte C gesucht werden, das Makro hat aber die Zeile 44562 gefunden.


Wer könnte mir helfen, dass Makro entsprechend anzupassen.
Antworten Top
#2
Hallo,

VBA ist bei der Suche nach Datumswerten über die Find-Methode etwas zickig. Deshalb mache ich das immer mit der Funktion Match.

Code:
Sub Beispiel()
    Dim LDatum As Long
    Dim varRow As Variant
    LDatum = CDate("17.01.2009")
    varRow = Application.Match(LDatum, Columns(1), 0)
End Sub
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
[-] Folgende(r) 1 Nutzer sagt Danke an Klaus-Dieter für diesen Beitrag:
  • d'r Bastler
Antworten Top
#3
Moin Klaus-Dieter! Wieder was gelernt! Danke!
Antworten Top
#4
Moin,
danke für den Tipp mit der Match-Funktion, aber trotz vielen Experimentierens und weitere Recherche reicht mein nicht vorhandenes Wissen bei Weitem nicht aus, um die Match-Funktion funktionsgerecht in das Makro zu implementieren.

Ich benötige ein wenig mehr Hilfe.
Antworten Top
#5
Hallo,

dann versuche es mal so:



   
Code:
Dim LDatum As Long
Dim varRow As Variant
    LDatum = CDate(TextBox1.Value)
    varRow = Application.Match(LDatum, Columns(3), 0)
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#6
Moin!
Nur ergänzend zu Klaus-Dieter:
Wichtig und gut ist hier, varRow As Variant zu deklarieren!
Ein Variant kann nämlich auch einen Fehlerwert aufnehmen!
Dies passiert, wenn Match nix findet.
Statt eine umständlichere Fehlerbehandlung zu schreiben reicht es beim Variant, auf IsError() zu prüfen.

Beispiel:
A
104.06.2022
220.06.2022
302.06.2022
427.06.2022
527.06.2022
609.06.2022
708.06.2022
815.06.2022
910.06.2022
1002.06.2022
11

Gesucht wird nach dem heutigen Datum, welches nicht vorhanden ist, wie man sieht …

Sub Heute()
Dim varRow As Variant
    varRow = Application.Match(Date, Columns(1), 0)
If Not IsError(varRow) Then
  MsgBox "Fundzeile ist " & varRow
Else
  MsgBox "Datum nicht gefunden!"
End If
End Sub

ergibt:
   

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
#7
@Klaus-Dieter,
danke für die erneut schnelle Antwort. Genau so hatte ich gestern den Code als Erstes geändert ohne Erfolg.

@Ralf,
danke für Deine Antwort, ich habe Deinen Code angepasst, damit die Eingabe des zu suchenden Datum über die Userform erfolgt und siehe da, er findet das Datum nicht.

Private Sub CommandButton1_Click()
Dim varRow As Variant
varRow = Application.Match(TextBox1.Value, Columns(3), 0)
If Not IsError(varRow) Then
MsgBox "Fundzeile ist " & varRow
Else
MsgBox "Datum nicht gefunden!"
End If
End Sub

Das Datum wird auch nicht gefunden, wenn ich das Datums in eine Zahl umwandel, also 44562 für den 01.01.2022.

@Klaus-Dieter und Ralf, ich glaube, dass Problem liegt woanders von meiner Person einmal abgesehen :)

Ich gebe in die Userform in der TextBox1 ein Datum ein (01.01.2022) und betätige den CommandButton1.
Dies scheint erkannt zu werden, denn Ralf sein Code weiß, dass es sich um den 01.01.2022 handelt, folglich liegt das Problem beim Suchen im Kalender.
Die Datumsangaben im Kalender habe ich folgendermaßen ermittelt:
In der Zelle C3 steht das Datum 01.01.2022, welches als Kalenderstartdatum zur Eingabe für die Folgejahre dient.
Den Kalender beginne ich in der Zelle C5 mit "=C3" (01.01.2022) und weiter mit =C5+1 usw... und so fort.
Antworten Top
#8
Hallo Björn,

so sollte es gehen:

Code:
Private Sub CommandButton1_Click()
  Dim varRow As Variant
  If IsDate(TextBox1) Then
    varRow = Application.Match(CLng(CDate(TextBox1.Value)), Columns(3), 0)
    If IsNumeric(varRow) Then
      MsgBox "Fundzeile ist " & varRow
    Else
      MsgBox "Datum nicht gefunden!"
    End If
  Else
    MsgBox "Kein Datum in der TextBox!"
  End If
End Sub

Gruß Uwe
Antworten Top
#9
Hallo Uwe,
danke für Deine Antwort, die war schon mal sehr hilfreich, denn jetzt wird das entsprechende Datum im Kalender gefunden.

Was nicht mehr funktioniert, siehe Ausgangpost, ist das Übernehmen anderer Werte in die Spalten 5 und 6.
Ich habe Deinem Code Folgendes hinzugefügt (war vom vorherigen Code), um den Inhalt der Textboxen aus der Userform zu übernehmen, aber das passt nicht mehr.

Dim zelle As Range
.Cells(zelle.Row, 5).Value = TextBox2.Value
.Cells(zelle.Row, 6).Value = TextBox3.Value

Wie müsste der Code angepasst/erweitert werden, damit ich mit Deinem Code auch Daten in die Spalten 5 und 6 übernehmen kann?

Kann man auch das Suchen in der Spalte C erst ab der Zeile 5 beginnen?
varRow = Application.Match(CLng(CDate(TextBox1.Value)), Columns(3), 0)
Antworten Top
#10
Hallo Björn,

Code:
Private Sub CommandButton1_Click()
  Dim varRow As Variant
  If IsDate(TextBox1) Then
    varRow = Application.Match(CLng(CDate(TextBox1.Value)), Range(Cells(5, 3), Cells(Rows.Count, 3)), 0)
    If IsNumeric(varRow) Then
      .Cells(varRow, 5).Value = TextBox2.Value
      .Cells(varRow, 6).Value = TextBox3.Value
    Else
      MsgBox "Datum nicht gefunden!"
    End If
  Else
    MsgBox "Kein Datum in der TextBox!"
  End If
End Sub

Gruß Uwe
Antworten Top


Gehe zu:


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