HERBERS
Excel-Forum
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Entdecke rund 2 Millionen Excel-Lösungen im
Forumsarchiv

Beiträge zum Thread: eingegebenes Datum mit VBA in TT.MM.JJJJ umwandeln

Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
Christian
27.04.2026 09:36:05
eingegebenes Datum mit VBA in TT.MM.JJJJ umwandeln
Hallo, ich bitte euch um Hilfe.
Ist es irgendwie möglich mit VBA folgendes zu erreichen (automatisch bei Eingabe in Spalte E)

Eingabe: 1974 Ausgabe 31.12.1974 (also Jahresende)
Eingabe Januar 1974 Ausgabe 31.01.1974 (also Monatsende)
Eingabe eines kompletten Datums, Ausgabe dieses Datums in TT.MM.JJJJ, also keine Umwandlung ins Monatsende, wenn ich den Monatsersten mit eingegeben habe

Das Ganze soll natürlich auch für die anderen 11 Monate und alle anderen Jahrgänge funktionieren.
Die Daten werden so wie ich sie als Eingabe beschrieben habe aus dem Internet kopiert und in Excel eingefügt.

Vielen Dank
Christian

PS: Ich weiß dass meine bisherigen Versuche vermutlich daran gescheitert sind, dass Excel aus der Eingabe Januar 1974 intern den 1.1.74 macht und danach nicht mehr unterscheiden kann, ob ich den Tag mit eingegeben hatte oder nicht. Ich hoffe ihr kennt trotzdem eine Lösung
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
Case
27.04.2026 09:59:01
Im Anhang ist...
Moin Christian, :-)

... ein Ansatz: ;-)
https://www.herber.de/bbs/user/180625.xlsb

Servus
Case
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
Christian
27.04.2026 10:16:09
AW: Im Anhang ist...
Hallo Case,

erstmal vielen Dank für deine Mühe.
Was heißt hier Ansatz, das war eine funktionierende Lösung, die ich nur noch habe in meinen Code einbauen müssen. Dieser sieht jetzt so aus, funktioniert:

Private Sub Worksheet_Change(ByVal Target As Range)

On Error GoTo Cleanup

Dim rngE As Range, rngH As Range, rngOP As Range
Dim zelle As Range

Set rngE = Intersect(Target, Me.Columns("E"))
Set rngH = Intersect(Target, Me.Columns("H"))
Set rngOP = Intersect(Target, Me.Columns("O:P"))

If rngE Is Nothing And rngH Is Nothing And rngOP Is Nothing Then Exit Sub

Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

' =========================
' SPALTE E (Forum-Logik)
' =========================
If Not rngE Is Nothing Then
For Each zelle In rngE
Call FormatZelle_E(zelle)
Next zelle
End If

' =========================
' SPALTE H (nur Format + Ranking)
' =========================
If Not rngH Is Nothing Then
For Each zelle In rngH
Call FormatZelle(zelle)
Next zelle

BerechneCodesRanking Me
End If

' =========================
' AUTO FIT
' =========================
If Not rngOP Is Nothing Then
Me.Columns("A:Q").AutoFit
End If

Cleanup:
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

If Err.Number <> 0 Then
MsgBox "Fehler " & Err.Number & ": " & Err.Description, vbExclamation, "Worksheet_Change"
End If
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim wsQ As Worksheet, wsZ As Worksheet
Dim freieZeile As Long, zielZeile As Long
Dim Antwort As VbMsgBoxResult
Dim wertB As String
Dim i As Integer

Set wsQ = ThisWorkbook.Sheets("Codes")
Set wsZ = ThisWorkbook.Sheets("NV")

freieZeile = wsQ.Cells(wsQ.Rows.Count, "D").End(xlUp).Row + 1

If Target.Row <> freieZeile Then Exit Sub

Cancel = True

wertB = UCase(Trim(wsQ.Cells(Target.Row, "B").Value))

If wertB = "UNKNOWN" Or wertB = "UNKNOWNS" Then
wsQ.Rows(Target.Row).Delete
Exit Sub
End If

Antwort = MsgBox("Soll die Zeile verschoben werden?" & vbCrLf & _
"Ja = Verschieben nach NV" & vbCrLf & _
"Nein = Nur löschen", _
vbYesNoCancel + vbQuestion, "Aktion auswählen")

If Antwort = vbCancel Then Exit Sub

If Antwort = vbYes Then
zielZeile = wsZ.Cells(wsZ.Rows.Count, "A").End(xlUp).Row + 1

For i = 1 To 3
With wsZ.Cells(zielZeile, i)
.Value = wsQ.Cells(Target.Row, i).Value
.Font.Color = wsQ.Cells(Target.Row, i).Font.Color
.Font.Italic = True
.HorizontalAlignment = xlCenter
End With
Next i

With wsZ.Cells(zielZeile, 4)
.Value = wsQ.Cells(Target.Row, "Q").Value
.Font.Color = wsQ.Cells(Target.Row, "Q").Font.Color
.Font.Italic = True
.HorizontalAlignment = xlCenter
End With

wsZ.Columns("A:D").AutoFit
End If

wsQ.Rows(Target.Row).Delete

End Sub

Private Sub FormatZelle_E(ByVal zelle As Range)

If Len(zelle.Value) = 0 Then
Me.Cells(zelle.Row, "K").ClearContents
Exit Sub
End If

If zelle.Hyperlinks.Count > 0 Then zelle.Hyperlinks.Delete

Dim strTMP As String
Dim datDate As Date

strTMP = Trim(zelle.Text)

' -------------------------
' 1) Jahr ? 31.12.JJJJ
' -------------------------
If strTMP Like "####" And IsNumeric(strTMP) Then
zelle.Value = DateSerial(CLng(strTMP), 12 + 1, 0)

' -------------------------
' 2) Monat + Jahr ? Monatsende
' -------------------------
ElseIf IsDate("1 " & strTMP) Then
datDate = CDate("1 " & strTMP)
zelle.Value = DateSerial(Year(datDate), Month(datDate) + 1, 0)

' -------------------------
' 3) vollständiges Datum ? ??? lassen
' -------------------------
ElseIf IsDate(strTMP) Then
zelle.Value = CDate(strTMP)
End If

zelle.NumberFormat = "dd.mm.yyyy"

' Styling
With zelle
.Font.Size = 11
.Font.Name = "Calibri"
.Font.Italic = True
.Font.Bold = False
.HorizontalAlignment = xlCenter
.Font.Color = Me.Cells(.Row, "A").Font.Color
End With

End Sub

Private Sub FormatZelle(ByVal zelle As Range)

If Len(zelle.Value) = 0 Then Exit Sub

If zelle.Hyperlinks.Count > 0 Then zelle.Hyperlinks.Delete

If IsDate(zelle.Value) Then
zelle.Value = CDate(zelle.Value)
zelle.NumberFormat = "dd.mm.yyyy"
End If

With zelle
.Font.Size = 11
.Font.Name = "Calibri"
.Font.Italic = True
.Font.Bold = False
.HorizontalAlignment = xlCenter
.Font.Color = Me.Cells(.Row, "A").Font.Color
End With

End Sub


Gruß
Christian
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
Case
27.04.2026 10:58:16
Das mit dem...
Moin Christian, :-)

... Ansatz habe ich geschrieben, da dein Hinweis die Daten aus dem Internet zu laden, für mich die Möglichkeit beinhaltet, dass auch andere Formate vorkommen können (Jan 1974, January 1974, 1974-01, 1974/01...). ;-)

Müsste dann noch abgefangen werden. ;-)

Servus
Case
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
Christian
27.04.2026 11:36:27
AW: Das mit dem...
ach so, das hätte ich auch deutlicher schreiben können, es gibt zwar verschiedene aber Januar 1974 und 1974 waren die einzigen, die durch Excel bzw. das bereits vorhandene nicht korrekt umgewandelt wurden (bzw andre Monate / Jahre)

Vielen Dank
Christian
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
Yal
27.04.2026 10:13:05
AW: eingegebenes Datum mit VBA in TT.MM.JJJJ umwandeln
Hallo Christian,

dein Problem kann extrem komplex werden, wenn man die Voraussetzung annimmt, wie Du sie beschreibst.
Jedoch kann man die Lösung extrem einfach haben, wenn der erfassende Mensch bereit wäre, eine Einschränkung im Kauf zu nehmen: das Datum müsste in der Form
JJJJ-MM-TT erfasst werden!
Also zuerst Jahr, Monat als Zahl und Tag als Zahl, jeweils mit "-" getrennt. Es ist übrigens die ISO-Form eines Datums (daher nicht aus persönlicher Kreativität entstanden).
Man dürfte dabei den Tag oder Monat und Tag (und jeweilige "-") weglassen: 1974, 1974-11, usw.

Eine automatische Korrektur erfolgt mit folgendem Code:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim D

Application.EnableEvents = False
On Error Resume Next
D = Split(Target.Value & "-99-99", "-")
If D(1) = 99 Then D(1) = 12
If D(2) = 99 Then D(2) = Day(DateSerial(D(0), D(1) + 1, 0))
Target.Value = Format(DateSerial(D(0), D(1), D(2)), "DD.MM.YYYY")
Application.EnableEvents = True
End Sub

Auf dem Register des Arbeitsblattes rechtklicken, "Code anzeigen" auswählen und Code in der gerade geöffneten Modul reinkopieren.

Achtung: bei Eingabe ausserhalb der Rahmen, also Monat > 12 oder Tag > Tag-im-Monat, wird ein Datum trotzdem berechnet! Monat 13 = Januar vom nächsten Jahr, usw.

VG
Yal
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
Christian
27.04.2026 10:20:57
AW: eingegebenes Datum mit VBA in TT.MM.JJJJ umwandeln
Hallo Yal,

erstmal vielen Dank.
Das Problem ist jetzt nur, wie bringe ich es ins Format JJJJ-MM-TT. Wie ich ja bereits sagte, ich mache da Copy + Paste von einer Internetseite (IMDB).
Das einzige, was mir da einfällt, ist abtippen im entsprechenden Format. Was zu dem Problem führt, weshalb ich das Ganze überhaupt angefragt habe, um Tippfehler bei den Daten zu vermeiden, die ich nicht 1:1 kopieren und einfügen kann.
Wobei ich dann ja auch direkt anstatt es im Format JJJJ-MM-TT einzugeben auch direkt das gewünschte Ergebnis eintippen kann.
Oder wie hast du dir das vorgestellt? Anders als so habe ich deinen Beitrag leider nicht verstanden.

Gruß
Christian
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
Yal
27.04.2026 18:51:41
AW: eingegebenes Datum mit VBA in TT.MM.JJJJ umwandeln
Hallo Christian,

für mich bedeutet "Dateneingabe", dass die Daten eingegeben werden, also eingetippt.
Beim Copy-Paste werden die Daten "reinkopiert".
Wie üblich, die richtige Antwort bekommt man mit der richtigen Frage. Der Prozess, sich die richtige Frage zu überlegen, führt auch oft zu selbst gefundenen Lösungen. Also es lohnt sich.

VG
Yal
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
Christian
27.04.2026 19:07:33
AW: eingegebenes Datum mit VBA in TT.MM.JJJJ umwandeln
Hallo yal, im Eingangspost steht, dass
die daten aus dem Internet kopiert und in Excel eingefügt werden.

Genau deshalb habe ich es ja dazugeachrieben.

Außerdem was macht es für einen Unterschied, ob ich es eintippe oder mit strg+v einfüge? Wenn es in diesem Fall einen Unterschied macht, kenne ich ihn nicht.

Gruß Christian
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
snb
27.04.2026 11:40:36
AW: eingegebenes Datum mit VBA in TT.MM.JJJJ umwandeln
Verzichte auf AI.

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Columns(5)) Is Nothing Then
Application.EnableEvents = False

For Each it In Target.Cells
If Len(Trim(it)) = 4 And IsNumeric(Trim(it)) Then it.Value = CDate("31-12-" & Trim(it))
If Trim(it) <> "" And Trim(it.Text) <> Format(it, "dd-mm-yyyy") Then it.Value = Application.EoMonth(it, 0)
it.NumberFormat = "DD.MM.YYYY"
Next

Application.EnableEvents = True
End If
End Sub

Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
Christian
27.04.2026 12:03:34
AW: eingegebenes Datum mit VBA in TT.MM.JJJJ umwandeln
Hallo SNB,

ich glaube wenn ich alles was ich mit KI programmiert habe einen Programmierer beauftragt hätte, hätte der gefühlt einen Monat Vollzeit zu tun gehabt.
Bin da doch sehr dankbar.
Nur in manchen Fällen wie diesen, konnte mir die KI nicht weiterhelfen.
Aber nun zu deinem Vorschlag. So ganz funktioniert er leider nicht. Wenn ich "1. Januar 1974" oder auch alle anderen Daten mit vorhandenem Tag aus dem Internet nach Spalte E kopiere, macht er daraus das Monatsende.
Die Umwandlung wenn Tag oder auch Monat fehlt, funktioniert.
Bin jetzt erstmal unterwegs, kann mich erst spät abends wieder melden.

Gruß
Christian
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
daniel
27.04.2026 13:44:44
AW: eingegebenes Datum mit VBA in TT.MM.JJJJ umwandeln
HI
du musst hier einer Fallunterscheidung machen:
a) Eingabe nur Jahreszahl
b) Eingabe mit Monat und Jahr
c) Eingabe vollständig.

dabei wäre es hilfreich zu wissen, welche Varianten der Datumseingabe alles vorkommen können.
Wenn du es aus dem Internet kopierst, dann müsste es ja halbwegs eindeutig sein.

wichtig wäre, dass du die Werte als TEXT übernimmst, damit Excel nicht schon von alleine anfängt, wie Werte in Datumswerte umzuwandeln.
dh du solltest sie dann auch nicht direkt überschreiben, sondern das ermittelte Datum in die Nachbarzelle schreiben, denn dort willst du dann ja nicht Texte, sondern Zahlen haben.

die Umwandlung mit der Fallunterscheidung könnte dann für einen Wert so aussehen:

dim Eingabe as string

dim Datum as string

Eingabe = ".. dein Datumsstext..."

If Eingabe like "####" Then '--- nur die Jahreszahl
Datum = Cdate("31.12." & Eingabe)
Else If Eingabe like "[JFMASOND]* ####" Then '--- Monat und Jahreszahl am ende
Datum = Worksheetfunction.EoMonth(CDate(Eingabe), 0)
Elseif IsDate(Eingabe) then '--- ale anderen Texte, die wie ein Datum aussehen
Datum = Cdate(Eingabe)
Else
Datum = "Datum nicht ermittelbar
end if
Cells(x, y).FormulaLocal = Datum



Achtung, ich behandle die Variable "Datum" als Textstring, damit ich auch die Fehlermeldung ohne Fehler ausgeben kann.
damit der Text dann von Excel in ein korrekte Datum übernommen wird, sollte man den Wert in die .FormulaLocal-Eigenschaft der Zelle schreiben.
Würde man in .Value schreiben, bräuchte man das amerikanische Format. Das CDate erzeugt aber das deutsche (bzw das Lokale), daher der Wert in .FormulaLocal.

Gruß Daniel
Forumbeitrag
Excel-Version des Fragestellers:
365 privat
Erfahrungslevel des Fragestellers:
Basiskenntnisse in VBA
Christian
27.04.2026 13:58:20
AW: eingegebenes Datum mit VBA in TT.MM.JJJJ umwandeln
Hallo Daniel, schreibe im Moment vom Handy aus, bin erst heute abend wieder zuhause um es testen zu können. Aber ich kann soviel schonmam sagen, die Daten haben alle das Format 1. Januar 1974 also Monat ausgeschrieben, Tag ohne führende 0 und Jahr 4stellig. Diese Daten sollen wie sie sind in tt.mm.jjjj umgewandelt werden. Bei manchen fehlt der Tag oder teilweise zusätzlich auch der Monat. In diesem Fall soll dann der monats- bzw. Im zweiten Fall das Jahresende ausgegeben werden. Auch im Format tt.mm.jjjj

Gruß
Christian

Vielen Dank schonmal