Office: Datum in Userform formatieren

Helfe beim Thema Datum in Userform formatieren in Microsoft Word Hilfe um das Problem gemeinsam zu lösen; Hallo! Ich habe folgende Herausforderung: Word 365. In einer Userform gibt es zwei Textboxen (TB_Datum und TB_Datum für Termin) In die Textbox... Dieses Thema im Forum "Microsoft Word Hilfe" wurde erstellt von Al3x05, 10. September 2023.

  1. Al3x05 User

    Datum in Userform formatieren


    Hallo!

    Ich habe folgende Herausforderung:

    Word 365. In einer Userform gibt es zwei Textboxen (TB_Datum und TB_Datum für Termin)

    In die Textbox TB_Datum soll ein Datum eingetragen werden können.

    Wenn die Textbox TB_Datum keinen Wert enthält soll der weitere Code (Textmarken ersetzen) ausgeführt werden, die nachfolgende Überprüfung aber nicht.

    Wenn irgendetwas in der Textbox TB_Datum eingetragen ist, soll der Inhalt wie folgt überprüft werden:

    Das Datum soll in das richtige Format gebracht werden – wenn z.B. „6.4.24“ eingegeben wird soll das Ergebnis 06.04.2024 sein.

    Gegebenenfalls vervollständigt werden - wenn z.B. „2.7.“ eingegeben wird soll das Ergebnis das nächstmögliche Datum mit demselben Tag und Monat sein, hier der 02.07.2024.

    Auf Richtigkeit überprüft werden – wenn z.B. „36.13.“ oder „29.02.2023“ eingegeben wird soll eine Messagebox erscheinen, die zur Korrektur des Datums auffordert.

    Darauf überprüft werden, ob es in der Vergangenheit liegt – wenn z.B. „2.2.2023“ eingegeben wird soll eine Messagebox erscheinen, die zur Eingabe eines Datums in der Zukunft auffordert.

    In die Textbox „TB_Datum_für_Termin“ übertragen werden, wobei 14 Tage addiert werden sollen. – wenn das Datum „20.04.2023“ lautet soll das Ergebnis 04.05.2023 sein.

    Die Messageboxen sollen das Ändern der Textbox TB_Datum in der Userform zulassen.

    Meine gescheiterten Versuche:

    Code:
    Option Explicit
    
    Private Sub CommandButton1_Click()
        Dim TB_Datum As String
        Dim TB_Datum_für_Termin As String
        Dim validDate As Date
        
        TB_Datum = Trim(Me.TB_Datum.Text)
        
        ' Überprüfen, ob TB_Datum leer ist
        If TB_Datum = "" Then
            ' Hier können Sie den weiteren Code ausführen, wenn TB_Datum leer ist
            Exit Sub
        End If
        
        ' Versuchen, das Datum zu analysieren
        On Error Resume Next
        validDate = DateValue(TB_Datum)
        On Error GoTo 0
        
        ' Überprüfen, ob das Datum im richtigen Format ist
        If IsDate(validDate) Then
            ' Überprüfen, ob das Datum in der Vergangenheit liegt
            If validDate < Date Then
                MsgBox "Bitte geben Sie ein Datum in der Zukunft ein.", vbExclamation
                Me.TB_Datum.Text = ""
                Exit Sub
            End If
            
            ' Das Datum für TB_Datum_für_Termin berechnen (14 Tage hinzufügen)
            validDate = validDate + 14
            TB_Datum_für_Termin = Format(validDate, "dd.mm.yyyy")
            Me.TB_Datum_für_Termin.Text = TB_Datum_für_Termin
        Else
            ' Datum ist ungültig
            MsgBox "Bitte geben Sie ein gültiges Datum im Format dd.mm.yy ein.", vbExclamation
            Me.TB_Datum.Text = ""
        End If
    
    
    ' Anderer Ansatz:
    '' Datum überprüfen funktioniert
    '    Dim inputDate As String
    '    Dim formattedDate As String
    '    Dim currentDate As Date
    '
    '    ' Datum in das richtige Format (dd.mm.yyyy) bringen
    '    inputDate = Me.TB_Datum.Value
    '    formattedDate = FormatDate(inputDate)
    '
    '    ' Wenn das Datum nur aus dem Format "d.m." besteht, das aktuelle Jahr hinzufügen
    '    If InStr(formattedDate, ".") > 0 And Len(formattedDate) < 10 Then
    '        formattedDate = formattedDate & "." & Year(Date)
    '    End If
    '
    '    ' Datum auf Gültigkeit prüfen
    '    If Not IsDate(formattedDate) Then
    '        MsgBox "Das eingegebene Datum hat nicht das richtige Format (TT.MM.JJJJ).", vbExclamation
    '        Exit Sub
    '    End If
    '
    '    ' Datum auf Zukunft prüfen
    '    currentDate = Date
    '    If DateValue(formattedDate) <= currentDate Then
    '        MsgBox "Das Datum muss in der Zukunft liegen.", vbExclamation
    '        Exit Sub
    '    End If
    '
    '    ' Datum in die andere TextBox übertragen
    '    Me.TB_Datum_für_Termin.Value = formattedDate
    
    'Textmarken ersetzen
        Dim bmName As String
        Dim bmRange As Range
        Dim ctrl As Control
        Dim bm As Bookmark
        Dim prefixLength As Byte
    
        prefixLength = 8
    
        ' Durchlaufe alle Steuerelemente im aktuellen Objekt
        For Each ctrl In Me.Controls
            ' Prüfe, ob das Steuerelement ein Textfeld ist
            If TypeName(ctrl) = "TextBox" Then
                bmName = ctrl.Name
    
                ' Durchlaufe alle Textmarken im aktiven Dokument
                For Each bm In ActiveDocument.Bookmarks
                    ' Prüfe, ob die ersten N Buchstaben der Namen der Textmarke und des Textfelds übereinstimmen
                    If Left(bm.Name, prefixLength) = Left(ctrl.Name, prefixLength) Then
                        ' Setze den Text der Textmarke auf den Text des Textfelds
                        Set bmRange = bm.Range
                        If ctrl.Text <> "" Then
                            bmRange.Text = ctrl.Text
                        End If
                    End If
                Next bm
            End If
        Next ctrl
    
    Unload Me
    End Sub
    Würde mich sehr freuen, wenn mir da jemand weiterhelfen kann.

    Vielen Dank!

    Alex

    PS: Anbei das Dokument.
     
  2. Gerhard H
    Gerhard H Erfahrener User
    Hallo Al,

    erst mal eine prinzipielle Frage: Wäre es nicht einfacher, für die Datumseingabe und das berechnete Datum je ein Inhaltssteuerelement vorzusehen? Dann könnten die Eingaben direkt im Dokument erfolgen; das Gehubere mit den Textmarken würde sich in Luft auflösen. Und die Prüfung auf gültiges Datum könnte man genau so vornehmen.

    Was die diese Prüfung betrifft, würde ich anders vorgehen als du: Ich würde nie versuchen, unvollständige Datumseingaben interpretieren zu lassen. Besonders wenn die Jahrezahl fehlt, wie willst du die erraten? Und wer so schlampert, dass er nur "2.7." eintippt, gehört elektronisch gerügt. Ich würde es so machen:

    1. Eingabebox auf leer Prüfen - wenn leer, dann - (was? Textmarken mit leeren Zeichen füllen ist doch unsinnig?)
    2. Eingabebox auf Zeichenlänge 10 prüfen (das wäre wenigstens von der Länge her das gewünschte Datumsformat), wenn ungleich 10 dann Abbruch
    3. auf gültiges Datum prüfen - wenn ungültig, dann Abbruch
    4. Datum auf größer heute prüfen - wenn kleiner oder gleich, dann Abbruch
    5. Dann erst rechnen und eintragen

    Jeden Abbruch mit einer lehrreichen Rüge (Messagebox) versehen, und dann endlich die Berechnung vornehmen.
    Das schaut dann als Makro in der Userform so aus:
    Code:
    Private Sub CommandButton1_Click()
        Dim TB_Datum As String
        Dim TB_Termin As String
        Dim validDate As Date
        
        TB_Datum = Trim(Me.TB_Datum.Text)
        
        ' Überprüfen, ob TB_Datum leer ist
        If TB_Datum = "" Then
            ' Hier können Sie den weiteren Code ausführen, wenn TB_Datum leer ist
            MsgBox "Da ist nix drin"
            Exit Sub
        End If
        
        ' Überprüfen, ob die Eingabe 10 Zeichen lang ist
        If Len(TB_Datum) <> 10 Then
            MsgBox "Das Datum bitte in der Form TT.MM.JJJJ eingeben!"
            Exit Sub
        End If
        
        'Prüfen, ob die Eingabe als Datum interpretierbar ist
        If Not IsDate(TB_Datum) Then
            MsgBox TB_Datum & " ist kein gültiges Datum!"
            Exit Sub
        End If
        
        'Prüfen, ob Datum in der Vergangenheit liegt:
        validDate = CDate(TB_Datum)
        
            If validDate < Date Then
                MsgBox "Bitte geben Sie ein Datum in der Zukunft ein.", vbExclamation
                Me.TB_Datum.Text = ""
                Exit Sub
            End If
        
        'jetzt endlich rechnen und eintragen:
        TB_Termin = validDate + 14
        Me.TB_Datum_für_Termin = Format(TB_Termin, "dd.mm.yyyy")
    
    End Sub
    Wie du siehst, hab ich mir erlaubt, die Variable für den Termin umzubenennen, damit man nicht mit der Bezeichnung für die Textbox durcheinander kommt.
    Dieses Makro kannst du auf dein hochgeladenes Dokument anwenden. Den Übertrag ins Dokument hab ich mir aber noch nicht angeschaut; überleg dir doch erst mal, ob du nicht mit Inhaltssteuerelementen arbeiten willst.
     
    Gerhard H, 11. September 2023
    #2
    1 Person gefällt das.
  3. Al3x05 User
    Vielen Dank für deine Unterstützung!

    Zur Erklärung:
    Das Datum soll im fertigen Dokument an mehreren Stellen eingefügt werden. Manchmal brauch ich es aber nur an Stelle 2 und 3 oder nur an Stelle 6 etc. Eine Stelle, die immer benötigt wird (um darauf zu referenzieren) gibt es nicht.

    Erstens:
    Was sehr praktisch wäre: Wenn in der Textbox kein Wert eingetragen wird, soll die gleichnamige Textmarke auch nicht ersetzt werden. Da würde ich in der Vorlage an allen Stellen ein Inhaltssteuerelement platzieren. Damit kann man, wenn nur eine Stelle gebraucht wird, bequem ein Datum mit dem Inhaltssteuerelement auswählen.

    Zweitens:
    Ich habe jetzt deinen Code verwendet, Teile davon aber auskommentiert. Dabei ist mir etwas Interessantes aufgefallen: Wenn in der Textbox TB_Datum „2.2.24“ eingegeben und der Code ausgeführt wird, wird an der Stelle der Textmarke TB_Datum das Datum mit „2.2.24“ eingefügt, an der Stelle TB_Termin aber das Datum im richtigen Format „16.02.2024“. Anscheinend muss die Eingabe „2.2.24“ irgendwie als Datum erkannt werden. Ideal wäre es, wenn man die Eingabe in das richtige Format bringen könnte (wie bei TB_Termin) und dann die Überprüfung, ob es sich um ein gültiges Datum handelt, starten könnte.

    Hier der Code (auszugsweise)
    Code:
     Dim TB_Datum As String
        Dim TB_Termin As String
        Dim validDate As Date
        
         TB_Datum = Trim(Me.TB_Datum.Text)
        
    '    ' Überprüfen, ob TB_Datum leer ist
    '    If TB_Datum = "" Then
    '        ' Hier können Sie den weiteren Code ausführen, wenn TB_Datum leer ist
    '        MsgBox "Da ist nix drin"
    '        Exit Sub
    '    End If
    '
    '    ' Überprüfen, ob die Eingabe 10 Zeichen lang ist
    '    If Len(TB_Datum) <> 10 Then
    '        MsgBox "Das Datum bitte in der Form TT.MM.JJJJ eingeben!"
    '        Exit Sub
    '    End If
        
        'Prüfen, ob die Eingabe als Datum interpretierbar ist
        If Not IsDate(TB_Datum) Then
            MsgBox TB_Datum & " ist kein gültiges Datum!"
            Exit Sub
        End If
        
        'Prüfen, ob Datum in der Vergangenheit liegt:
        validDate = CDate(TB_Datum)
        
            If validDate < Date Then
                MsgBox "Bitte geben Sie ein Datum in der Zukunft ein.", vbExclamation
    '            Me.TB_Datum.Text = ""
                Exit Sub
            End If
        
        'jetzt endlich rechnen und eintragen:
        TB_Termin = validDate + 14
        Me.TB_Termin = Format(TB_Termin, "dd.mm.yyyy")
    
    
    Ich habe jetzt schon etwas herumprobiert, komme aber nicht auf die Lösung.

    Hast du da eine Idee?

    Anbei das überarbeitete Dokument.
     
  4. Gerhard H
    Gerhard H Erfahrener User

    Datum in Userform formatieren

    Hallo Al,

    ich bin mir grad nicht sicher, auf welche Lösung du nicht kommst, aber ich hab zwei Anmerkungen:

    1.
    Ja, der 2.2.24 wird auch als gültiges Datum erkannt. Aber auch der 32.12.24. Das hält VBA einfach die amerikanische Variante (Jahr-Monat-Tag), somit die 32 für das Jahr 2032 und schon ist es zwar ein gültiges Datum, aber nicht das, was dein Anwender gemeint hat, als er zu faul war, ein korrektes Datum einzutippen. Deshalb finde ich es ganz unideal, solche Kurzeingaben zuzulassen, und rate dir, die auskommentierten Zeilen wieder zuzulassen.
    Schon auch deshalb, um deinen Wunsch zu realisieren, Textmarken nicht zu ersetzen, wenn TB_Datum leer ist. Das hätte nämlich der Teil: IF TB_Datum = ""..... gemacht.

    2.
    Du brauchst, um Inhaltssteuerelemente anzusprechen, keine Textmarke. Du kannst deren Namen auch als Tag in den Inhaltssteuerelementen verwenden und sie dann so ansprechen:

    ActiveDocument.SelectContentControlsByTag("TB_Termin").Item(1).Range.Text = TB_Datum+14

    So würdest du die Schwierigkeit vermeiden, dass durch das Eintragen eines Wertes in eine Textmarke diese gelöscht wird - in deinem Fall mitsamt des Dropdowns. Da du mit einer Dokumentvorlage arbeitest, mag es sein, dass du den Vorgang nicht wiederholen musst und deshalb der Wegfall von Textmarke und Dropdown unerheblich ist. Aber ich wollte dich gewarnt haben
     
    Gerhard H, 13. September 2023
    #4
    1 Person gefällt das.
  5. czil hat Ahnung
    Ein etwas unorthodoxer Vorschlag: Füge doch einfach eine Excelzelle ein. Die kannst du, wenn du zwei davon hast, sogar miteinander kommunizieren lassen und all Formate von Excel für Datum verwenden.
    Vorteil: Wenn du 3-2 oder 3.2 oder 3/2 eingibst, wandelt Excel das in ein Datum des aktuellen Jahres um.
     
    1 Person gefällt das.
  6. Al3x05 User
    Vielen Dank für die Antworten und die Unterstützung!

    Vor allem die Möglichkeit die Inhaltssteuerelemente direkt anzusprechen kannte ich noch nicht. Vielen Dank dafür!

    Ich habe den Code jetzt noch überarbeitet und mich dabei für die Variante entschieden, die eine schnelle Eingabe zulässt aber zu Lasten der Überprüfungsmöglichkeit geht.

    Nachfolgend der Code für den Fall, dass jemand den Code oder Teile davon gebrauchen kann. Verbesserungspotential gibt es sicher noch.

    Code:
    Dim TB_VorDatum As String
    Dim TB_Datum As Date
    Dim TB_Termin As Date
    
    ' Überprüfen, ob TB_VorDatum leer ist
    TB_VorDatum = Trim(Me.TB_VorDatum.Text)
    If TB_VorDatum <> "" Then
        ' Den Wert in TB_Datum zu speichern und als Datum zu definieren
        On Error Resume Next
        TB_Datum = CDate(TB_VorDatum)
        On Error GoTo 0
       
        ' Überprüfen, ob die Eingabe ein gültiges Datum ist
        If TB_Datum = DateValue("01/01/1900") Then ' Standardwert für ungültiges Datum
            MsgBox "Bitte ein gültiges Datum eingeben!"
            Me.TB_VorDatum.Text = ""
            Exit Sub
        End If
       
        ' Prüfen, ob das Datum in der Vergangenheit liegt:
        If TB_Datum < Date Then
            MsgBox "Bitte geben Sie ein Datum in der Zukunft ein.", vbExclamation
            Me.TB_VorDatum.Text = ""
            Exit Sub
        End If
       
        ' Berechnen des Termins
        TB_Termin = TB_Datum + 14
       
        ' Verwenden der Tags für die Content Controls
        Dim TagDatum As String
        Dim TagTermin As String
        TagDatum = "TB_Datum"
        TagTermin = "TB_Termin"
       
        ' Überprüfen, ob das Tag "TB_Datum" im Dokument existiert
        If ActiveDocument.SelectContentControlsByTag(TagDatum).Count > 0 Then
            ' Schleife durch alle Inhaltselemente mit dem Tag "TB_Datum" und aktualisieren Sie den Wert
            Dim ccDatum As ContentControl
            For Each ccDatum In ActiveDocument.SelectContentControlsByTag(TagDatum)
                ccDatum.Range.Text = Format(TB_Datum, "dd.MM.yyyy")
            Next ccDatum
        Else
            MsgBox "Tag 'TB_Datum' wurde im Dokument nicht gefunden!", vbExclamation
        End If
       
        ' Überprüfen, ob das Tag "TB_Termin" im Dokument existiert
        If ActiveDocument.SelectContentControlsByTag(TagTermin).Count > 0 Then
            ' Schleife durch alle Inhaltselemente mit dem Tag "TB_Termin" und aktualisieren Sie den Wert
            Dim ccTermin As ContentControl
            For Each ccTermin In ActiveDocument.SelectContentControlsByTag(TagTermin)
                ccTermin.Range.Text = Format(TB_Termin, "dd.MM.yyyy")
            Next ccTermin
        Else
            MsgBox "Tag 'TB_Termin' wurde im Dokument nicht gefunden!", vbExclamation
        End If
    End If
    
     
  7. Gerhard H
    Gerhard H Erfahrener User
    Hallo Al,

    Hallo Al,

    magst du mal erklären, wie das hier gemeint ist:

    If TB_Datum = DateValue("01/01/1900") Then ' Standardwert für ungültiges Datum
    Die Fälle, in denen jemand genau dieses Datum (oder genau eine 2) eingibt, werden ja extrem selten sein. Wenn ich hier ein unsinniges Datum eingebe (z.B. 130.13), dient im günstigen Fall die Prüfung auf Datum in der Vergangenheit als Notbremse, im ungünstigen Fall (wenn die Eingabe nicht als Datum interpretiert werden kann) gibts den Laufzeitfehler "Typen unverträglich"

    Hast du das mal kontrolliert?
     
    Gerhard H, 17. September 2023
    #7
  8. Al3x05 User

    Datum in Userform formatieren

    Lieber Gerhard!

    Du hast absolut recht, das ergibt nicht viel Sinn. Danke für das Feedback!

    lg
     
Thema:

Datum in Userform formatieren

Die Seite wird geladen...
  1. Datum in Userform formatieren - Similar Threads - Datum Userform formatieren

  2. Serienbrief, Datum plus 7 Tage

    in Microsoft Word Hilfe
    Serienbrief, Datum plus 7 Tage: Hallo, ich wollte gerne in meinem Serienbrief um eine Rückantwort mit Datum bitten. Die Rückantwort soll 7 Tage nach dem aktuellen Datum erfolgen. Ich habe dazu folgendes gemacht: [ATTACH] Mein...
  3. letztes Datum finden

    in Microsoft Excel Hilfe
    letztes Datum finden: Hallo Leute, hab jetzt vergebens die KI bemüht mir eine einfache Formel zu erstellen.o_O Jetzt frag ich einfach mal hier da es ja meist besser funzt.*:)* Also: ich hab ne Tabelle in der ich in...
  4. Datum Suchen

    in Microsoft Excel Hilfe
    Datum Suchen: Hallo! Situation: In einem Formular wird ein Name einer Produktionsmaschine eingetragen. In einem anderem Textfeld steht das Lieferdatum. Bei klicken auf "Speichern" wird das Lieferdatum...
  5. Aktuelles Datum und Uhrzeit in Formular

    in Microsoft Word Hilfe
    Aktuelles Datum und Uhrzeit in Formular: Hallo, zunächst ein herzlichen Dank für die Aufnahme in diesem Forum und hoffe, dass mir jemand bei meinem Problem behilflich sein kann. Ich bin aktuell dabei ein Formular zu erstellen. Das...
  6. UserForm Datum und Zeit in Zelle eintragen lassen

    in Microsoft Excel Hilfe
    UserForm Datum und Zeit in Zelle eintragen lassen: Hallo Leute *Smilie Ich habe eine UserForm erstellt welche 3 Textfelder hat. Diese 3 Textfelder werden in die letzte nicht beschriebene Zelle eingefügt. Tabellenblatt: Daten TextBox1 kommt in...
  7. makro, datum suchen und die in userform eingetragen zahlen in einer tabelle eintragen

    in Microsoft Excel Hilfe
    makro, datum suchen und die in userform eingetragen zahlen in einer tabelle eintragen: Hallo @all Ich bräuchte nochmals eure Hilfe Ist es möglich dass wenn ich in userform1 Zahlen eintrage das ein Makro mir das heutige Datum in der Spalte 6 sucht und in den dazugehörigen Zellen...
  8. Datum und Uhrzeit in Userform

    in Microsoft Excel Hilfe
    Datum und Uhrzeit in Userform: Hallo zusammen, wie kann ich in meiner Userform: 1. Das Datum und die Uhrzeit soll so eingelesen werden, mit dem gleichen Format wie es in der Zelle I2 dargestellt ist >>Samstag, 02.06.2007 21:47...
Schlagworte:
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden