PDA

Vollständige Version anzeigen : UserForm Datum und Zeit in Zelle eintragen lassen


SubLexx
09.07.2015, 09:49
Hallo Leute :)

Ich habe eine UserForm erstellt welche 3 Textfelder hat. Diese 3 Textfelder werden in die letzte nicht beschriebene Zelle eingefügt.

Tabellenblatt: Daten
TextBox1 kommt in Spalte C
TextBox2 kommt in Spalte D
TextBox3 kommt in Spalte E

Ich möchte aber nun das in Spalte A das aktuelle Datum eingefügt wird und in Spalte B die aktuelle Uhrzeit.

Mein Code:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

If CloseMode = vbFormControlMenu Then
MsgBox "Schließen nur über 'Temperatur eintragen' möglich."
Cancel = True
End If

End Sub


Private Sub CommandButton1_Click()

If TextBox1 = "" Then
MsgBox ("Bitte die Temperatur vom Kühlschrank eintragen.")
TextBox1.SetFocus
Exit Sub
End If

If TextBox2 = "" Then
MsgBox ("Bitte die Temperatur vom Tiefkühlschrank eintragen.")
TextBox1.SetFocus
Exit Sub
End If

If TextBox3 = "" Then
MsgBox ("Bitte den Kürzel des Mitarbeiters eintragen.")
TextBox1.SetFocus
Exit Sub
End If


Dim WkSh As Worksheet
Dim endzeile As Long

Set WkSh = Worksheets("Daten") 'Tabellenblatt

endzeile = WkSh.UsedRange.Rows.Count 'Eintrag in die letzte nicht beschriebene Zelle

WkSh.Cells(endzeile + 1, 3) = Date
WkSh.Cells(endzeile + 1, 3) = Time
WkSh.Cells(endzeile + 1, 3) = TextBox1
WkSh.Cells(endzeile + 1, 4) = TextBox2
WkSh.Cells(endzeile + 1, 5) = TextBox3

TempControl.Hide

End Sub

Mit "WkSh.Cells(endzeile + 1, 3) = Date" und "WkSh.Cells(endzeile + 1, 3) = Time" wird nichts eingefügt, wird einfach übersprungen. Der Rest funktioniert wie es soll :/
Kann mir jemand bitte verraten wie ich Datum und Uhrzeit einfügen kann?

Danke :)

MfG Lexx

GMG-CC
09.07.2015, 10:24
Moin,

du musst auch schon die richtige Zelladresse eingeben, damit das klappt ...
WkSh.Cells(endzeile + 1, 1) = Date 'Spalte_A
WkSh.Cells(endzeile + 1, 2) = Time 'Spalte_B
WkSh.Cells(endzeile + 1, 3) = TextBox1 'Spalte_C


Ansonsten: So geht es leichter und verhindert Fehler:
With WkSh
.Cells(endzeile + 1, 3) = Date
.Cells(endzeile + 1, 3) = Time
.Cells(endzeile + 1, 3) = TextBox1
End With

Gleitschirmflieger
09.07.2015, 11:37
Hoi,

Falls Du alle drei Werte in eine einzige Zelle schreiben willst (... mit Komma getrennt) geht das so:


WkSh.Cells(endzeile + 1, 3).Value = Date & "," & Time & "," & .TextBox1.Value


Willst Du die drei Werte in drei unterschiedliche Zellen schreiben macht Du mit Deinem Code einen fatalen Fehler:

Du schreibst 3 mal in die selbe Zelle
(... und überschreibst den zuerst eingetragenen Wert damit zwei mal)

Auszug aus Deinem Code:


WkSh.Cells(endzeile + 1, 3) = Date
WkSh.Cells(endzeile + 1, 3) = Time
WkSh.Cells(endzeile + 1, 3) = TextBox1


Außerdem schlechte Praxis:
Du legst Deine Variable "endzeile" zu Begin einmalig fest!
Somit ist diese in Stein gemeiselt und hat solange den selben Wert bis die Sub erneut ausgeführt wird:


endzeile = WkSh.UsedRange.Rows.Count 'Eintrag in die letzte nicht beschriebene Zelle


Die bessere Praxis wäre es, die letzte Zeile von einer Function berechnen zu lassen:


Public Function LastRow(ByVal strWorksheet As String) As Integer
Dim objWS As Worksheet
Set objWS = ThisWorkbook.Worksheets(strWorksheet)
LastRow = objWS.UsedRange.Rows.Count
Set objWS = Nothing
End Function


Damit wird die letzte Zeile bei Bedarf immer neu berechnet und Du läufst nicht Gefahr bereits eingetragene Werte zu überschreiben.

Ich habe Deine Art der Berechnung in diese Function übernommen.
Der Aufruf schaut dann so aus:


Public Sub Test()
Dim objWS As Worksheet
Set objWS = ThisWorkbook.Worksheets("Daten")
' Untereinander ab der letzten Zeile in Spalte "A":
objWS.Cells(LastRow("Daten") + 1, 1).Value = Date
objWS.Cells(LastRow("Daten") + 1, 1).Value = Time
' Nebeneinander in Spalte "A" und "B" der letzten Zeile:
' objWS.Cells(LastRow("Daten") + 1, 1).Value = Date
' objWS.Cells(LastRow("Daten"), 2).Value = Date
Set objWS = Nothing
End Sub


Aber Achtung! ... Falle: .UsedRange
Steht nur in der ersten Zeile ein Wert: LastRow = 1.
Ist Dein Worksheet leer: LastRow = 1.
Somit hast Du zwei mal das selbe Ergebnis.
In Deinem Programm würdest Du zwei mal in die selbe Zelle schreiben bzw den zuerst eingetragenen Wert mit dem zweiten wieder überschreiben.

Das hier ist die bessere Methode um die letzte Zeile zu berechnen:


Public Function LastRow(ByVal strSheetName As String, ByVal intColumn As Integer) As Integer
On Error Resume Next
LastRow = ThisWorkbook.Worksheets(strSheetName).Cells(Rows.Count, intColumn).End(xlUp).Row
End Function


Mit dieser Funktion kannst Du explizit für jede Spalte die letzte Zeile berechnen lassen.

Hier ist der Aufruf dann wie folgt:


Public Sub Test()
Dim objWS As Worksheet
Set objWS = ThisWorkbook.Worksheets("Daten")
' Untereinander ab der letzten Zeile in Spalte "A":
objWS.Cells(LastRow("Daten", 1) + 1, 1).Value = Date
objWS.Cells(LastRow("Daten", 1) + 1, 1).Value = Time
' Nebeneinander in Spalte "A" und "B" der jeweils letzten Zeile:
' objWS.Cells(LastRow("Daten",1) + 1, 1).Value = Date
' objWS.Cells(LastRow("Daten",2), 2).Value = Date
Set objWS = Nothing
End Sub


Hoffe geholfen zu haben.

Gruß,
Frank

SubLexx
13.07.2015, 07:25
@GMG-CC
Vielen Dank für die Hilfe :)
Kann natürlich nicht funktionierren wenn ich es immer in die gleiche Zelle schreiben lasse :D

@Gleitschirmflieger
Danke für die Ratschläge und kleine Schulung ^_^
Habe es nun geändert :)

MfG Lexx