Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
412to416
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
412to416
412to416
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Gültiges Datum (ohne Punkteingabe)

Gültiges Datum (ohne Punkteingabe)
Jürgen
Hallo Forumsmitglieder,
nochmal das beliebte Thema Datumseingabe ohne Punkt.
Mit folgendem Code versuche ich eine Datumseingabe in einer Zelle:
Private Sub Worksheet_Change(ByVal Target As Range) Dim Bereich As Range Dim Datum As String Set Bereich = Range("C8") If Not Intersect(Target, Bereich) Is Nothing Then ' Zelle ist im Bereich Application.EnableEvents = False If Len(Target) = 6 Then Datum = Left(Target, 2) & "." & Mid(Target, 3, 2) & "." & Right(Target, 2) Sheets("Eingabedaten").Range("B3") = Datum 'nur zum Testen Datum = Format(Datum, "dd.mm.yyyy") Sheets("Eingabedaten").Range("D3") = Datum 'nur zum Testen If IsDate(Datum) Then Target = Format(Datum, "dd.mm.yyyy") Else Target = Empty Target.Activate End If End If Application.EnableEvents = True End If End Sub
------------------
Das läuft auch wie vorgesehen, wenn sinnvolle Eingaben wie 180404 gemacht werden. Wird jedoch ein ungültiges Datum wie 290203 eingegeben, versagt der Code, es wird gnadenlos ein anderes (über Format) erzeugt. Sieht jemand eine Möglichkeit, die Gültigkeit des eingegebenen Datums vor der Umwandlung mit Format zu erkennen, ohne dass ich ellenlangen eigenen Plausi-Code erstellen muss?
Jürgen
AW: Gültiges Datum (ohne Punkteingabe)
Kurt
Alles Schnulli, da die Prüfung immer erst nach Eingabe in die Zelle erfolgen kann.
Nutz ein entsprechendes control, wie Monthview oder DateTimePicker.
Kurt
AW: Gültiges Datum (ohne Punkteingabe)
Jürgen
Hi Kurt,
die Prüfung in obigem Code erfolgt schon nach der Eingabe, zunächst noch als String. Wenn in diesem String ein gültiges Datum ist, soll es korrekt formatiert zurückgeschrieben werden. Ich kann den String zwar mit -- Not IsDate(Datum)-- prüfen, dass versagt aber zum Beispiel mit Schalttagen etc.
Jürgen
AW: Gültiges Datum (ohne Punkteingabe)
Kurt
Ja klar, weil die Prüfung mit IsDate nicht ausreichend ist, wie du ja
schon bemerkt hast.
Kurt
Anzeige
AW: Gültiges Datum (ohne Punkteingabe)
NE
Hi Jürgen,
evtl. Notlösung:
Datum = DateSerial(Right(Target, 2), Mid(Target, 3, 2), Left(Target, 2))
cu Nancy
AW: Gültiges Datum (ohne Punkteingabe)
Matthias
Hallo Jürgen,
die IsDate-Abfrage funktioniert schon, auch mit Schaltjahren, wenn man das komplette Datum angibt:
IsDate("29.02.2004") ist Wahr
IsDate("29.02.2003") ist Falsch
Dein Problem ist v.a., dass der Zelleintrag als Text erwartet wird.
Wenn die Zelle dann als Datum formatiert ist (und das soll sie ja, oder?), gibt schon die Prüfung Len()=6 ein falsches Ergebnis, weil Excel die 6-Stellige Zahl im ein (vermeintliches) Datum umwandelt, nämlich in das, welches die vergangenen Tage seit dem 1.1.1900 + deine 6-stellige Zahl angibt.
Wenn du das Zellformat als Text behalten willst, ginge es wohl (das hab' schon was parat), aber was nützt ein Datum in Textformat?
Gruß Matthias
Anzeige
AW: Gültiges Datum (ohne Punkteingabe)
Matthias
Hallo Jürgen,
jetzt hab' ich doch eine Möglichkeit gefunden:
Private Sub Worksheet_Change(ByVal Target As Range) Dim Bereich As Range Dim Datum As String Dim Tar2 As String Dim j As String, m As String, t As String Set Bereich = Range("C8") If Not Intersect(Target, Bereich) Is Nothing Then ' Zelle ist im Bereich Application.EnableEvents = False On Error GoTo err Tar2 = CStr(CLng(Target.Value)) If Len(Tar2) = 6 Then t = Left(Tar2, 2) m = Mid(Tar2, 3, 2) j = Right(Tar2, 2) 'Prüfung wg. 2-stelliger Jahreeszahl, "19" oder "20" davorsetzen: If Val(j) > 30 Then j = "19" & j Else j = "20" & j End If Datum = t & "." & m & "." & j 'MsgBox Datum 'Sheets("Eingabedaten").Range("B3") = Datum 'nur zum Testen 'Datum = Format(Datum, "dd.mm.yyyy") 'Sheets("Eingabedaten").Range("D3") = Datum 'nur zum Testen If IsDate(Datum) Then Target = Datum Else Target = "" Target.Activate End If End If Application.EnableEvents = True On Error GoTo 0 End If Exit Sub err: Application.EnableEvents = True End Sub
Gruß Matthias
Anzeige
Matthias ist 'mal wieder der Hammerlöser!!!
18.04.2004 17:19:37
Florian
Super und Danke!
Die Lösung kann jeder gebrauchen.
AW: Gültiges Datum (ohne Punkteingabe)
NE
Hi Matthias,
möglicherweise hab ich auch das Problem verkannt,
aber sowas sollte doch auch gehen
[nur reinkopiert ;;-))]
lg Nancy
--

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich As Range
Dim Datum As Date
Set Bereich = Range("C8")
If Not Intersect(Target, Bereich) Is Nothing Then ' Zelle ist im Bereich
Application.EnableEvents = False
If Len(Target) = 6 Then
Datum = DateSerial(Right(Target, 2), Mid(Target, 3, 2), Left(Target, 2))
Sheets(1).Range("B3") = Datum  'nur zum Testen
Datum = Format(Datum, "dd.mm.yyyy")
Sheets(1).Range("D3") = Datum  'nur zum Testen
If IsDate(Datum) Then
Target = Format(Datum, "dd.mm.yyyy")
Else
Target = Empty
Target.Activate
End If
ElseIf Len(Target) = 5 Then
Datum = DateSerial(Right(Target, 2), Mid(Target, 2, 2), Left(Target, 1))
Sheets(1).Range("B3") = Datum  'nur zum Testen
Datum = Format(Datum, "dd.mm.yyyy")
Sheets(1).Range("D3") = Datum  'nur zum Testen
If IsDate(Datum) Then
Target = Format(Datum, "dd.mm.yyyy")
Else
Target = Empty
Target.Activate
End If
End If
Application.EnableEvents = True
End If
End Sub

Anzeige
AW: Gültiges Datum (ohne Punkteingabe)
Matthias
Hallo Nancy,
stimmt, das geht auch, aber er wandelt den 29.2.03 einfach in den 1.3.03 um :-)
und wenn Du z.B. "12.1" oder einen Text reinschreibst kommt er durcheinander...
Also mir gefällt meins besser ;-))
Viele Grüße,
Matthias
AW: Gültiges Datum (ohne Punkteingabe)
NE
Hi Matthias,
na von Punkt war ja nich die Rede, im Gegenteil ;;-))
Aber stimmt, hast recht, achja und dateserial nimmt das naheliegendste an [01.03.03]
BTW, aber zumindest würd ich das if len=5 noch reinnehmen, weil wenn ich zB
010103 eingebe, xl die null verschluckt und somit ist target nur noch 5 Zeichen,
zumindest bei mir ;-)
cu Nancy
Anzeige
AW: Gültiges Datum (ohne Punkteingabe)
Matthias
Hallo Nancy,
Stimmt! Len=5 muss mit rein.
Naja, irgendwie gibt es hier wohl keine richtig saubere Lösung ;-)
Grüße
Matthias
Wie wär's damit?
19.04.2004 04:18:05
Florian


Private Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich As Range
Dim Datum As String
Dim Tar2 As String
Dim As String, m As String, t As String
Set Bereich = Range("A1")
  If Not Intersect(Target, Bereich) Is Nothing Then
    Application.EnableEvents = False
    On Error GoTo err
    Tar2 = CStr(CLng(Target.Value))
    If Len(Tar2) = 6 Or Len(Tar2) = 5 Then ' neu: Or Len(Tar2) = 5
' neu
      If Len(Tar2) = 6 Then
        t = Left(Tar2, 2)
      Else
        t = "0" & Left(Tar2, 1)
      End If
' neu
      If Len(Tar2) = 6 Then
        m = Mid(Tar2, 3, 2)
      Else
        m = Mid(Tar2, 2, 2)
      End If
      j = Right(Tar2, 2)
      If Val(j) > 30 Then
      j = "19" & j
      Else
      j = "20" & j
      End If
      Datum = t & "." & m & "." & j
      If IsDate(Datum) Then
' neu
        Target = CDate(Datum)
        Target.NumberFormat = "dd.mm.yyyy"
      Else
        Target = ""
        Target.Activate
      End If
    Else ' neu
        Target.ClearContents ' neu
    End If
    Application.EnableEvents = True
    On Error GoTo 0
  End If
Exit Sub
err:
Application.EnableEvents = True
End Sub


Anzeige
AW: Gültiges Datum (ohne Punkteingabe) - ohne VBA
FP
Hallo Jürgen,
wenn es Dir 1 Hilfsspalte Wert ist, geht es auch ohne VBA.
In Spalte A habe ich folgendes Format verwendet: 00\.00\.0000
Spalte B dient nur der Demonstration, was wirklich in A steht, kannst Du also ignorieren
Spalte C enthält dann ein Datum: Format TT.MM.JJJJ
Tabelle2
 ABC
1formatiertunformatiertumgewandelt
210.01.20041001200410.01.2004
301.01.20040101200401.01.2004
413.10.20041310200413.10.2004
Formeln der Tabelle
B2 : =A2
C2 : =TEXT(A2;"00-00-0000")+0
B3 : =A3
C3 : =TEXT(A3;"00-00-0000")+0
B4 : =A4
C4 : =TEXT(A4;"00-00-0000")+0
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
Servus aus dem Salzkammergut
Franz
Anzeige
AW: Gültiges Datum (ohne Punkteingabe)
FP
Hallo Jürgen,
und hier eine Variante mit VBA:
"Features"
Eingabe 4 Stellen -> Jahr = aktuelles Jahr
geprüft wird:
Monat muss zwischen 1 und 12 liegen
Tag muss gültig sein ( d.h. zwischen 1 und Ultimo liegen )
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
With Target(1)
If .Address(0, 0) = "C8" Then
Application.EnableEvents = False
.Value = Input2Date(.Value)
.NumberFormatLocal = "TT.MM.JJJJ"
If .Value = 0 Then
.Value = ""
Target.Select
End If
Application.EnableEvents = True
End If
End With
End Sub


Private Function Input2Date(strDatum As String) As Date
Dim tag     As Byte
Dim mon     As Byte
Dim jahr    As Integer
Dim strTit  As String
strTit = "Falsche Datumsangabe"
On Error Resume Next
'If VarType(WorksheetFunction.Text(strDatum, "00-00-0000") + 0) = vbDate Then
Input2Date = CDate(WorksheetFunction.Text(strDatum, "00-00-0000"))
If VarType(Input2Date) = vbDate And Input2Date > 0 Then
Exit Function
End If
On Error GoTo 0
If Len(strDatum) > 4 Then
jahr = Val(Right(strDatum, Len(strDatum) - 4))
Else
jahr = Year(Date)
End If
If Len(strDatum) > 5 Then strDatum = Left(strDatum, 4)
If Len(strDatum) < 3 Then
MsgBox "Datum muss mindestens 3 Stellen haben!" _
& vbCr & "Eingabe war aber: " & strDatum, _
vbCritical + vbOKOnly, _
strTit
Exit Function
End If
mon = Val(Right(strDatum, 2))
If mon > 13 Or mon = 0 Then
MsgBox "Eingegebenen Monat gibt es nicht", _
vbCritical + vbOKOnly, _
strTit
Exit Function
End If
tag = Val(Mid(strDatum, 1, Len(strDatum) - 2))
If tag = 0 Or tag > Day(DateSerial(jahr, mon + 1, 0)) Then
MsgBox "Diesen Tag gibt es im Monat " _
& vbCr & vbCr & WorksheetFunction.Text("01." & mon & "." & jahr, "MMMM") _
& vbCr & vbCr & "nicht!", _
vbCritical + vbOKOnly, _
strTit
End If
Input2Date = DateSerial(jahr, mon, tag)
End Function


Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If Target.Address(0, 0) <> "C8" Then Exit Sub
With Target
Application.EnableEvents = False
.NumberFormat = "0"
.ClearContents
Application.EnableEvents = True
End With
End Sub

Servus aus dem Salzkammergut
Franz
Anzeige
AW: Gültiges Datum (ohne Punkteingabe) die 2.
FP
Hallo Jürgen,
hier nochmals eine leicht verbesserte Version:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
With Target(1)
If .Address(0, 0) = "C8" Then
Application.EnableEvents = False
.Value = Input2Date(.Value)
.NumberFormatLocal = "TT.MM.JJJJ"
If .Value = 0 Then
.Value = ""
Target.Select
End If
Application.EnableEvents = True
End If
End With
End Sub


Private Function Input2Date(strDatum As String) As Date
Dim tag     As Byte
Dim mon     As Byte
Dim jahr    As Integer
Dim strTit  As String
strTit = "Falsche Datumsangabe"
On Error Resume Next
'If VarType(WorksheetFunction.Text(strDatum, "00-00-0000") + 0) = vbDate Then
Input2Date = CDate(WorksheetFunction.Text(strDatum, "00-00-0000"))
If VarType(Input2Date) = vbDate And Input2Date > 0 Then
Exit Function
End If
On Error GoTo 0
If Len(strDatum) > 4 Then
jahr = Val(Right(strDatum, Len(strDatum) - 4))
Else
jahr = Year(Date)
End If
strDatum = Left(strDatum, IIf(Len(strDatum) > 5, 4, 3))
If Len(strDatum) < 3 Then
MsgBox "Datum muss mindestens 3 Stellen haben!" _
& vbCr & "Eingabe war aber: " & strDatum, _
vbCritical + vbOKOnly, _
strTit
Exit Function
End If
mon = Val(Right(strDatum, 2))
If mon > 13 Or mon = 0 Then
MsgBox "Eingegebenen Monat gibt es nicht", _
vbCritical + vbOKOnly, _
strTit
Exit Function
End If
tag = Val(Mid(strDatum, 1, Len(strDatum) - 2))
If tag = 0 Or tag > Day(DateSerial(jahr, mon + 1, 0)) Then
MsgBox "Diesen Tag gibt es im Monat " _
& vbCr & vbCr & WorksheetFunction.Text(CDate("01." & mon & "." & jahr), "MMMM") _
& vbCr & vbCr & "nicht!", _
vbCritical + vbOKOnly, _
strTit
Exit Function
End If
Input2Date = DateSerial(jahr, mon, tag)
End Function


Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If Target.Address(0, 0) <> "C8" Then Exit Sub
With Target
Application.EnableEvents = False
.NumberFormat = "0"
.ClearContents
Application.EnableEvents = True
End With
End Sub

Servus aus dem Salzkammergut
Franz
Anzeige
Nicht zu glauben .... !!!!
Jürgen
Hallo Kurt,Nancy,Mathias,Florian, Franz!
Ich habe den Fortgang des Threads seit Sonntag nicht einsehen können und bin jetzt echt erschlagen von Eurer Hilfsbereitschaft und Mühen, mir bei der Frage zu helfen.
VIELEN DANK!
Hier ist doch fundiertes Know How zu Tage gekommen. Am meisten hilft mir zunächst die DateSerial Funktion. Die umfangreichen Lösungen arbeiten teilweise fast perfekt. Ich werde später dieses Thema nochmal überarbeiten, ich denke endlich mal eine perfekte Lösung zu diesem Thema können viele gebrauchen. Meiner Meinung nach muss die Lösung so aussehen, dass zunächst die eigentliche Funktionalität der Excel-Datumshandhabung uneingeschränkt bestehen muss und zusätzlich die Eingabe 6stellig korrekt zu akzeptieren ist (eine 4 und 5 stellige Eingabe halte ich persönlich für entbehrlich).
Besten Dank nochmals,
Jürgen
AW: Nicht zu glauben .... !!!!
21.04.2004 09:54:12
Matthias
Hallo Jürgen,
ist ein tolles Forum, gell? ;-)
Grüße,
Matthias

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige