Anzeige

[Excel] Alter und neuer Datensatz gleichzeitig

josef24

Erfahrenes Mitglied
#1
Guten Tag in die Runde. Ich möchte einen Programmschritt automatisieren und damit Fehler bei der Eingabe vermeiden.
Ich will eine Vereinfachung bei der Dateneingabe erreichen, stoße dabei aber auf Probleme. Gebe mittels USERFORM einen Datensatz ein, und möchte erreichen, das dieser sobald ich den nächsten Datensatz eingebe, abgespeichert wird. Wenn ich das getrennt vornehme erscheint mir der neue Datensatz wie ich es gewohnt war. Bei der Verbindung über "Call cmdSave_Click" werden unkontrollierte ständig neue Datensätze bereit gestellt, die aber wie bisher in der USERFORM nicht sichtbar sind. Wenn es überhaupt möglich ist , könnte mich vielleicht jemand beim Code schreiben unterstützen. Danke und Gruß Josef

Code:
Sub cmdNew_Click()
Dim lZeile As Long
lZeile = 1
     Do While Trim(CStr(wsAt.Cells(lZeile, 1).Value)) <> ""
         lZeile = lZeile + 1
     Loop
wsAt.Cells(lZeile, 1) = CStr("NR " & lZeile)
wsAt.Cells(lZeile, 2) = CStr("NeuMtgld ")

lstData.AddItem
lstData.List(lstData.ListCount - 1, 1) = CStr("NR " & lZeile)
lstData.ListIndex = lstData.ListCount - 1

  Call cmdSave_Click
End Sub

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 = txtAnrede.Text
'  usw. usw..........
 

josef24

Erfahrenes Mitglied
#3
Hier weitere Erklärungen und der ges. Code meines Versuchs. Der Code wird über die USERFORM1 aufgerufen. Im ersten Sub ist der Code Call cmd... vorhanden.Danke und Gruß Josef

Code:
Sub cmdNew_Click() '  CommandButton1

Dim lZeile As Long
lZeile = 1
     Do While Trim(CStr(wsAt.Cells(lZeile, 1).Value)) <> ""
         lZeile = lZeile + 1
     Loop
wsAt.Cells(lZeile, 1) = CStr("NR " & lZeile)
wsAt.Cells(lZeile, 2) = CStr("NeuMtgld ")

lstData.AddItem
lstData.List(lstData.ListCount - 1, 1) = CStr("NR " & lZeile)
lstData.ListIndex = lstData.ListCount - 1

  Call cmdSave_Click
End Sub

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 = txtAnrede.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
        Call UserForm_Initialize
    Else
        MsgBox "Nummer " & txtPosNr.Text & " nicht gefunden", vbExclamation + vbOKOnly
    End If
'              Call Sichern
    End Sub
 

josef24

Erfahrenes Mitglied
#5
Danke erst mal. Musste noch einen Arzttermin wahrnehmen, daher erst jetzt die Antwort.
Hier die Userform_Initialze() aus meiner Codefolge. Gruß Josef

Code:
Private Sub UserForm_Initialize()  ' Zeilen löschen
   Dim lZeile As Long
 
    clearForm
    
    With Tabelle4
        lstData.List = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 7)).Value
    End With
    
End Sub
 

Yaslaw

n/a
Moderator
#6
Ich sehe grad kein Fehler. Kannst du eine Testdatei mit dem Code und ein oder zwei Testzeilen hochladen?
Dann kann man das mal debuggen.
 

Yaslaw

n/a
Moderator
#8
Da fällt mir gerade auf.
Im cmdNew_Click() sollte cmdSave_Click() ganz am Anfang durchgeführt werden. Erst dann den neuen anlegen.
 

josef24

Erfahrenes Mitglied
#9
Danke, habe die Reihenfolge der beiden Code gedreht, das war doch gemeint von dir? Das funktioniert soweit ganz gut. Etwas unschön ist, das er jedes mal einen neuen Datensatz erstellt, was man aber nicht immer will.
Kann man das irgendwie unterbinden? Gruß Josef
 

Yaslaw

n/a
Moderator
#10
Aber das wolltest du doch?
cmdNew_Click() speichert den bestehenden Code und erstellt einen neuen.
Man kann es unterbinden. Aber wie soll die Logik aussehen?
 

josef24

Erfahrenes Mitglied
#11
Danke bis dahin. Meine Überlegung war, nur einen neuen Datensatz bereit zu stellen, wenn er tatsächlich benötigt wird. Also nur beim Click auf "Neuen Datensatz erstellen" einen leeren Datensatz bereit stellen, wenn noch keiner vorhanden ist.
Hänge die geänderte Datei nochmal an. Gruß Josef
 

Anhänge

Zuletzt bearbeitet:

josef24

Erfahrenes Mitglied
#12
Zu meinem Vorhaben: Ich bin der Initiator, und habe mehrere "Kollegen" im Rentenalter die ebenfalls in der Datei Änderungen vornehmen können. Dabei versuche ich darauf zu achten, das für sie die Arbeit so einfach und transparent wie möglich ist. Nun zu der Datei:
1. Ich öffne per Mausklick die USERForm zwecks Eingabe der Daten. Dabei sehe ich in der ListBox den Anfang der Daten in der ArbDat abgebildet, aber im echten habe ich über 200 Zeilen befüllt, und sehe dann natürlich nicht mehr alle Daten. Heißt für Mitstreiter das nicht alles sichtbar ist, was bereits eingebracht wurde. Das ist wenn neue Datensätze hinzu kommen etwas verwirrend für die Leute.
2. Wenn ich eine Änderung an einem bestehenden Datensatz vornehme, will ich keinen neuen Datensatz bereitgestellt haben, der unnötig Zeilen füllt. Hinweis bisher wird wenn ich die Eingabe beende diese auch direkt gespeichert. Heißt im Programm: keine neue Zeile angelegt / befüllt also auch, keine neue Zeile bereitstellen wie bisher.
3. Wenn ich nun einen aber einen neuen Datensatz anlegen will, klicke ich in der UF auf neuen Datensatz anlegen, und es wird mir ein neuer "leerer" Datensatz bereitgestellt.
4. Wenn dann der Datensatz befüllt ist, und ich den nächsten neuen Datensatz aufrufe, wird der vorherige gespeichert. (Sicherheit für die Mitstreiter)
5. Jetzt mein besonderes Anliegen an das Programm: Wenn dann der Datensatz gespeichert wird, erzeugt das Programm wiederum einen neuen Datensatz, was ja letztendlich ins "unermessliche" führt.
6. Wenn ich also eine Änderung wie unter Punkt 2. oder auch eine Neueingabe wie unter Punkt 3. geschildert mache, immer wird vom Programm ein neuer Datensatz erzeugt.
Ich hoffe meine Ausführungen erklären meinen Wunsch zur Änderung des Programmablaufs ausreichend.
Danke und Gruß Josef
 
Anzeige
Anzeige