Exel VBA Berechnung im Userform/Textfeld?
Heute habe ich mal wieder Zeit mich mit Excel / VBA zu beschäftigen. Und komme leider nicht wirklich weiter
Kurze Erläuterung:Ich kann per DropDawn Liste in einem Userform, Daten aus einer Tabelle integrieren. Beispiel: Nahrungsmittel1 auf 100g mit jeweils 10g Eiweiß, 18g Kohlenhydrate usw. werden in Userform/Textfelder eingetragen
Jetzt möchte ich, wenn ich im Userform die Menge z.B. auf 200g ändere, dass die Zahlenwerte für Kohlenhydrate, Eiweiß etc. automatisch aktualisiert werden.
Code zuzeitPrivate Sub txtMenge1_Change()
If CDbl(txtMenge1) <> 100 Then
txtKohlenhydrate1.Value = CDbl(txtKohlenhydrate1) * CDbl(txtMenge1) / 100
End If
End Sub
Problem ist jetzt folgendes
Er aktualisiert zwar z.B. im Textfeld Kohlenhydrate was sobald eine Eingabe erfolgt, rechnet aber nicht mit dem Ursprungswert von zb. 10g oder 18g. Sobald ich anfange die Zahl in Menge auf 200g zu ändern passiert jetzt folgendes. Wenn ich jetzt anfange die Zahl auf 2 ändere, stimmt das Ergebnis noch. Möchte ich aber jetzt eine 0 hinzufügen, geht er nicht mehr von 10g bzw 18g aus, sondern von denm Wert der bei einer 2 berechnet wurde. Somit stimmt das Ergebnis nicht mehr. Bei 2 kommen bei 10g ja erst mal 0.2g aus, füge jetzt jetzt aber ne 0 hinzu, sollen eigentlich 2 rauskommen. Es kommt dann aber 0,04 raus.
Da ich in VBA noch Neuling bin,möchte ich bitten mir das verständlich zu erklären. Danke im Vorraus
2 Antworten
txtKohlenhydrate1.Value = CDbl(txtKohlenhydrate1) * CDbl(txtMenge1) / 100
tut folgendes:
Der Inhalt von txtKohlenhydrate1 wird ausgewertet
Der Inhalt von txtMenge1 wird ausgewertet
Hieraus wird das Produkt gebildet und dies durch 100 geteilt
Das Ergebnis wird wieder in txtKohlenhydrate1 geschrieben
Wenn dieselbe Funktion noch mal ausgeführt wird, wird der jetzt aktuelle Wert von txtKohlenhydrate1 genommen, nicht der originale Wert
Du könntest auf das LostFocus- Ereignis reagieren, aber dann
sind nachträgliche Korrekturen in txtKohlenhydrate1 auch nicht mehr so
ohne weiteres möglich.
Aber das Problem dürfte am einfachsten und besten zu umgehen sein, indem du ein eigenes Textfeld für txtKohlenhydratePro100g einführst und dann
txtKohlenhydrate1.Value = CDbl(txtKohlenhydratePro100g) * CDbl(txtMenge1) / 100
Das hat außerdem den Vorteil, dass du auch sofort auf Änderungen in txtKohlenhydratePro100g reagieren kannst.
Dafür wäre eine Verweistabelle sinnvoller. Ich dachte, es wäre eine Übung zum Thema UserForms und DropDown-Listen.
Wenn du keine Verweistabelle haben willst, kannst du die Werte für 100 g je Lebensmittel auch in eine eigene Datei auslagern, am einfachsten Excel - dann kannst du mit Excel-Funktionen darauf zugreifen -, ansonsten eine Textdatei o. ä., die du mit der UserForm einlesen kannst.
Natürlich ist auch das programmgesteuerte Ändern eines vorher eingetragenen Wertes möglich - am besten, wenn das Eingabefeld verlassen wird, also im LostFocus- oder (besser) Validate-Ereignis -, aber wenn es sich um Stammdaten handelt, widerspricht das meiner Auffassung von Benutzerfreundlichkeit so sehr, dass ich es einfach nicht empfehlen kann.
sowas macht man mit einer Verweistabelle, nicht mit Makros.
Such Dir zum Lernen ein besseres Beispiel, wo Makros nötig sind (ich gebe zu, sinnvolle einfache sind durch den gewachsenen Umfang der Fähigkeiten von xl stark geschrumpft, meine frühen Makros sind von xl größtenteils überholt worden)
Hallo
Erst mal Danke für deine Antwort. Mein Problem ist, wenn ich das so machen würde, hätte ich auf meinem UserForm später das doppelte an Textfeldern.
Ich erkläre mal kurz was ich vor habe. Ich bin dabei, mir ein Art Ernährungsplan zu erstellen.
Unter anderem habe ich erstens, eine weitere Eingabemaske (Userform) mit der ich Lebenmittel mit Angaben zu den Nährwerten in eine Tabelle (Lebensmitteltabelle) eintragen kann.
Um das Userform, um das es geht soll jetzt folgendes passieren.
Als erstes kann man die Lebensmittel aus Lebensmitteltabelle per DropDawn auswählen und es werden dann automatisch die Nährwerte mit ins Userform übernommen.
Insgesamt gibt es 6 Reihen die wie folgt aussehen
Lebensmittel1 - Kategorie1 - Menge1 - Kohlenhydrate1 - Fett1 - Eiweiß1 - Ballastoffe1 - Kalorien1
Lebensmittel2 - Kategorie2 - Menge2 - Kohlenhydrate2 - Fett2 - Eiweiß2 - Ballastoffe2 - Kalorien2
usw. bis 6
Dann kommt eine weitere Reihe wo die gesamten Nähewerte zusammen gerechnet werden sollen.
GESAMT - Menge7 - Kohlenhydrate7 - Fett7 - Eiweiß7 - Ballastoffe7 - Kalorien7
Und jetzt kommt noch eine Reihe in der man jetzt aus den 6 ausgewählten Lebenmittel ein Rezept erstellen kann.Es soll ein Rezeptname in ein Textfeld geschrieben werden und das dann auf 100g automatisch berechnet werden.
Rezeptname - Kategorie8 - Menge8 - Kohlenhydrate8 - Fett8 - Eiweiß8 - Ballastoffe8 - Kalorien8
Danach soll durch klicken eines Buttons, der gesamte Inhalt vom Userform in eine Tabelle (Rezepttabelle) einfügt werden.(Damit man auch nach einem halben Jahr noch nachvollziehen kann, woraus das Rezept ursprünglich bestand).Und nur das Rezept (letzte Reihe des Userform) mit Namen und Nährwerten soll dann in die Lebensmitteltabelle einfügt werden.
Die Lebenmittel soll man später in einer weiteren Tabelle als DropDawn auswählen können.
Und jetzt glaube ich sieht man auch wo rauf das hinauslaufen würde. Das Userform wurde dann doppelt so groß werden und auch unübersichtlicher.Deswegen wäre es schön, sobald man die Menge ändert, dass automatisch die Daten geändert werden, aber von den Ursprungswerten aus gesehen. Bin mir nur nicht sicher ob dieses in dieser Form mit Excel überhaupt möglich ist.
Danke im Vorraus und ich hoffe man versteht jetzt, worauf ich hinaus möchte.