VBA Code auch auf leeres Feld reagieren


josef24

Erfahrenes Mitglied
Guten Tag zusammen.
Ich habe eine Eingabemaske worüber ich Daten eingebe, und auch Inhalte löschen kann. Bei normalen Textzellen geht da problemlos. Wenn ich nun Inhalt in einem "Datumsfeld" löschen will, funktioniert das nicht. Die dann leere Zelle wird nicht als solche erkannt, bzw. ein leeres Datenfeld wird nicht erkannt. Die Ergänzung auch ein leeres Datenfeld zu erkennen und die Tabelle mit dem "Inhalt" leeres Datenfeld zu löschen funktioniert mit meinem Code nicht. Kann mir hier vielleicht jemand weiter helfen? Gruß Josef

Mein Codetext:
Visual Basic:
Private Sub cmdSave_Click() ' Daten übertragen , Datei – Speichern [aktive Arbeitsmappe]
Dim lZeile As Long
Dim rngRow As Range
    If lstData.ListIndex = -1 Then Exit Sub
    If Trim(CStr(txtPosNr.Text)) = "" Then
    MsgBox "Sie müssen mindestens eine Nummer eingeben!", vbCritical + vbOKOnly, "FEHLER!"
    Exit Sub
    End If
'Zeile suchen und auslesen
If seekArb(txtPosNr, rngRow) Then 'Werte übernehmen
    rngRow.Cells(, colAtPosNr).Value = Trim(CStr(txtPosNr.Text))
    rngRow.Cells(, colAtNummer).Value = txtnummer.Text
    rngRow.Cells(, colAtAnrede).Value = ComboBox1.Text
    rngRow.Cells(, colAtNachname).Value = txtNachname.Text
    rngRow.Cells(, colAtVorname).Value = txtVorname.Text
    rngRow.Cells(, colAtStrasse).Value = txtStrasse.Text
    rngRow.Cells(, colAtWohnort).Value = txtWohnort.Text
    rngRow.Cells(, colAtTelefon).Value = txtTelefon.Text
         If IsDate(txtGeburtstag.Text) Then rngRow.Cells(, colAtGeburtstag).Value = CDate(txtGeburtstag.Text) 'Datumsfeld mit Format
         If IsDate(txtEintritt.Text) Then rngRow.Cells(, colAtEintritt).Value = CDate(txtEintritt.Text) 'Datumsfeld mit Format
         If IsDate(txtAustritt.Text) Then rngRow.Cells(, colAtAustritt).Value = CDate(txtAustritt.Text) 'Datumsfeld mit Format
         If IsDate(txtgenBis.Text) Then rngRow.Cells(, colAtgenBis).Value = CDate(txtgenBis.Text) 'Datumsfeld mit Format
    rngRow.Cells(, colAtGruppe).Value = txtgruppe.Text
    rngRow.Cells(, colAtKrankenkasse).Value = txtkrankenkasse.Text
    rngRow.Cells(, colAtKrKNr).Value = txtKrKNr.Text
    rngRow.Cells(, colAtBemerkung).Value = TxTBemerkung.Text
    rngRow.Cells(, colAtZahlung).Value = TxTZahlung.Text
'User Formular neu laden
    lZeile = Me.lstData.ListIndex 'Listindex merken
    Call UserForm_Initialize
    Me.lstData.ListIndex = lZeile 'wiederherstellen
        Else
    MsgBox "Nummer " & txtPosNr.Text & " nicht gefunden", vbExclamation + vbOKOnly
    End If
Call cmdNew_Click
End Sub
 
Zuletzt bearbeitet von einem Moderator:

Zvoni

Erfahrenes Mitglied
??
Aircode!
Code:
If txtGeburtstag.Text="" Then rngRow.Cells(, colAtGeburtstag).Value="" ElseIf IsDate...bblablabla
 

josef24

Erfahrenes Mitglied
Danke erstmal für deine Unterstützung. Habe den Code wie ich es verstehe, mal komplettiert. Er bringt bei ElseIf "Erwarte Anweisungsende". Hier mal mein Versuch:

If txtGeburtstag.Text="" Then rngRow.Cells(, colAtGeburtstag).Value="" ElseIf = _
IsDate (txtGeburtstag.Text) Then rngRow.Cells(, colAtGeburtstag)' .Value = CDate(txtGeburtstag.Text)' ...bblablabla


Gruß Josef
 

Yaslaw

n/a
Moderator
Stimmt. Auf alle Fälle ein Chaos.
Es hat auch nicht ein Sinnloses ' drin. Wenn man alles danach als Kommentar hat, bleibt nur das folgende übrig und das ist für die Katz. .. Then rngRow.Cells(, colAtGeburtstag)
If-Then-Elsif eignen sich nicht für Einzeiler

Wenn Einzeiler, dann besser IIF
Visual Basic:
rngRow.Cells(, colAtGeburtstag).Value = iif(IsDate(txtGeburtstag.Text), CDate(txtGeburtstag.Text), txtGeburtstag.Text)
 

josef24

Erfahrenes Mitglied
Danke an die Spezialisten. Aber ginge vielleicht eine komplette Zeile? Denn bei soviel Korrekturinhalt finde ich mich nicht mehr zurecht. Gruß Josef
 

josef24

Erfahrenes Mitglied
Sorry, aber leider funktioniert das so nicht???? Er markiert die komplette Zeile in Gelb und kollidiert mit anderen Codes, offensichtlich eine Unverträglichkeit? Gruß Josef
 

josef24

Erfahrenes Mitglied
Habs nochmal laufen lassen mit f. Hinweis: 13 Typenunverträglichkeit. Die Spalte ist als Datumsformat gespeichert. Ich habe das Datum gelöscht, hierbei trat der Fehler auf. Wenn ich es nur verändere passt alles.
 
Zuletzt bearbeitet:

josef24

Erfahrenes Mitglied
Danke für die Unterstützung, und so hab ich's hinbekommen. Lässt sich auch beliebig oft wiederholen. Gruß Josef
Mein Erfolgserlebnis:
Code:
If txtGeburtstag.Text = "" Then
    rngRow.Cells(, colAtGeburtstag).Value = ""
ElseIf IsDate(txtGeburtstag.Text) Then
    rngRow.Cells(, colAtGeburtstag).Value = CDate(txtGeburtstag.Text)
Else
End If
 

Yaslaw

n/a
Moderator
Und wenn du das mehrfach brauchst, dann mache eine Funktion draus
Visual Basic:
Sub setDateCellFromFormField(byRef iFormField, byRef ioTargetCell As Range)
    If iFormField.Text = "" Then
        ioTargetCell.Value = ""
    ElseIf IsDate(iFormField.Text) Then
        ioTargetCell.Value = CDate(iFormField.Text)
    End If
End Sub
und der Aufruf im Code
Visual Basic:
setDateCellFromFormField txtGeburtstag, rngRow.Cells(, colAtGeburtstag)
 

josef24

Erfahrenes Mitglied
Danke für die zusätzliche Codeform, wäre wahrscheinlich wesentlich einfacher zu händeln wenn mehrere Datumsfelder betroffen sein könnten. Bin nicht so fit um es richtig einzuordnen. Gruß Josef