Anzeige

 Datum umwandeln


josef24

Erfahrenes Mitglied
#1
Ich versuche schon etwas länger die Eingabe vom Datum "1.1.11" autom. nach "01.01.2011" umwandeln zu lassen. Die Eingabe erfolgt mittels TextBox und soll dann in die Tabelle4 übertragen werden. Eine Bitte hierzu:
Wenn irgendwie möglich mit einem entsprechenden Code-Text als Beispiel antworten.
Eine kleine Datei kann ggf. hochgeladen werden.
Dazu mein Versuch mittels VBA Code:
PHP:
  TextBox8 = Format(Tabelle4.Cells(lZeile, 9), "dd.mm.yyyy")
Danke und Gruß für eure Unterstützung Josef


Ich habe Vorstellungen über das Ziel, aber der Weg dort hin bereitet mir Probleme.
 

josef24

Erfahrenes Mitglied
#3
Hallo Yaslwa, vielen Dank für deine Unterstützung. Mein Problem ist in sofern noch ungelöst, als das die Änderung erst nach schließen und wieder öffnen, und erneut übertragen erst das gewünschte Format hat. Ich erlaube mir mal eine kleine Datei als Demo anzuhängen. Vielleicht kann ich ja nochmals Unterstützung erhalten.
 

Anhänge

Yaslaw

n/a
Moderator
#4
Das war aber nicht deine Frage.
Deine Testtabelle hat so viele Tabellen du und ein Formular. Wie kommt man denn an dein Problem? Wo muss man klicken und wo sollte was wie passieren?
Um dich zu zitieren: "Ich habe Vorstellungen über das Ziel, aber der Weg dort hin bereitet mir Probleme." Wir kennen nicht mal dein Ziel!
 

josef24

Erfahrenes Mitglied
#5
Hallo und Danke fürs Interesse!
Sorry, das Ganze ist wie schon gesagt mit sehr wenig Kenntnis, und learning by doing entstanden, daher vielleicht eine etwas holprige Vorgehensweise.
Ich erkläre mal den Umgang mit der Datei:
  1. Schritt 1. In ArbDat Daten eingeben, es öffnet sich die Userform mit der Eingabemöglichkeit von "Neue Eingabe"
  2. Nachdem man auf das Feld "Neue Eingabe" geklickt hat, erscheinen die Textboxen die befüllt werden, darunter die Datumsfelder.
  3. Danach lasse ich die Daten in die Tabelle ArbDat übertragen.2
  4. Hier überträgt der Befehl "Daten übertragen, speichern" die Daten 1 zu 1. Hier war meine Wunschvorstellung, das das Datumsformat "TT.MM.JJJJ" in die Tabelle "ArbDat" übertragen würde, was aber so nicht geschieht.
  5. Erst nach beenden und wieder öffnen erscheint das Datum in der Form, wie ich es mir vorgestellt hatte.
Vielleicht hilft das weiter, um meine Idee zu verstehen. Danke und Gruß Josef
 

Yaslaw

n/a
Moderator
#6
Warum kommen in den Datumsfeldern Zeitangaben als Vorlage? Sehr verwirrend

Ach du meine Güte. Du hast da Chaos vorbprogrammiert. BENENNE DEINE FELDER. Mit Namen wir TextBox1 etc. machst du dir das Leben nicht einfacher.
Dasselbe gilt für die CommandButtons!

Du musst die Formel halt in der Funktion CommandButton3_Click() einpfelgen. Für den Geburtstag ist es das Feld TextBox8.
 

josef24

Erfahrenes Mitglied
#8
Guten Morgen allerseits. Ein wahrscheinlich kleines Problem taucht jetzt auf. Wenn ich von 4 Datumsfelder eines nicht mit Daten fülle kommt Laufzeitfehler 13 , Typen unverträglich. Wie ergänzt mann den Code um solche Fehler zu ignorieren. Kann mir bitte hierbei jemand helfen. Bedanke mich für evtl. Unterstützung, Josef

Code:
             Tabelle4.Cells(lZeile, 9).Value = CDate(TextBox8.Text)     'Datumsfeld mit Format
             Tabelle4.Cells(lZeile, 10).Value = CDate(TextBox9.Text)    'Datumsfeld mit Format
             Tabelle4.Cells(lZeile, 11).Value = CDate(TextBox10.Text)   'Datumsfeld mit Format
             Tabelle4.Cells(lZeile, 12).Value = CDate(TextBox11.Text)   'Datumsfeld mit Format
 

josef24

Erfahrenes Mitglied
#10
Danke für deine Mühe. Habe mal probiert Daten einzugeben, dabei absichtlich die 3te Datumszeile (ich habe 4 davon hintereinander) ausgelassen. Er übernimmt die Daten nicht. Es gibt aber auch keine Fehlermeldung. Kompletten Spruch könnte ich liefern. Erbitte nochmal Unterstützung. Gruß Josef
 

josef24

Erfahrenes Mitglied
#12
Hallo und Danke, er übernimmt alle Daten (den komplett eingegebenen Datensatz) nicht. s. Anlage. Hatte noch mit "End If" versucht???? Gruß Josef

Code:
     Do While Trim(CStr(Tabelle4.Cells(lZeile, 1).Value)) <> ""
         If ListBox1.Text = Trim(CStr(Tabelle4.Cells(lZeile, 1).Value)) Then
             Tabelle4.Cells(lZeile, 1).Value = Trim(CStr(TextBox1.Text))
             Tabelle4.Cells(lZeile, 2).Value = TextBox2.Text
             Tabelle4.Cells(lZeile, 3).Value = TextBox3.Text
             Tabelle4.Cells(lZeile, 4).Value = TextBox4.Text
             Tabelle4.Cells(lZeile, 5).Value = TextBox5.Text
             Tabelle4.Cells(lZeile, 7).Value = TextBox6.Text
             Tabelle4.Cells(lZeile, 8).Value = TextBox7.Text
        If IsDate(TextBox8.Text) Then Tabelle4.Cells(lZeile, 9).Value = CDate(TextBox8.Text)   'Datumsfeld mit Format
        If IsDate(TextBox9.Text) Then Tabelle4.Cells(lZeile, 10).Value = CDate(TextBox9.Text)   'Datumsfeld mit Format
        If IsDate(TextBox10.Text) Then Tabelle4.Cells(lZeile, 11).Value = CDate(TextBox10.Text)   'Datumsfeld mit Format
        If IsDate(TextBox11.Text) Then Tabelle4.Cells(lZeile, 12).Value = CDate(TextBox11.Text)   'Datumsfeld mit Format
             Tabelle4.Cells(lZeile, 13).Value = TextBox12.Text
             Tabelle4.Cells(lZeile, 18).Value = TextBox13.Text
             Tabelle4.Cells(lZeile, 19).Value = TextBox14.Text
             If ListBox1.Text <> Trim(CStr(TextBox1.Text)) Then
             End If
             End If
             End If
             End If
                 Call UserForm_Initialize
                 If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0
             End If
             Exit Do
         End If
         lZeile = lZeile + 1
     Loop
End Sub
 
#13
Der sollte eh einen Kompilierfehler geben.
Zu viele End If

Es gibt 2 Möglichkeiten um If ohne else Anzuwenden
Visual Basic:
IF bedinung THEN
   mache
END IF
'oder als Einzeiler
IF bedinung THEN mache
Zudem, formatiere deinen Code sauber, damit du auch siehst wo ein IF beginnt und wo er endet
Dein folgender Codeabschnitt kannst du so nämlich gleich spülen. Der macht gar nix.
Visual Basic:
             If ListBox1.Text <> Trim(CStr(TextBox1.Text)) Then
             End If
 

josef24

Erfahrenes Mitglied
#14
Vielen Dank für deine Erklärung. Ich muß gestehen das ich wahrscheinlich jetzt das Problem des richtigen Einordnens habe. Geht es bitte etwas ausführlicher?
Wo z.B. platziere ich "If Bedingung Then" , und was muss ich anstelle "Bedingung" hernehmen? Geht da bitte noch etwas Unterstützung, es wäre mir damit sehr geholfen. Danke nochmal und Gruß Josef

Code:
             Tabelle4.Cells(lZeile, 18).Value = TextBox13.Text
             Tabelle4.Cells(lZeile, 19).Value = TextBox14.Text
            '       If ListBox1.Text <> Trim(CStr(TextBox1.Text)) Then
             If ListBox1. Then
             End If
                 Call UserForm_Initialize
                 If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0
 
#15
Ich kann dir nicht wirklich helfen, weil:
1) ich keine Ahnung habe, was dein Cod genau soll
2) deine Feldbeschreibungen für das Verständnis deines Problemes absolut NICHT hilfreich sind
3) du hier immer wieder VBA-Codeschnipsel postest bei denen sogar Excel motzen sollte, dass die Syntax nix taugt

Als. Was soll der Blödsinn mit der Listbox1. ? Der Code, den ich zitiert hatte macht keinen Sinn weil: "Wenn XY Dann mach nix". Das beeutet aber auch, wenn NICHT XY, macht er auch nix. Also sind es einfach sinnlose Code-Zeilen die einzig dazu da sind dein Code zu verlangsamen und unleserlicher zu machen.

Mach dich mal mit dem If vertraut!
 

josef24

Erfahrenes Mitglied
#16
Entschuldigung für mein Miniwissen. Es war von mir lediglich ein Versuch deinen Vorschlag bei mir einzuarbeiten. Es würde mir natürlich weiter helfen, wenn du noch bereit wärest, das Einordnen des Code an der richtigen Stelle zu erklären (Beispiel)?. Habe mal mein Problem komplett hier eingepflegt. Danke bis dahin. Vielleicht kann ich ja nochmal deine Hilfe beanspruchen? Gruß Josef

Code:
  Private Sub CommandButton3_Click()  ' Daten übertragen , Datei – Speichern [aktive Arbeitsmappe]
   Dim lZeile As Long
     If ListBox1.ListIndex = -1 Then Exit Sub
      If Trim(CStr(TextBox1.Text)) = "" Then
         MsgBox "Sie müssen mindestens einen Namen eingeben!", vbCritical + vbOKOnly, "FEHLER!"
Exit Sub
     End If
     lZeile = 2
     Do While Trim(CStr(Tabelle4.Cells(lZeile, 1).Value)) <> ""
         If ListBox1.Text = Trim(CStr(Tabelle4.Cells(lZeile, 1).Value)) Then
             Tabelle4.Cells(lZeile, 1).Value = Trim(CStr(TextBox1.Text))
             Tabelle4.Cells(lZeile, 2).Value = TextBox2.Text
             Tabelle4.Cells(lZeile, 3).Value = TextBox3.Text
             Tabelle4.Cells(lZeile, 4).Value = TextBox4.Text
             Tabelle4.Cells(lZeile, 5).Value = TextBox5.Text
             Tabelle4.Cells(lZeile, 7).Value = TextBox6.Text
             Tabelle4.Cells(lZeile, 8).Value = TextBox7.Text
        If IsDate(TextBox8.Text) Then Tabelle4.Cells(lZeile, 9).Value = CDate(TextBox8.Text)   'Datumsfeld mit Format
        If IsDate(TextBox9.Text) Then Tabelle4.Cells(lZeile, 10).Value = CDate(TextBox9.Text)   'Datumsfeld mit Format
        If IsDate(TextBox10.Text) Then Tabelle4.Cells(lZeile, 11).Value = CDate(TextBox10.Text)   'Datumsfeld mit Format
        If IsDate(TextBox11.Text) Then Tabelle4.Cells(lZeile, 12).Value = CDate(TextBox11.Text)   'Datumsfeld mit Format
             Tabelle4.Cells(lZeile, 13).Value = TextBox12.Text
             Tabelle4.Cells(lZeile, 18).Value = TextBox13.Text
             Tabelle4.Cells(lZeile, 19).Value = TextBox14.Text
            '       If ListBox1.Text <> Trim(CStr(TextBox1.Text)) Then
               If ????? Then
             End If
          
                 Call UserForm_Initialize
                 If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0
             Exit Do
         End If
         lZeile = lZeile + 1
     Loop
End Sub
 
#17
Nochmals:
1) Sauber formatieren ist das halbe Programmieren. So sieht man auch auf anhieb, wo ein Block beginnt und wo er endet.
2) Den Code durch Excel VBA Kompilieren und somit auf grobe Schnitzer (nicht geschlossene IF etc.) testen. Solange dieser Test misslingt, musst du gar nix laufen lassen, weil es eh nicht funktioniert
3) Die Felder so benennen, dass man weiss was es ist.

Ich habe mal dein Code folgendermassen angepasst. Ev. macht er mehr oder weniger was du willst.
Visual Basic:
Private Sub CommandButton3_Click()  ' Daten übertragen , Datei – Speichern [aktive Arbeitsmappe]
    Dim lZeile As Long

    If ListBox1.ListIndex = -1 Then Exit Sub
   
    If Trim(CStr(TextBox1.Text)) = "" Then
        MsgBox "Sie müssen mindestens einen Namen eingeben!", vbCritical + vbOKOnly, "FEHLER!"
        Exit Sub
    End If
   
    lZeile = 2
    Do While Trim(CStr(Tabelle4.Cells(lZeile, 1).Value)) <> ""
        If ListBox1.Text = Trim(CStr(Tabelle4.Cells(lZeile, 1).Value)) Then
            Tabelle4.Cells(lZeile, 1).Value = Trim(CStr(TextBox1.Text))
            Tabelle4.Cells(lZeile, 2).Value = TextBox2.Text
            Tabelle4.Cells(lZeile, 3).Value = TextBox3.Text
            Tabelle4.Cells(lZeile, 4).Value = TextBox4.Text
            Tabelle4.Cells(lZeile, 5).Value = TextBox5.Text
            Tabelle4.Cells(lZeile, 7).Value = TextBox6.Text
            Tabelle4.Cells(lZeile, 8).Value = TextBox7.Text
            If IsDate(TextBox8.Text) Then Tabelle4.Cells(lZeile, 9).Value = CDate(TextBox8.Text)   'Datumsfeld mit Format
            If IsDate(TextBox9.Text) Then Tabelle4.Cells(lZeile, 10).Value = CDate(TextBox9.Text)   'Datumsfeld mit Format
            If IsDate(TextBox10.Text) Then Tabelle4.Cells(lZeile, 11).Value = CDate(TextBox10.Text)   'Datumsfeld mit Format
            If IsDate(TextBox11.Text) Then Tabelle4.Cells(lZeile, 12).Value = CDate(TextBox11.Text)   'Datumsfeld mit Format
            Tabelle4.Cells(lZeile, 13).Value = TextBox12.Text
            Tabelle4.Cells(lZeile, 18).Value = TextBox13.Text
            Tabelle4.Cells(lZeile, 19).Value = TextBox14.Text
            '       If ListBox1.Text <> Trim(CStr(TextBox1.Text)) Then
            'Yaslaw: Keine Ahnung was du da machen willst. Habe darum sie folgenden Zeilen auskommentiert
            'If ????? Then
        End If

        Call UserForm_Initialize
        If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0
        'Yaslaw: Was willst du mit den folgenden 2 Zeilen? Die ergeben keinen Sinn
        'Exit Do
        'End If
        lZeile = lZeile + 1
    Loop
End Sub
 

josef24

Erfahrenes Mitglied
#18
Danke für die Mühe die du mit mir hast, und den Einsatz von deiner Seite. Habe deinen Code eingebracht. Leider übernimmt er aber neue Daten nicht in die Tabelle.
Keine Fehlermeldung, keine Textübername. Wärst du bereit hier nochmal einen Blick drauf zu werfen? Vielen Dank jetzt schon, Gruß Josef
 
#20
Dein Code initialisiert das Formular im falschen Moment.
Ich habe dir mal eine Anpassung gemacht. Zudem habe ich dir einige Felder umbenennt. Mit Feldernamen Text 1 bis TextX weigere ich mich zu abreiten!

Neben dem umbennen der Textfelder habe ich auch nochein Enum eingefügt, der die Spalten definiert
Visual Basic:
'/**
' * Enum mit den Feldnummern der Tabelle ArbTab (At)
' */
Private Enum eColAtFields
    colAtNummer = 1
    colAtAnrede = 2
    colAtNachname = 3
    colAtVorname = 4
    colAtStrasse = 5
    colAtWohnort = 7
    colAtTelefon = 8
    colAtGeburtstag = 9
    '//TODO: analog weiterführen
End Enum
Weiter habe ich deine Do...Loop Entfernt. Die Funktion seekAt() sucht jetzt die passende Zeile und gibt diese als Range zurück
Visual Basic:
'/**
' * Sucht in der Tabelle4 ArbTab nach einer Nummer
' * @param  String      (IN) Gesuchte Nummer
' * @param  Range       (OUT) Gefundener Range
' * @return Long        Die Zeilennummer. 0 bedeutet nicht gefunden
' */
Private Function seekArb(ByVal iId As String, Optional ByRef oRange As Range) As Long
    Dim rowNr As Long
On Error GoTo Err_Handler

    seekArb = wsAt.Range("A:A").Find(iId, , , , , , , True).Row
    Set oRange = wsAt.Rows(seekArb)
    Exit Function

Err_Handler:
    seekArb = 0
End Function
Damit lässt es sich jetzt relativ leicht arbeiten. Es ist auch übersichtlicher
Visual Basic:
    'Zeile suchen und auslesen
    If seekArb(txtNummer, rngRow) Then
        'Werte übernehmen
        rngRow.Cells(, colAtNummer).Value = Trim(CStr(txtNummer.Text))
        rngRow.Cells(, colAtAnrede).Value = txtAnrede.Text
        rngRow.Cells(, colAtNachname).Value = txtNachname.Text
        rngRow.Cells(, colAtVorname).Value = txtVorname.Text
        ...
 

Anhänge

Anzeige
Anzeige