Datumsformat abfragen

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
UserForm MsgBox
Bild

Betrifft: Datumsformat abfragen
von: Peter
Geschrieben am: 16.07.2015 14:14:44

Hallo zusammen,
ich habe folgendes Problem:
Ich möchte, dass Benutzer in eine Zelle das Datum nur im Format "dd.mm." eintragen können. Ansonsten soll eine Fehlmeldung kommen.

Sub Datumsformaprüfung()
If ActiveCell.NumberFormat = "dd.mm." Then
MsgBox "alles ok"
Else
MsgBox "nicht ok"
End If
End Sub

So sieht das ganze im Moment aus, leider bekomme ich immer die MsgBox "nicht ok", auch wenn das Datum richtig eingegeben wird.
Vielen Dank im Voraus!

Bild

Betrifft: Versuch "TT.MM" owt
von: Raphael H
Geschrieben am: 16.07.2015 14:23:35


Bild

Betrifft: AW: Versuch "TT.MM" owt
von: Rudi Maintaire
Geschrieben am: 16.07.2015 14:35:34
Hallo,
If activecell.Text Like "##.##." Then
Gruß
Rudi

Bild

Betrifft: AW: Datumsformat abfragen
von: Peter
Geschrieben am: 16.07.2015 14:31:14
Danke Raphael, leider funktioniert das auch nicht.

Bild

Betrifft: Siehe Rudis AW, ...
von: Luc:-?
Geschrieben am: 16.07.2015 15:34:03
…Peter,
denn es wird wohl so sein, dass die Zelle selbst nicht als TT.MM. formatiert ist. Dann kann auch das Prüfen des ZellFormats nichts bringen, denn bei Standard ergäbe das auch bei richtiger Eingabe die falsche MsgBox-AW. Die Eingabe, nicht das ZellFormat, muss geprüft wdn und das kann man übrigens auch mit DatenGültigkeit (ganz ohne VBA!) machen.
Gruß, Luc :-?

Besser informiert mit …

Bild

Betrifft: AW: Siehe Rudis AW, ...
von: Peter
Geschrieben am: 16.07.2015 16:02:04
Vielen Dank euch schonmal!
Vielleicht sollte ich noch hinzufügen, dass es mir eigentlich darum geht, dass der Benutzer am Ende einen Punkt hinter den Monat schreibt.
Ob er den Tag als 1. oder 01. eingibt ist egal, wichtig ist der Punkt hinter dem Monat.
Darum wollte ich auf "DD.MM." prüfen, aber eventuell ist das dann ja gar nicht nötig?
Der Punkt ist wichtig, da das Datum (sprich Tag & Monat) der Zelle entnommen wird und anschließend eine Jahreszahl angehängt wird. Dafür muss eben der Punkt als Trennung hinter den Monat und das soll geprüft werden und ggf automatisch angepasst werden...:)

Bild

Betrifft: Dann frag nach dem letzten Zeichen mit ...
von: Luc:-?
Geschrieben am: 16.07.2015 16:06:33
Right(…, 1)!
Luc :-?

Bild

Betrifft: AW: Dann frag nach dem letzten Zeichen mit ...
von: Peter
Geschrieben am: 17.07.2015 08:19:24
Super, das klappt jetzt. Vielen Dank Luc:-?
Leider ergibt sich daraus ein weiteres Problem, an dem ich hänge (Ich bin leider noch VBA Neuling :/):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$F$5" Then
        If Right(Range("F5"), 1) = "." Then
        Exit Sub
        Else
        MsgBox "Bitte geben Sie das Datum im Format DD.MM. (Tag.Monat.) ein und vergessen Sie  _
den letzten Punkt nicht", vbInformation, "Hinweis Datumsformat"
        Range("F5").Value = "??.??."
        End If
    End If
End Sub
Mit diesem Code funktioniert das ganze. Ich habe aber zuerst anstatt .Value = ??.??. einen clear befehl eingefügt: Range("F5").ClearContents, wodurch dann natürlich wieder der Change Befehl losging und ich in einer Endlosschleife hing. Ich habe dann versucht mit Exit Sub das ganze zu beenden, aber ich komme nicht aus der Funktion raus. Gibt es da eine Möglichkeit (ich bin sicher, dass es sie gibt :) )
Danke, peter

Bild

Betrifft: AW: Dann frag nach dem letzten Zeichen mit ...
von: Rudi Maintaire
Geschrieben am: 17.07.2015 09:31:18
Hallo,

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$F$5" Then
    On Error GoTo ERREXIT
    Application.EnableEvents = False  'Ereignisverarbeitung aus
    If Right(Target, 1) = "." Then
      'nix passiert
    Else
      MsgBox "Bitte geben Sie das Datum im Format DD.MM. (Tag.Monat.) ein " _
        & "und vergessen Sie den letzten Punkt nicht", _
        vbInformation, "Hinweis Datumsformat"
      Target.ClearContents
    End If
  End If
ERREXIT:
  Application.EnableEvents = True
End Sub

Was ist, wenn der . hinter dem Tag fehlt?
Gruß
Rudi

Bild

Betrifft: AW: Dann frag nach dem letzten Zeichen mit ...
von: Peter
Geschrieben am: 17.07.2015 09:40:23
Hallo Rudi und vielen Dank,
es funktioniert jetzt genau so, wie es soll :)
Zu deiner Frage:
Der Punkt ist wichtig, da das Datum der Zelle entnommen wird und anschließend das Jahr angehängt wird.
D.h. der Zellwert 1.6. wird genommen und mit der Endung 2015 in eine neue Zelle geschrieben.
Den Aufbau dafür siehst du auch in einem anderen Beitrag, den ich heute geschrieben habe (nennt sich: Userform für Dateneingabe). Das Datum wird entnommen und um das obenstehende Jahr ergänzt.
LG und ein schönes Wochenende,
Peter

Bild

Betrifft: AW: Dann frag nach dem letzten Zeichen mit ...
von: Peter
Geschrieben am: 17.07.2015 10:04:32
Ich habe noch eine Frage bzgl. einer Erweiterung des Codes.
Die von Rudi aufgeführte Abfrage

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$F$5" Then
    On Error GoTo ERREXIT
    Application.EnableEvents = False  'Ereignisverarbeitung aus
    If Right(Target, 1) = "." Then
      'nix passiert
    Else
      MsgBox "Bitte geben Sie das Datum im Format DD.MM. (Tag.Monat.) ein " _
        & "und vergessen Sie den letzten Punkt nicht", _
        vbInformation, "Hinweis Datumsformat"
      Target.ClearContents
    End If
  End If
ERREXIT:
  Application.EnableEvents = True
End Sub
soll nicht nur für die Zelle F5, sondern für mehr Zellen in verschiedenen Spalten funktionieren. Kann ich das mit einer Schleife ausführen, sodass ich den Code nicht 50x kopieren muss und die Rangebeschriftung anpassen muss?
Danke und LG, Peter

Bild

Betrifft: AW: Dann frag nach dem letzten Zeichen mit ...
von: Rudi Maintaire
Geschrieben am: 17.07.2015 10:08:20
Hallo,
wo soll das denn gelten?
Beispielmappe?
Gruß
Rudi

Bild

Betrifft: AW: Dann frag nach dem letzten Zeichen mit ...
von: Peter
Geschrieben am: 17.07.2015 10:12:29
Hallo Rudi,
Userbild
so sieht ein Teil der Tabelle aus. Überall, wo ein Datum eingetragen werden kann, soll die Prüfung stattfinden.
Gerne kannst du dir aber auch meinen Beitrag zur Userform für Dateneingabe anschauen, denn ich überlege, ob es nich machbar ist, mit einer Eingabemaske alle Werte einzugeben und diese dann in die entpsrechende Zelle schreiben zu lassen.
Leider bin ich mir nicht sicher, wie ich das angehen soll, falls das überhaupt machbar ist.
Gruß,
Peter

Bild

Betrifft: AW: Dann frag nach dem letzten Zeichen mit ...
von: Rudi Maintaire
Geschrieben am: 17.07.2015 10:28:56
Hallo,
eine Möglichkeit:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Count = 1 Then 'nur 1 Zelle
    If Cells(3, Selection.Column).MergeArea(1) = "Datum" Then
      'mach was
    End If
  End If
End Sub

Gruß
Rudi

Bild

Betrifft: AW: Dann frag nach dem letzten Zeichen mit ...
von: Peter
Geschrieben am: 17.07.2015 10:53:57
Hallo Rudi,
leider werde ich daraus nicht ganz schlau.
Der Code

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$F$5" Then
    On Error GoTo ERREXIT
    Application.EnableEvents = False  'Ereignisverarbeitung aus
    If Right(Target, 1) = "." Then
      'nix passiert
    Else
      MsgBox "Bitte geben Sie das Datum im Format DD.MM. (Tag.Monat.) ein " _
        & "und vergessen Sie den letzten Punkt nicht", _
        vbInformation, "Hinweis Datumsformat"
      Target.ClearContents
     Range("F5").Select
    End If
  End If
  ERREXIT:
  Application.EnableEvents = True
End Sub
funktioniert logischerweise momentan nur für die Zelle F5.
Nun soll dies aber auch für die Zellen bis F26 und auch G5-G26 funktionieren (später dann auch noch für die weiteren Datumszellen).
Hier noch die Beispielmappe mit der kompletten Tabelle, dann wird es etwas klarer:
https://www.herber.de/bbs/user/98891.xlsx
Vielen Dank,
Peter

Bild

Betrifft: AW: Dann frag nach dem letzten Zeichen mit ...
von: Rudi Maintaire
Geschrieben am: 17.07.2015 11:43:15
Hallo,
funktioniert in Zeile 5-26 in allen Spalten wo im verbundenen Bereich in Zeile 3 "Datum" steht.

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Count = 1 Then
    If Target <> "" Then
      Select Case Target.Row
        Case 5 To 26
          If Trim(Cells(3, Target.Column).MergeArea(1)) = "Datum" Then
              If Right(Target, 1) <> "." Then
                MsgBox "Bitte geben Sie das Datum im Format DD.MM. (Tag.Monat.) ein " _
                  & "und vergessen Sie den letzten Punkt nicht.", _
                  vbInformation, "Hinweis Datumsformat"
                Application.EnableEvents = False
                Target = ""
                Target.Select
                Application.EnableEvents = True
              End If
          End If
      End Select
    End If
  End If
End Sub

Gruß
Rudi

Bild

Betrifft: AW: Dann frag nach dem letzten Zeichen mit ...
von: Peter
Geschrieben am: 17.07.2015 12:59:56
Hallo Rudi,
super für die nette Antwort und den Code. Funktioniert einwandfrei!
Könntest du noch genau erleutern, was die einzelnen Schritte machen? Damit ich dazulerne und solch eine Frage beim nächsten Mal selbst beantworten kann :)
Danke und LG
Peter

Bild

Betrifft: AW: Dann frag nach dem letzten Zeichen mit ...
von: EtoPHG
Geschrieben am: 17.07.2015 11:57:09
Hallo Peter,
Warum nicht von Anfang an die Anforderung möglichst genau beschreiben? z.B. so:
Ich möchte den Benutzern die Möglichkeit geben in Zellen, die ein Datum des laufenden Jahres enthalten sollen die Eingabe in der verkürzten Form von Tag.Monat. (mit einem Punkt am Ende!) zu erlauben und diese automatisch durch das laufende Jahr zu ergänzen. Sie sollen aber auch ein vollständiges Datum des laufenden Jahres eingeben können Tag.Monat.Jahr
Die Zelle soll anschliessend ein gültiges Datum des laufenden Jahres enthalten.
Es soll für alle Zellen gelten, deren Zeilennummer > 3 ist und die eine Spaltenüberschrift "Datum" (u.U. verbundene Zelle!) in Zeile 2 aufweisen!
Entspricht die Eingabe nicht dem Format Tag.Monat. oder Tag.Monat.Jahr, soll eine Fehlermeldung mit einem verständlichen Hinweis erfolgen und die Eingabe gelöscht werden.

Daraus könnte man dann diesen Code konstruieren (und natürlich Testen!):

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    If IsEmpty(Target) Then Exit Sub
    If IsDate(Target) And Year(Target) = Year(Date) Then Exit Sub
    If Target.Row > 3 Then
        Application.EnableEvents = False
        If Cells(2, Target.Column).MergeArea(1) = "Datum" Then
            If IsDate(Target.Text & Year(Date)) Then
                Application.EnableEvents = False
                Target = CDate(Target & Year(Date))
            Else
                MsgBox "Aus der Eingabe [" & Target.Text & _
                       "] kann kein gültiges Datum gebildet werden!" & vbCrLf & _
                       "Beachten Sie das Format [DD.MM.] (inkl. Punkt am Ende!)", vbExclamation, _
 "Datumsprüfung auf " & Year(Date)
                Application.Undo
            End If
        End If
        Application.EnableEvents = True
    End If
End Sub
Gruess Hansueli

Bild

Betrifft: AW: Dann frag nach dem letzten Zeichen mit ...
von: Rudi Maintaire
Geschrieben am: 17.07.2015 10:05:07
Hallo,
123. wird aber auch als korrekt angesehen.
Gruß
Rudi

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Datumsformat abfragen"