Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

VBA - Umwandeln von Daten vor 1900

Forumthread: VBA - Umwandeln von Daten vor 1900

VBA - Umwandeln von Daten vor 1900
11.02.2026 19:19:45
Christian
Hallo,

ich bitte euch um Hilfe.
In der Datei gibt es ein Makro, dass auf Eingabe in Spalte E reagiert und in Spalte F Prozentzahlen berechnet.
Diese Logik soll auch so beibehalten werden.

Meine Frage ist, kann man dem etwas hinzufügen, damit ich in Spalte E auch Texte a la z.b. 18.11.1898 (also Daten vor 1900) eingeben kann und das Makro diese dann so umwandelt, dass sie in die Berechnung der Prozentwerte mit einbezogen werden?

Das Ganze soll intern im Makro geschehen, es soll keine Umwandlung auf dem Tabellenblatt stattfinden.

Danke
Christian

https://www.herber.de/bbs/user/180269.xlsm

PS: Fahre morgen bis Aschermittwoch in Urlaub, auf Beiträge die ab morgen geschrieben werden, kann es sein dass ich länger als gewöhnlich brauche um zu reagieren.
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - Umwandeln von Daten vor 1900
11.02.2026 20:45:37
daniel
das Problem in diesem Forum ist, dass die Fragen nach einer Woche aus dem "offiziellen" Forum ins Archiv verschoben werden, wo man dann nicht mehr antworten kann.
Auch für Helfer ist es angenehmer, wenn sie zeitnah Feedback bekommen.
Daher solltest du eine Frage nur dann stellen, wenn du die nächsten Tage auch antworten kannst.

Wenn es nur um die Reihenfolge geht, könntest du alle Datumswerte in Text umwandeln in der Form Jahr-Monat-Tag
dann stimmt die Sortierreihenfolge .

Gruß Daniel






Anzeige
AW: VBA - Umwandeln von Daten vor 1900
11.02.2026 21:22:31
Christian
Hallo Daniel,

nein ich hatte schon vor einmal am Tag hier reinzuschauen, sonst hätte ich nicht gepostet. Nur normalerweise mache ich das öfter wenn ich hier was poste. Sorry für das Misverständnis, ich werde dann mal schauen, ob ich deinen Vorschlag in die Tat umgesetzt bekomme.

Gruß
Christin

Anzeige
zur Reihenfolge
11.02.2026 21:24:41
Christian
der Sinn des Makros ist, neben die jüngsten 1% der Daten 1% zu schreiben, neben die nächstjüngeren dann 2%, neben die nächsten 3% usw. bis dann irgendwann neben den ältesten 1% 100% steht.

Bevor es da Misverständnisse gibt.
Gruß
Christian
ich denke ich habe eine Lösung
11.02.2026 21:46:21
Christian
zumindest funktioniert sie in der geposteten Testdatei



'==============================

' Standardmodul
'==============================
Public Sub AktualisiereSpalteE(Optional ByVal ws As Worksheet)
On Error GoTo Cleanup

' Blatt setzen, falls nichts übergeben wurde
If ws Is Nothing Then Set ws = ThisWorkbook.Sheets("Tabelle1") ' - Namen anpassen

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

Dim Zelle As Range
Dim LetzteZeile As Long

' Letzte Zeile in Spalte E
LetzteZeile = ws.Cells(ws.Rows.Count, "E").End(xlUp).Row

' Spalte E: Datum formatieren, nur wenn Jahr >= 1900
For Each Zelle In ws.Range("E1:E" & LetzteZeile)
If IsDate(Zelle.Value) Then
If Year(Zelle.Value) >= 1900 Then
Zelle.Value = CDate(Zelle.Value)
Zelle.NumberFormat = "dd.mm.yyyy"
End If
End If
Next Zelle

' Ranking neu berechnen
BerechneCodesRanking ws

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

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


Public Sub BerechneCodesRanking(ws As Worksheet)
Dim Eingabearray As Variant
Dim DatumArray() As Double
Dim Ausgabearray() As Variant
Dim RangDict As Object
Dim GesamtZeilen As Long
Dim i As Long, j As Long
Dim AnzahlGueltigerDaten As Long
Dim LetztesDatum As Double

' Daten aus Spalte E einlesen
GesamtZeilen = ws.Cells(ws.Rows.Count, "E").End(xlUp).Row
Eingabearray = ws.Range("E1:E" & GesamtZeilen).Value

' Nur gültige Datumswerte zählen
AnzahlGueltigerDaten = 0
For i = 1 To GesamtZeilen
If IsDate(Eingabearray(i, 1)) Or Trim(Eingabearray(i, 1)) > "" Then
AnzahlGueltigerDaten = AnzahlGueltigerDaten + 1
End If
Next i

If AnzahlGueltigerDaten = 0 Then Exit Sub

' DatumArray dimensionieren
ReDim DatumArray(1 To AnzahlGueltigerDaten)
j = 1
For i = 1 To GesamtZeilen
If IsDate(Eingabearray(i, 1)) Or Trim(Eingabearray(i, 1)) > "" Then
DatumArray(j) = DatumZuSortierwert(Eingabearray(i, 1))
j = j + 1
End If
Next i

' Absteigend sortieren
QuickSortDatum DatumArray, 1, AnzahlGueltigerDaten

' RangDictionary erstellen
Set RangDict = CreateObject("Scripting.Dictionary")
For i = 1 To AnzahlGueltigerDaten
If i = 1 Or DatumArray(i) > LetztesDatum Then
RangDict(CStr(DatumArray(i))) = i
End If
LetztesDatum = DatumArray(i)
Next i

' Ausgabe vorbereiten
ReDim Ausgabearray(1 To GesamtZeilen, 1 To 1)
For i = 1 To GesamtZeilen
If IsDate(Eingabearray(i, 1)) Or Trim(Eingabearray(i, 1)) > "" Then
Ausgabearray(i, 1) = WorksheetFunction.RoundUp( _
RangDict(CStr(DatumZuSortierwert(Eingabearray(i, 1)))) / AnzahlGueltigerDaten, 2)
End If
Next i

' Ergebnisse in Spalte F schreiben
ws.Range("F1").Resize(GesamtZeilen, 1).Value = Ausgabearray
ws.Range("F1").Resize(GesamtZeilen, 1).NumberFormat = "0%"
End Sub


Private Function DatumZuSortierwert(ByVal v As Variant) As Double
Dim Teile() As String
Dim Tag As Long, Monat As Long, Jahr As Long

' Wenn Excel es als Datum erkennt
If IsDate(v) Then
Jahr = Year(v)
Monat = Month(v)
Tag = Day(v)
DatumZuSortierwert = Jahr * 10000# + Monat * 100# + Tag
Exit Function
End If

' Wenn Text "dd.mm.yyyy"
If InStr(v, ".") > 0 Then
Teile = Split(v, ".")
If UBound(Teile) = 2 Then
Tag = Val(Teile(0))
Monat = Val(Teile(1))
Jahr = Val(Teile(2))
DatumZuSortierwert = Jahr * 10000# + Monat * 100# + Tag
Exit Function
End If
End If

' Sonst 0 zurückgeben
DatumZuSortierwert = 0
End Function

Private Sub QuickSortDatum(ByRef arr() As Double, ByVal IndexUnten As Long, ByVal IndexOben As Long)
Dim PivotWert As Double
Dim TempWert As Double
Dim Links As Long
Dim Rechts As Long

Links = IndexUnten
Rechts = IndexOben
PivotWert = arr((IndexUnten + IndexOben) \ 2)

Do While Links = Rechts
Do While arr(Links) > PivotWert
Links = Links + 1
Loop
Do While arr(Rechts) PivotWert
Rechts = Rechts - 1
Loop
If Links = Rechts Then
TempWert = arr(Links)
arr(Links) = arr(Rechts)
arr(Rechts) = TempWert
Links = Links + 1
Rechts = Rechts - 1
End If
Loop

If IndexUnten Rechts Then QuickSortDatum arr, IndexUnten, Rechts
If Links IndexOben Then QuickSortDatum arr, Links, IndexOben
End Sub




Gruß
Christian
Anzeige
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18