MS Access, String-Funktionen, Extraktion von Teilen

Hallo zusammen,
Sorry, ich bin halt immer noch ein Anfänger.
Also. Ich habe ein Memofeld, das z.B. so aussieht:

Booking Id: 1407204509
Arrival Date: Mon 12 Feb 2018
Departure Date: Mon 26 Feb 2018
Nights: 14
Number of guests: 5
Payment Type: Property collects payment
Total: THB 37800.00 Name: Nachname, Vorname
Email: [email protected]
Phone: +4407716164044
City: .
Country: gb
Customer Note: You have a booker that would like free parking. (based on availability) We have a 2 year old so we need a cot.

Das entsprechende Feld (Remarks) ist ein Memo-Feld (Langer Text).
Nun möchte ich die oben fett markierten Textteile extrahieren und in die entsprechenden Formularfelder eintragen, sobald das Memo-Feld aktualisiert wird. Nachname und Vorname sollen dabei in zwei verschiedene Textfelder im Formular eingetragen werden. Das Datum kommt leider so daher, tut mir leid.

Weiss jemand, wie man mit VBA sowas anstellt?
Ganz herzlichen Dank + ein schönes neues Jahr aus Koh Samui in Thailand.

Thomas

Zuerst mal sollte man den Absender dieser Daten fragen, ob der nicht auch einen netten kleinen Webservice anbietet, von dem man einen sauberen Datensatz mit diesen Bezeichnung/Werte-Paaren bekommen kann, z.B. als sauberes XML. Denn dieser Text sieht danach aus, als ob er aus genau so etwas überhaupt erst zusammen gesetzt wurde.

Ansonsten muss man halt nach dem 1. Identifier "Booking Id: " im Text suchen, und von da ab 10 Stellen (wenn die denn immer zehn Stellen hat, sonst halt bis zum Beginn des Idetifiers „Arrical Date:“ lesen und in das gewünschte Feld des eigenen Datensatzes schreiben, …

Das Datum muss man dann noch gesondert behandeln, indem man die Monatskürzel dann passend umwandelt, Bein Namen muss man den eben beim Komma teilen.

Hallo,

hier ein Vorschlag, sofern die Textstruktur immer die gleiche ist und bleibt.

Public Function fktExtrValues(ByVal sRemarks As String, sItem As String)

Dim slines() As String, sLin As String, i As Long, strCP As String

strCP = sItem & ": "
slines = Split(sRemarks, vbCrLf)

For i = LBound(slines) To UBound(slines)

    If InStr(slines(0), sItem) Then slines(0) = Replace(slines(0), strCP, ""): fktExtrValues = slines(0)

    If InStr(slines(1), sItem) Then
        sLin = Replace(slines(1), strCP, "")
        fktExtrValues = CDate(Right(sLin, 11))
    End If
    
    If InStr(slines(2), sItem) Then
        slines(2) = Replace(slines(2), strCP, "")
        fktExtrValues = CDate(Right(sLin, 11))
    End If
    
    If InStr(slines(3), sItem) Then
        sLin = Replace(slines(3), strCP, "")
        fktExtrValues = CDate(Right(sLin, 11))

    End If
    
    If InStr(slines(6), "Name: ") Then
        sLin = Trim(Mid(slines(6), InStr(slines(6), "Name: ") + 6))
        If sItem = "Vorname" Then fktExtrValues = Split(sLin, ", ")(1)
        If sItem = "Nachname" Then fktExtrValues = Split(sLin, ", ")(0)
    End If
    
    If InStr(slines(8), sItem) Then fktExtrValues = Replace(slines(8), strCP, "")
    
    If InStr(slines(10), sItem) Then fktExtrValues = Replace(slines(10), strCP, "")
    
Next

End Function

und Aufruf:

Msgbox fktExtrValues („Departure Date“)
Msgbox fktExtrValues („Booking ID“)

und für die Namen:

Msgbox fktExtrValues („Vorname“)
Msgbox fktExtrValues („Nachname“)

.
.
bzw.:

Me!Ankunftsdatum = Msgbox fktExtrValues („Arrival Date“)

Dim pos as Integer
Dim posCrLf as Integer
Dim strBookingId as String
Dim strLangerText as String

pos = InStr(strLangerText, „Booking Id:“)
If pos > 0 then
posCrLf = InStr(pos, strLangerText, vbCrLf)
strBookingId = Mid$(strLangerText, pos + Len(„Booking Id:“) + 1, posCrLf - Len(„Booking Id:“)))
End If

VIelen herzlichen Dank! Thomas

Vielen herzlichen Dank, Thomas

Vielen herzlichen Dank, thomas

Hallo Franz
Vielen Dank für Deine Hilfe.
Ich weiss, Du hast Dir mit dem ausführlichen Code sehr viel Mühe gegeben.
Ich denke, dass mein Problem darin besteht, dass ich den Code inhaltlich nur wenig nachvollziehen kann.
Und vermutlich gelingt es mir deshalb nicht, den Code an meine Software exakt anzupassen.
Was habe ich gemacht:
a) Da mein Feld auf dem Form nicht sRemarks sondern Remarks heisst (und auch solchen Dateninhalt hat) habe ich im Code „sRemarks“ auf „Remarks“ geändert. Dann das ganze als Modul gespeichert.
b) Dann habe auf meinem Form eine Schaltfläche angebracht (neben dem Memofeld) und auf die Eigenschaft „Beim Klicken“ folgenden Code hinterlegt: MsgBox fktExtrValues(„Departure Date“).
c) alles gespeichert
d) Klick auf die Schaltfläche ergibt dann die Fehlermeldung:
„Fehler im Kompilieren. Argument nicht optional“.
Anmerkung: Keine Ahnung ob das eine Rolle spielt, aber ich habe ein 64 Bit Version auf meinem PC.
Und so kam ich halt einfach nicht weiter.

Falls Du mir wieder weiterhelfen möchtest und Du weitere Angaben benötigst, sag es mir einfach. Und ganz herzlichen Dank im Voraus.
Gegenleistung: Ich habe auf Koh Samui ein kleines Hotel. Wenn Du mal Lust hast hierhin zu kommen, mache ich Dir sein Super Preis. Versprochen. Aber bitte direkt kontaktieren. Vielen Dank + Tschüüüs

Thomas

'nth gibt das nte Wort in einem String zurück
'T=Text,I=Index,S=Separator
'z.B.: nth("Das ist ein Test",2) => "ist"
'z.B.: nth("Das ist ein Test",-2) => "ein"
Function NTH$(ByVal T$, ByVal I%, Optional S$ = " ")
 Dim ARR
 ARR = Split(S & T, S)
 If I >= 0 Then
  NTH = ARR(I)
 Else
  NTH = ARR(UBound(ARR) + 1 + I)
 End If
End Function