Background:
Ich habe eine Gültigkeitsprüfung für ein Textfeld erstellt, die nur Werte zulässt, die sich durch 0,25 teilen lassen. Da Modulo offenbar nur mit Ganzzahlen arbeitet, habe ich das mit 100 multipliziert und dann gehts per Division wieder zurück zur Dezimalzahl. Das klappt alles.
Problem:
Wenn ich nach einer falschen Eingabe (z.B. 1,65) die MsgBox mit OK bestätige, springt der Fokus nicht ins selbe Feld - sondern das nächste Feld wird markiert. Man kann also nicht gleich einen passenden Wert eingeben sondern muss zuerst wieder händisch das Textfeld selektieren.
Selbst mit der SetFocus Funktion klappt das nicht. Was mache ich falsch ? Bitte um Info, falls weitere Infos nötig sind. Hier der Code für das Textfeld nach Aktualisierung: Private Sub txtElevation_AfterUpdate()
Dim elev As Double
elev = (Me.txtElevation * 100) Mod 25
If elev <> 0 Then
MsgBox "Elevation muss ein vielfaches von 0,25 sein", vbExclamation + vbOKOnly
End If
Me.txtElevation.SetFocus
End Sub
Hallo,
das geht so nicht. Du musst zum Prüfen das Ereignis "Vor Aktualisierung" verwenden.
Dieses lässt sich mit Cancel=True abbrechen. Dann bleibt der Focus im Feld.
Mit einer Fließkommazahl (Double) halte ich das aber für problematisch, besser wäre es Du würdest als Datentyp Dezimal oder Währung verwenden.
Die Variable elev ist ohnehin überflüssig.
If (Me.txtElevation * 100) Mod 25 <> 0 Then
MsgBox "Elevation muss ein vielfaches von 0,25 sein", vbExclamation + vbOKOnly
Cancel = True
Exit Sub
End If
In welchem Bereich kann denn die Eingabe für Elevation liegen (Grenzwerte) ?
PS:
Währung rechnet intern mit einer Ganzzahl, das Währungskennzeichen kann man ausblenden.
Vielen Dank! Hab es als völliger Neuling in Access VBA mit einigem herumprobieren hinbekommen.
Zur Variable elev: In diesem Kontext ist sie sinnlos - stimme ich völlig zu ;) Aber ich brauche deren Inhalt später noch für andere Dinge. Und ich werde sie als Währung deklarieren.
Was die Grenzwerte betrifft: Diese sind abhängig vom Verstellbereich des Zielfernrohres. Bei langen Schussdistanzen über 1000m sind hier also Werte zw. 30 und 34 nötig. Aber eben immer ein Vielfaches von 0,25 (oder 0,125 mit der besseren Optik, da diese mit 1/8 Winkelminute pro Klick arbeitet). Wieso ? Gibt es da etwas bestimmtes zu beachten was die Grenzwerte betrifft ?
Hallo,
ZitatAber ich brauche deren Inhalt später noch für andere Dinge.
Dann berechne es wieder, wenn Du es brauchst. Wenn die Sub geschlossen ist, gibt es den Inhalt der Variablen ohnehin nicht mehr, sie ist ja nur in dieser Sub deklariert. Außerdem lässt sich ein solcher Wert problemlos in einer Abfrage berechnen.
Du musst übrigens Elevation in der Tabelle als Währung anlegen, die Variable ist da bedeutungslos, wird ja wie gesagt auch nicht benötigt.
Das mit den Grenzwerten wollte ich nur wissen, hatte noch eine andere Idee, ist aber weggefallen.
ZitatAber ich brauche deren Inhalt später noch für andere Dinge.
Du brauchst das Ergebnis einer Überprüfungsrechnung mit ggf. falscher Basis, die Du dann nicht beibehalten willst, für andere Dinge? Das müsste besonders erklärt werden.
Die richtige Eingabe steht dann ja im Formulartextfeld oder gar bei einem gebundenen Formular in einer Tabelle (nach Speicherung) und wäre dort entnehmbar.
Ergänzung: Da Du so schön rechnest, könntest Du nach der Meldung auf Unrichtigkeit gleich einen korrekten Wert errechnen und ins Textfeld schreiben, so als Hilfe an den Bediener.
Wenn es also überwiegend sinnvoll ist, den nächsthöheren Wert zu verwenden (1,65 => 1,75), dann schlage ihn unmittelbar vor. (Alle reden von AI. Lass Dein Programm etwas intelligent wirken.)
Alternativ könnte man per ComboBox nur gültige Werte anbieten. Dann kann der Bediener nur falsch auswählen, aber immer nur aus korrekten Werten.
@klaus: Das mit der elev Variable hat sich erledigt. Da hatte ich einen ordentlichen Denkfehler drinnen. Ich habe mittlerweile das Gefühl, dass ich bei den ganzen Abfragen und Modulen ein wenig den Überblick verloren habe ;-)
Das mit der Umstellung auf "Währung" habe ich schon gemacht (natürlich in der Tabelle). Funktioniert einwandfrei.
@Eberhard: Variable ist kein Thema mehr (s.o.). Danke für Eure Tipps ! Ich bin zwar nur selbst der Bediener - aber das mit dem Vorschlag errechnen und ins Textfeld schreiben lassen ist eine super Idee von Dir - aber wieder eine neue Bastelei. Geht das vermutlich über "Runden" ?
Die ComboBox hatte ich mir auch schon überlegt - aber da hätte ich pro ganzer Zahl 4 Einträge (1 / 1,25 / 1,5 / 1,75) und ich brauche ca. 35 ganze Zahlen (35 x 4 = 140 Listeneinträge in der Combobox - und wenn ich die bessere Optik mit 1/8 Teilung verwende. sind es überhaupt 280 Einträge). Ich werde das mit dem Runden als Finetuning im Hinterkopf behalten und implementieren, wenn der Rest fertig ist.
Zur AI: Ich denke zuerst muss ich mal intelligent werden, was Access betrifft ;-) Danach kann ich dann an AI denken ;-) hehehe.
Danke nochmals für Eure tollen Tipps und Hinweise! Sehr hilfreich für mich als Laien!
Zitat280 Einträge
Das einmalige Berechnen und Anlegen als Feld in einer Tabelle sollte nicht die große Herausforderung sein. In einem zweiten Feld könnte man ein Merkmal hinterlegen, auf das man die nur 1/4-Skalierung filtern kann.
Die RowSource der ComboBox könnte dann über einen Schalter oder ein Optionsfeld gesteuert werden, die die entsprechende Filterung ein- oder ausschaltet.
Zur Auswahl: Mit der Eigenschaft "automatisch ergänzen" sollte man sehr schnell auch aus einer größeren Menge zu seinem Wert finden. Einfach losschreiben.
Zitatauf das man die nur 1/4-Skalierung filtern kann.
Vielleicht kann da auch was mit den Schussdistanzen anfangen um
auf die Bereiche der Elevationswerte zu filtern. Hörte sich so
an.
Ihr habt natürlich ERNEUT recht !! ;-) Ich habe nicht daran gedacht, dass Access ohnehin diese Vervollständigung macht. Dann braucht man ja gar nicht durch alle Einträge scrollen sondern einfach nur eintippen. Und aus dieser "Prüftabelle" wird dann ohnehin der passende Wert vorgeschlagen. Super Gedanke!
Und auch den Vorschlag von Beaker werde ich aufgreifen. Wenn die Distanz nur 300 meter beträgt, brauch ich keine 20 Winkelminuten Drop auszugleichen. Also ihr habt Ideen !!!! Großartig !!!
Ein "Problem" das sich abzeichnet: Ich verbringe mehr Zeit an der Datenbank als beim Schießen. Das war eigentlich nur als kleine Hilfe gedacht aber es wächst und wächst und wächst...
ZitatIch verbringe mehr Zeit an der Datenbank als beim Schießen.
LOL