VBA - txt Datei einlesen und eindeutige ID erstellen anhand eines Datums

vba_2020

Grünschnabel
Hallo,

als Ausgangsbasis habe ich eine .txt datein in welcher Zeilenweise Personen aufgelistet sind welche sich zu einem bestimmten Datum eingeschrieben haben.
Beispiel:
Name;Vorname;Einschreibdatum;email
Diese lese ich erfolgreich ein und ich kann die Daten auch schon in eine Tabelle reinschreiben.

ThisWorkbook.Sheets(1).Range("E" & rowCounter).value = Name
ThisWorkbook.Sheets(1).Range("F" & rowCounter).value = email
ThisWorkbook.Sheets(1).Range("G" & rowCounter).value = ""
ThisWorkbook.Sheets(1).Range("H" & rowCounter).value = ""
ThisWorkbook.Sheets(1).Range("I" & rowCounter).value = ID

Mein Problem ist folgendes.
Ich möchte eine eindeutige ID anhand des Einschreibedatums errechnen. Diese soll wie folgt aussehen: YYYYMMTT001 und +1 wenn mehrere am gleichen Tag eingeschrieben wurden.

In der Art:
Dim matchcode As Long
matchcode = Format((InscrDate), "yyyymmdd")
Dim MatchcodeCounter As Long
MatchcodeCounter = CStr(Format("1", "000"))

Debug.Print (matchcode & Format(MatchcodeCounter, "000"))
Der MatchcodeCounter soll nach oben zählen wenn schon ein Eintrag da ist.

Kann mir da jemand helfen?

Vielen Dank
 

Zvoni

Erfahrenes Mitglied
Dann fangen wir mal:
Code:
Dim matchcode As Long
matchcode = Format((InscrDate), "yyyymmdd")
Du hast "matchcode" als Long, die Format-Funktion gibt von Haus aus aber einen String zurück.
Korrekt wäre: CLng(Format((InscrDate), "yyyymmdd"))
Code:
Dim MatchcodeCounter As Long
MatchcodeCounter = CStr(Format("1", "000"))
MatchCodeCounter ist ein Long, du wandelst aber explizit in String um (wegen den führenden Nullen) und das mit einem Literal "1"
Korrekt wäre: MyMatchCodeCounterAsString = Format(MatchCodeCounter,"000")

Was das hochzählen des MatchCodeCounters betrifft:
Willst du schon beim/während dem Einlesen mitzählen, oder erst in einem zweiten Schritt, nachdem alles schon drin ist?
Weil das zweite ist deutlich einfacher.

Das ganze in einem Rutsch zu machen würde glaube ich per unbound ADO-Recordset bzw. SQL gehen,
müsste ich aber selbst recherchieren, wie das nochmal geht.
Die ur-Datei scheint ja ein CSV mit semikolon als Trennzeichen zu sein. Müsste ich nochmal nachschlagen, ob man per ADO eine CSV wie eine Datenbank-Tabelle öffnen kann, und ob Jet-SQL Window-Funktionen (ROW_NUMBER) beherrscht
 

vba_2020

Grünschnabel
Hallo Zvoni,

vielen Dank für die schnelle Antwort und danke für den Tip mit der Format-Funktion

Zu dem Hochzählen:
also an sich ist es egal, ob es später passiert. Die Tabelle kann gefüllt werden und dann am Ende kann das Skript Anhand des Einschreibedatums die ID berechnen. Wenn das einfacher ist, dann bevorzuge ich das aufjedenfall :)
 

vba_2020

Grünschnabel
Eventuell könnte man auch nur die vorherige zeile vergleichen und hochzählen, wenn es der gleiche Wert wie der aktuelle ist denn die zu importierende Datei ist schon sortiert.
 

Zvoni

Erfahrenes Mitglied
Eventuell könnte man auch nur die vorherige zeile vergleichen und hochzählen, wenn es der gleiche Wert wie der aktuelle ist denn die zu importierende Datei ist schon sortiert.
Setzt voraus, dass die Datei schon nach Datum sortiert ist.
Ist das so? Willst du dich darauf verlassen?

EDIT: grmpf....kommt davon, wenn man nur die Hälfte liest.... Datei ist ja schon sortiert,
aber eben: Ist es nach Datum sortiert? In welchem Format ist das Datum in der Datei?
Je nach Antwort funktioniert dein "Format(InscrDate, "yyyymmdd") nämlich dann eh nicht

EDIT2: hmmm...... im Prinzip egal, in welchem Format das Datum ist, solange es innerhalb der Datei selbst konsistent ist (Also nicht ein Satz im deutschen Format "dd.mm.yyyy" und 5 Sätze später im ISO-Format "yyyy-mm-dd"). Wenn dann selbst Alphanumerische Sortierung greift (der "03.05.2021 " liegt vor dem "21.03.2021") ist es auch egal, weil eh alle zusammenhängenden Tage beieinander liegen, und der Vergleich ja eh nur "gleich/ungleich" ist)
 

vba_2020

Grünschnabel
Mir wurde gesagt, ich könnte mich drauf verlassen ;)
Ist nach Datum sortiert

Ja also man kann den Wert direkt vergleichen. Da sie ja sortiert sind, sollte das Format ja auch egal sein.
 
Zuletzt bearbeitet: