Code optimieren (Redundanz)
20.05.2018 11:02:53
Nils
ich habe mit Hilfe von Büchern ein Berechnungsprogramm diverser Formeln für Volumenkörper geschrieben. In der Excel Tabelle ist ein Button der eine UserForm öffnet. Die Userform enthält den Code.
Das Programm funktioniert auch tadellos, jedoch bin ich davon überzeugt, dass der Code unnötig lang ist, da er viele redundante Angaben enthält. Das größte Optimierungspotenzial sehe ich beim Validieren der Eingaben. Hier prüfe ich bei jedem Eingabefeld ob es sich um Zahlen handelt und wandle ein Komma in einen Punkt um, damit die Kommastellen mitberechnet werden, was bei einer Eingabe mit Komma ja nicht der Fall ist.
Dieser Programmabschnitt ist für jedes Feld gleich außer natürlich der Name des Feldes. Kann ich den Code nur einmal programmieren und ihn als eine Art "Klasse" bei jedem Feld wieder aufrufen?
Vielen Dank im Voraus!
Datei: https://www.herber.de/bbs/user/121714.xlsm
Code:
'Validierung der Eingabe
Private Sub txta_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'In Einer Textbox nur Ziffern zulassen mit Punkt als Dezimalzeichen
'ein eingegebenes Komma wird sofort in einen Punkt umgewandelt
If InStr("1234567890.,-" & Chr$(8), Chr$(KeyAscii)) = 0 Then
KeyAscii = 0
End If
If KeyAscii = Asc(",") Then
KeyAscii = Asc(".")
End If
'nur ein Dezimalzeichen zulassen
If InStr(1, txta.Text, ".", 0) And KeyAscii = Asc(".") Then
KeyAscii = 0
End If
End Sub
'Validierung der Eingabe
Private Sub txtb_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'In Einer Textbox nur Ziffern zulassen mit Punkt als Dezimalzeichen
'ein eingegebenes Komma wird sofort in einen Punkt umgewandelt
If InStr("1234567890.,-" & Chr$(8), Chr$(KeyAscii)) = 0 Then
KeyAscii = 0
End If
If KeyAscii = Asc(",") Then
KeyAscii = Asc(".")
End If
'nur ein Dezimalzeichen zulassen
If InStr(1, txtb.Text, ".", 0) And KeyAscii = Asc(".") Then
KeyAscii = 0
End If
End Sub
'Validierung der Eingabe
Private Sub txtc_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'In Einer Textbox nur Ziffern zulassen mit Punkt als Dezimalzeichen
'ein eingegebenes Komma wird sofort in einen Punkt umgewandelt
If InStr("1234567890.,-" & Chr$(8), Chr$(KeyAscii)) = 0 Then
KeyAscii = 0
End If
If KeyAscii = Asc(",") Then
KeyAscii = Asc(".")
End If
'nur ein Dezimalzeichen zulassen
If InStr(1, txtc.Text, ".", 0) And KeyAscii = Asc(".") Then
KeyAscii = 0
End If
End Sub
'Validierung der Eingabe
Private Sub txtDichte_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'In Einer Textbox nur Ziffern zulassen mit Punkt als Dezimalzeichen
'ein eingegebenes Komma wird sofort in einen Punkt umgewandelt
If InStr("1234567890.,-" & Chr$(8), Chr$(KeyAscii)) = 0 Then
KeyAscii = 0
End If
If KeyAscii = Asc(",") Then
KeyAscii = Asc(".")
End If
'nur ein Dezimalzeichen zulassen
If InStr(1, txtDichte.Text, ".", 0) And KeyAscii = Asc(".") Then
KeyAscii = 0
End If
End Sub
'Definition der Variablen & Berechnungen
Private Sub cmdBerechnung_Click()
'Definition der Variablen
Dim a As Double
Dim b As Double
Dim c As Double
Dim Dichte As Double
Dim d As Double
Dim Alpha As Double
Dim Volumen As Double
Dim Masse As Double
'Eingabewerte in nummerischen Wert konvertieren
a = Val(txta)
b = Val(txtb)
c = Val(txtc)
Dichte = Val(txtDichte)
'Berechnungen der Ausgabewerte
Volumen = (a * b * c) / 1000000 '/100000 ist die Umrechnung von mm³ in L
d = Sqr(a ^ 2 + b ^ 2 + c ^ 2) 'Sqr ist die Quadratwurel "Squareroot" ^ 2 ist die Potenz
Alpha = Atn(c / Sqr(a ^ 2 + b ^ 2)) * 180 / Application.Pi() 'Atn ist der Arcustangens. * 180 _
/ Application.PI() ist die Umrechnung nach °
Masse = Volumen * Dichte
'Übergabe der Variablen in die Texboxen
txtVolumen = Str(Volumen)
txtd = Str(d)
txtAlpha = Str(Alpha)
txtMasse = Str(Masse)
End Sub
'Event das beim Ändern des Wertes direkt die Berechnung startet
Private Sub txta_Change()
Call cmdBerechnung_Click
End Sub
'Event das beim Ändern des Wertes direkt die Berechnung startet
Private Sub txtb_Change()
Call cmdBerechnung_Click
End Sub
'Event das beim Ändern des Wertes direkt die Berechnung startet
Private Sub txtc_Change()
Call cmdBerechnung_Click
End Sub
'Event das beim Ändern des Wertes direkt die Berechnung startet
Private Sub txtDichte_Change()
Call cmdBerechnung_Click
End Sub