4.9k Aufrufe
Gefragt in Tabellenkalkulation von wimaxe Mitglied (119 Punkte)
Hallo an alle, brauche mal wieder eure Hilfe!

hier mal meine Muster Tabelle: Datei

1. Bei einem Klick auf Button „in Zahlungen übernehmen“
im Worksheet „Eingaben“ sollen Zellen nach Worksheet „Zahlungen“ fortlaufend übernommen werden:

B2 und B3 übernommen nach A2
B7 übernommen nach B2
B8 übernommen nach C2
B25 übernommen nach D2
I21 übernommen nach E2
I19 übernommen nach F2
I22 übernommen nach G2
B24 übernommen nach H2
I22 übernommen nach I2
I23 übernommen nach P2

2. Bei einem Klick auf Button „Zahlungen erfassen“ möchte ich die Daten im Worksheet „Zahlungen“ mit dem Userform „UserformZahlung“ bearbeiten und ergänzen

Gruß
wimaxe

15 Antworten

0 Punkte
Beantwortet von wimaxe Mitglied (119 Punkte)
Muster Datei

OK, Brauche nur noch Hilfe bei der Userform.
Beim aufrufen über den Button "Zahlungen erfassen"
möchte ich schon die Werte in der Userform vom Blatt "Zahlungen"
vorgegeben haben und eventl. per "Drehfeld" durchzappen, sodass ich diese Werte ergänzen kann und mit einem Button wieder abspeichern kann
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo wimaxe,

nachfolgend mal der Anfang des Codes für Deine UserForm. Du solltest in die UserForm noch einen Button einfügen und ihm den Namen „CommandButton1_Click“ in den Eigenschaften geben.
Mit dem Code wird Dir die ComboBox, bei der Du in den Eigenschaften bitte den Namen in „Name1“ solltest, mit den Werten aus Blatt „Zahlungen“ Spalte A gefüllt.
Zusätzlich wird in die 2. Spalte der ComboBox die Zeilennummer jeden Eintrags aufgeführt. Durch die Angabe der Zahl 0 in „.ColumnWidths, wird die Spaltenindexzahl nicht angezeigt. Wenn Du Dir diese mal anzeigen lassen möchtest, ändere die Zahl 0 in z.B. 10 (Zahlen sagen die Breite der Spalte aus).
Wenn Du in der ComboBox etwas auswählst, wird Dir mit dem nachfolgenden Code die Felder „CheckIn“, „CheckOut“ und „AnzahlungSoll“ mit Werten aus der Zeile der Auswahl gefüllt.
Betätigst Du den Button, werden Dir die Werte in die entsprechende Zeile und Spalte geändert.

Kopiere den Code in das Projekt der UserForm „UserFormZahlung“.
Teste das Makro aber bitte in einer Testdatei und nicht gleich in Deiner Originaldatei.

Dim lngRow As Long

Private Sub CommandButton1_Click()
lngRow = Name1.List(Name1.ListIndex, 1)

'Wert aus Textfeld "AnzahlungSoll" in Spalte B (sagt die Spaltenindexzahl 4 aus, _
Spaltenindex beginnt mit 1 für Spalte A, Spalte B die 2, _
Spalte C die 3 usw.) einfügen _
Umwandelfunktion CDate(), damit TextBoxwerte als Datum in Tabellenblatt _
übergeben werden, da Wert aus einer TextBox immer vom Typ "String" (Text) sind
Sheets("Zahlungen").Cells(lngRow, 2) = CDate(CheckIn.Value)

'Wert aus Textfeld "AnzahlungSoll" in Spalte B (sagt die Spaltenindexzahl 4 aus, _
Spaltenindex beginnt mit 1 für Spalte A, Spalte B die 2, _
Spalte C die 3 usw.) einfügen _
Umwandelfunktion CDate(), damit TextBoxwerte als Datum in Tabellenblatt _
übergeben werden, da Wert aus einer TextBox immer vom Typ "String" (Text) sind
Sheets("Zahlungen").Cells(lngRow, 3) = CDate(CheckOut.Value)

'Wert aus Textfeld "AnzahlungSoll" in Spalte D (sagt die Spaltenindexzahl 4 aus, _
Spaltenindex beginnt mit 1 für Spalte A, Spalte B die 2, _
Spalte C die 3 usw.) einfügen _
Umwandelfunktion CDbl(), damit TextBoxwerte als Zahl in Tabellenblatt _
übergeben werden, da Wert aus einer TextBox immer vom Typ "String" (Text) sind
Sheets("Zahlungen").Cells(lngRow, 4) = CDbl(AnzahlungSoll.Value)

'usw.
'usw.
'usw.
'usw.
'usw.
'usw.

End Sub

Private Sub Name1_Change()
lngRow = Name1.List(Name1.ListIndex, 1)

'Wert aus Spalte B (sagt die Spaltenindexzahl 2 aus, _
Spaltenindex beginnt mit 1 für Spalte A, Spalte B die 2, _
Spalte C die 3 usw.) einfügen
CheckIn = Sheets("Zahlungen").Cells(lngRow, 2)

'Wert aus Spalte C (sagt die Spaltenindexzahl 3 aus, _
Spaltenindex beginnt mit 1 für Spalte A, Spalte B die 2, _
Spalte C die 3 usw.) einfügen
CheckOut = Sheets("Zahlungen").Cells(lngRow, 3)

AnzahlungSoll = Sheets("Zahlungen").Cells(lngRow, 4)

'usw.
'usw.
'usw.
'usw.
'usw.
'usw.

End Sub

Private Sub UserForm_Initialize()
Dim lngRow As Long

'ComboBox füllen
With Name1
.ColumnCount = 2
.ColumnWidths = "50; 0"
For lngRow = 2 To Sheets("Zahlungen").Cells(Rows.Count, 1).End(xlUp).Row
'Mitarbeiterkürzel übertragen
.AddItem Sheets("Zahlungen").Cells(lngRow, 1)
'Zeilennummer übertragen
.List(.ListCount - 1, 1) = lngRow
Next lngRow
End With
End Sub
Beachte bitte die auskommentierten Zeilen im Code, da dort noch einige Erklärungen stehen. Du musst nun den Code nur noch für die restlichen Felder erweitern.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von wimaxe Mitglied (119 Punkte)
Vielen Dank Oliver,

Funktioniert prima!
ich kann Dir garnicht sagen, wie lange ich schon rumdocktor
Danke, Danke, Danke
Gruß
wimaxe
0 Punkte
Beantwortet von wimaxe Mitglied (119 Punkte)
Hallo Oliver,
ich habe den unteren Code eingetragen, bekomme aber Folgende Fehlermeldung
bei klicken auf den CommandButton1:
Laufzeitfehler 424:
Objekt erforderlich


Habe ich was falsch gemacht?

Code:

Private Sub CommandButton1_Click()
lngRow = Name1.List(Name1.ListIndex, 1)

'Wert aus Textfeld "AnzahlungSoll" in Spalte B (sagt die Spaltenindexzahl 4 aus, _
Spaltenindex beginnt mit 1 für Spalte A, Spalte B die 2, _
Spalte C die 3 usw.) einfügen _
Umwandelfunktion CDate(), damit TextBoxwerte als Datum in Tabellenblatt _
übergeben werden, da Wert aus einer TextBox immer vom Typ "String" (Text) sind
Sheets("Zahlungen").Cells(lngRow, 2) = CDate(CheckIn.Value)

'Wert aus Textfeld "AnzahlungSoll" in Spalte B (sagt die Spaltenindexzahl 4 aus, _
Spaltenindex beginnt mit 1 für Spalte A, Spalte B die 2, _
Spalte C die 3 usw.) einfügen _
Umwandelfunktion CDate(), damit TextBoxwerte als Datum in Tabellenblatt _
übergeben werden, da Wert aus einer TextBox immer vom Typ "String" (Text) sind
Sheets("Zahlungen").Cells(lngRow, 3) = CDate(CheckOut.Value)

'Wert aus Textfeld "AnzahlungSoll" in Spalte D (sagt die Spaltenindexzahl 4 aus, _
Spaltenindex beginnt mit 1 für Spalte A, Spalte B die 2, _
Spalte C die 3 usw.) einfügen _
Umwandelfunktion CDbl(), damit TextBoxwerte als Zahl in Tabellenblatt _
übergeben werden, da Wert aus einer TextBox immer vom Typ "String" (Text) sind
Sheets("Zahlungen").Cells(lngRow, 4) = CDbl(AnzahlungSoll.Value)
Sheets("Zahlungen").Cells(lngRow, 5) = CDate(AnzamDatum.Value)
Sheets("Zahlungen").Cells(lngRow, 6) = CDbl(RestbetragSoll.Value)
Sheets("Zahlungen").Cells(lngRow, 7) = CDate(RestamDat.Value)
Sheets("Zahlungen").Cells(lngRow, 8) = CDbl(KautionSoll.Value)
Sheets("Zahlungen").Cells(lngRow, 9) = CDate(KautionAmDat.Value)
Sheets("Zahlungen").Cells(lngRow, 10) = CDbl(AnzahlungErhalten.Value)
Sheets("Zahlungen").Cells(lngRow, 11) = CDate(AnzErhAm.Value)
Sheets("Zahlungen").Cells(lngRow, 12) = CDbl(RestErh.Value)
Sheets("Zahlungen").Cells(lngRow, 13) = CDate(RestErhAm.Value)
Sheets("Zahlungen").Cells(lngRow, 14) = CDbl(KautionErh.Value)
Sheets("Zahlungen").Cells(lngRow, 15) = CDate(KautionErhAm.Value)
Sheets("Zahlungen").Cells(lngRow, 16) = CDate(KautionRAm.Value)

End Sub

Private Sub Name1_Change()
lngRow = Name1.List(Name1.ListIndex, 1)

'Wert aus Spalte B (sagt die Spaltenindexzahl 2 aus, _
Spaltenindex beginnt mit 1 für Spalte A, Spalte B die 2, _
Spalte C die 3 usw.) einfügen
CheckIn = Sheets("Zahlungen").Cells(lngRow, 2)

'Wert aus Spalte C (sagt die Spaltenindexzahl 3 aus, _
Spaltenindex beginnt mit 1 für Spalte A, Spalte B die 2, _
Spalte C die 3 usw.) einfügen
CheckOut = Sheets("Zahlungen").Cells(lngRow, 3)

AnzahlungSoll = Sheets("Zahlungen").Cells(lngRow, 4)
AnzamDatum = Sheets("Zahlungen").Cells(lngRow, 5)
RestbetragSoll = Sheets("Zahlungen").Cells(lngRow, 6)
RestamDat = Sheets("Zahlungen").Cells(lngRow, 7)
KautionSoll = Sheets("Zahlungen").Cells(lngRow, 8)
KautionAmDat = Sheets("Zahlungen").Cells(lngRow, 9)
AnzahlungErhalten = Sheets("Zahlungen").Cells(lngRow, 10)
AnzErhAmDat = Sheets("Zahlungen").Cells(lngRow, 11)
RestErh = Sheets("Zahlungen").Cells(lngRow, 12)
RestErhAm = Sheets("Zahlungen").Cells(lngRow, 13)
KautionErh = Sheets("Zahlungen").Cells(lngRow, 14)
KautionErhAm = Sheets("Zahlungen").Cells(lngRow, 15)
KautionRAm = Sheets("Zahlungen").Cells(lngRow, 16)

End Sub
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo,

welche Zeile im Code des Buttons wird dann gelb markiert, wenn Du auf "Debuggen" klickst? Gibt es überhaupt die ganzen TextBoxen unter den Namen, die Du angegeben hast. Wenn ich z.B. in Deine Beispieldatei schaue, gibt es dort z.B. keine TextBox mit dem Namen "AnzErhAm" oder "KautionRAm".

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von wimaxe Mitglied (119 Punkte)
Entschuldige, die Textbox ist "AnzErhAmDat" ich habe es im Code geändert.
und die Textbox "KautionRAm" habe ich noch nachträglich eingefügt

Jetzt kommt folgende Fehlermeldung:

Laufzeitfehler 13
Typen unverträglich


wenn ich auf debug klicke, ist folgende Zeile gelb:

Sheets("Zahlungen").Cells(lngRow, 11) = CDate(AnzErhAmDat.Value)

Gruß
wimaxe
0 Punkte
Beantwortet von wimaxe Mitglied (119 Punkte)
Ich habe folgendes rausgefunden,

wenn ich im sheet "Zahlungen" in jeder Zelle Daten habe funktioniert alles

ich muss aber über den Button "CommandButton1" abspeichern können auch wenn nicht alle Textboxen mit Werten gefüllt sind!

Gruß
wimaxe
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo wimaxe,

Du musst vor dem Übertragen der Daten im Code kontrollieren, ob sich in den TextBoxen auch Werte befinden, die es erlauben mit CDATE() oder CDBL() usw. zu arbeiten. Du musst also für jede TextBox mit einer If-Abfrage kontrollieren, ob ein Wert in der TextBox steht und dieser bei Zahlen z.B. numerisch ist. Das würde bei Dir z.B. so aussehen:
If CheckIn <> "" And IsDate(CheckIn) Then
Sheets("Zahlungen").Cells(lngRow, 2) = CDate(CheckIn.Value)
Else
Sheets("Zahlungen").Cells(lngRow, 2) = ""
End If

If CheckOut <> "" And IsDate(CheckOut) Then
Sheets("Zahlungen").Cells(lngRow, 3) = CDate(CheckOut.Value)
Else
Sheets("Zahlungen").Cells(lngRow, 3) = ""
End If

If AnzahlungSoll <> "" And IsNumeric(AnzahlungSoll) Then
Sheets("Zahlungen").Cells(lngRow, 4) = CDbl(AnzahlungSoll.Value)
Else
Sheets("Zahlungen").Cells(lngRow, 4) = ""
End If
Hier wird geprüft, ob das Textfeld einen Wert enthält und ob dieser numerisch ist. Erst wenn das übereinstimmt, wird der TextBox-Inhalt übertragen. Wenn nicht, dann wird der Wert im Tabellenblatt „Zahlungen“ gelöscht.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von wimaxe Mitglied (119 Punkte)
Entschuldige meine Frage Oliver,

aber wo muss ich Deinen Code eintragen?

Gruß
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hi wimaxe,

na dort, wo Du die Daten übergibst, also bei dem CommandButton1_Click-Ereignis.

Du musst also anstelle von z.B.

Sheets("Zahlungen").Cells(lngRow, 2) = CDate(CheckIn.Value) dort

If CheckIn <> "" And IsDate(CheckIn) Then
Sheets("Zahlungen").Cells(lngRow, 2) = CDate(CheckIn.Value)
Else
Sheets("Zahlungen").Cells(lngRow, 2) = ""
End If
eintragen.

Wenn Du nicht möchtest, dass der Eintrag im Tabellenblatt "Zahlungen" gelöscht wird, wenn nichts in der TextBox steht, dann lasse einfach

Else
Sheets("Zahlungen").Cells(lngRow, 2) = ""
weg.
Probier mal ein bisschen herum, dann wirst Du schon sehen, wie das alles zusammenhängt.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
...