Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1624to1628
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Code optimieren (Redundanz)

Code optimieren (Redundanz)
20.05.2018 11:02:53
Nils
Hallo Zusammen,
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

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code optimieren (Redundanz)
20.05.2018 12:44:40
Tino
Hallo,
mal so auf die Schnelle könntest Du mit einer separaten Funktion arbeiten.

'Validierung der Eingabe
Private Sub txta_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = MeKeyAscii(txta, KeyAscii)
End Sub
'Validierung der Eingabe
Private Sub txtb_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = MeKeyAscii(txtb, KeyAscii)
End Sub
'Validierung der Eingabe
Private Sub txtc_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = MeKeyAscii(txtc, KeyAscii)
End Sub
'Validierung der Eingabe
Private Sub txtDichte_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
KeyAscii = MeKeyAscii(txtDichte, KeyAscii)
End Sub
Function MeKeyAscii(MeTxTBox As MSForms.TextBox, ByVal Key As Integer) As Integer
'In Einer Textbox nur Ziffern eingaben zulassen mit Punkt als Decimalzeichen
'ein eingegebenes , wird sofort in einen Punkt umgewandelt
MeKeyAscii = Key
If InStr("1234567890.,-" & Chr$(8), Chr$(Key)) = 0 Then
MeKeyAscii = 0
End If
If Key = Asc(",") Then
MeKeyAscii = Asc(".")
End If
'nur ein Dezimalzeichen zulassen
If InStr(1, MeTxTBox.Text, ".", 0) And Key = Asc(".") Then
MeKeyAscii = 0
End If
End Function
Gruß Tino
Anzeige
AW: Code optimieren (Redundanz)
20.05.2018 13:22:52
Nils
Ja genau so etwas habe ich mir vorgestellt! Vielen Dank Tino :)
weitere Variante
20.05.2018 13:56:32
Tino
Hallo,
eine weitere Variante wäre mittels Klassenprogrammierung.
Aber bei 4 Textboxen ist dies noch nicht unbedingt notwendig!
https://www.herber.de/bbs/user/121716.xlsm
Gruß Tino
AW: weitere Variante
21.05.2018 12:09:47
Nils
Das scheint mir dennoch die sauberste Trennung zu sein! Da ich plane viele Formulare zu haben, die alle ähnlich sind, brauche ich die Formularprüfung nur noch einmal im Dokument haben. Du hast mir dadurch auch geholfen die Prozesse innerhalb von VBA besser zu verstehen. Vielen Dank für deine Mühe Tino!
Anzeige
AW: weitere Variante
21.05.2018 13:04:27
Nils
Eine Frage habe ich doch noch. Bei der Userform hast du
Dim MeTxTBox(3) As New Klasse1
vorangestellt. entspricht (3) dabei der Schreibweise (1 to 3)?
AW: weitere Variante
21.05.2018 14:38:21
Nils
Außerdem erhalte ich leider einen Überlauf Fehler, sobald ich ein zweites Formular einbinde :( Ich dachte so könnte ich die Klasse in mehreren Formularen ansprechen.
AW: weitere Variante
21.05.2018 18:21:54
Tino
Hallo,
lade bitte eine Beispiel Datei hoch!
Gruß Tino
AW: weitere Variante
21.05.2018 20:07:25
Nils
Hallo Tino,
ja selbstverständlich sorry :/ Leider ist die Datei mittlerweile zu groß um sie hier hochzuladen. Ich hoffe es ist okay, wenn ich einen link setze.
http://www.chaoswolf.de/downloads/Berechnungen%20neu.xlsm
Viele Grüße
Nils
Anzeige
AW: weitere Variante
21.05.2018 20:08:38
Nils
Habe ich vergessen, der Fehler tritt auf, wenn etwas ins Formular Zylinder eingegeben werden soll.
AW: weitere Variante
21.05.2018 20:10:15
Nils
Habe vergessen die Frage wieder als offen zu markieren. Das Forum müsste mal ein wenig auf einen neueren Stand gebracht werden. :D
falscher Link?!
21.05.2018 20:29:52
Tino
Hallo,
leider kann ich deine Datei nicht laden!
Fehler: "Diese Seite existiert leider nicht."
Gruß Tino
AW: falscher Link?!
21.05.2018 20:38:32
Nils
Und wieder vergessen den Haken zu setzen.
Anzeige
AW: falscher Link?!
21.05.2018 21:28:03
Tino
Hallo,
der Grund ist du sprichst in der Sub nur die Userform Quader an,
nicht die wo in der Textbox die eingabe stattfindet!
Lösung ist du übergibst an die Sub die entsprechende Userform um diese auch ansprechen zu können.
(habe die Bilder alle gelöscht damit ich diese hier hochladen kann)
https://www.herber.de/bbs/user/121726.xlsm
Eine andere Variante wäre du benennst die TextBoxen wo die Ergebnisse rein sollen gleich und verwendest zur Berechnung Variablen die du am ende in die entsprechende Textbox auf der richtigen Userforme einträgst.
Fazit du musst immer einen Weg finden wie du die richtige Textbox auf der richtigen Userformen ansprechen kannst!
Gruß Tino
Hallo,
der Grund ist du sprichst in der Sub nur die Userform Quader an
nicht die wo in der Textbox die eingabe stattfindet!
Anzeige
AW: falscher Link?!
22.05.2018 07:20:21
Nils
Du hast mir wieder einmal den Tag gerettet! Vielen Dank Tino!

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige