AW: Welches Code?
28.04.2022 17:31:49
Yal
Hallo Ulf,
kürzer wird's kaum. Einige Sachen können anders behandlet werden.
Achte auf das Einrücken, es erleichtert die Lesbarkeit.
Auch der Auswahl der Variable l0010 ist sehr störend: Kleines L sieht aus wie einen 1 und dahinter Zahlen: macht die Lesbarkeit schwieriger.
Potentielle Kürzung
z.B.:
If Eingabe.Text_geschätzt.Value = "" Then
Sheets("Daten").Cells(last, 5).Value = CCur("0")
End If
If Eingabe.Text_geschätzt.Value > "" Then
Sheets("Daten").Cells(last, 5).Value = CCur(Eingabe.Text_geschätzt.Value)
End If
wird zu (wenn man davon ausgeht, dass hier nie negative Zahlen eingetragen werden):
Sheets("Daten").Cells(last, 5).Value = CCur("0" & Eingabe.Text_geschätzt.Value)
Wobei Du den Datentyp Currency gar nicht brauchst: es hat nur nicht damit zu tun, ob es einen Geldbetrag oder nicht, sondern nur um die Anzahl von Ziffern vor und nach der Kommastelle. Der Typ Currency erlaubt Werte in 15+4, also 15 Ziffern vor der Komma und 4 nach (zwischen -922 und +922 Billion). Ich vermute, solche Zahlen brauchst Du nicht. Ein Double (CDbl) erlaubt 15 Ziffern, verteilt vor und nach der Komma. Aber hier wenig relevant.
Die Weiderholung von Eingabe kann mit einem With vermieden werden. Alles was zwischen With objName und End With mit einem Punkt anfängt, ist mit objName davor zu verstehen.
Man könnte anstatt die Zeilenumer eine Objektvariable auf die gesamte Zeile und dann eine relative Adresse verwenden: Cells(1, 1) ist die Zelle in Spalte A der vorgemerkte Zeile.
Private Sub Command_OK_Click()
Dim Dat As Range
Dim Chk As Range
Set Dat = Sheets("Daten").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).EntireRow
Set Chk = Sheets("0010").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).EntireRow
With Eingabe
Dat.Cells(1, 1) = CDate(.Text_Datum.Value)
Dat.Cells(1, 2) = .Text_Monat.Value
Dat.Cells(1, 3) = .Text_KW.Value
Dat.Cells(1, 4) = CCur("0" & .Text_geschätzt.Value)
Dat.Cells(1, 5) = .Combo_Projekt.Value
'6
Dat.Cells(1, 7) = .Text_JahrKW.Value
If .Check_0010.Value = True Then
Dat.Cells(1, 6) = Check_0010.Caption
Chk.Cells(1, 1) = CDate(.Text_Datum.Value)
Chk.Cells(1, 2) = .Text_Monat.Value
Chk.Cells(1, 3) = .Text_KW.Value
Chk.Cells(1, 4) = .Text_Fehler.Value
Chk.Cells(1, 5) = CCur("0" & .Text_geschätzt.Value)
Chk.Cells(1, 6) = .Combo_Grund.Value
Chk.Cells(1, 7) = CCur("0" & .Text_Rechnung.Value)
Chk.Cells(1, 8) = .Text_xFlow.Value
Chk.Cells(1, 9) = .Text_QMonat.Value
Chk.Cells(1, 10) = .Combo_Status.Value
Chk.Cells(1, 14) = .Combo_Projekt.Value
Chk.Cells(1, 15) = .Combo_Verursacher.Value
Chk.Cells(1, 16) = .Text_IQOS.Value
End If
End With
End Sub
Es ist nicht kürzer. Aber leichter zu lesen. So kannst Du besser entdecken, dass im ersten Block die Spalte 5 doppelt vergeben war. Ich habe es in 4 geändert:
Dat.Cells(1, 4) = CCur("0" & Eingabe.Text_geschätzt.Value)
Ich habe an den .Value hinter den Dat.Cells(1, 1) gespart. Es könnte eventuell zu eine Störung führen. Da habe ich nicht weiter geforscht.
VG
Yal