PDA

Vollständige Version anzeigen : Plausibilitätskontrolle in Registerblättern beim Speichern


Mose.P
23.10.2003, 15:49
Hallo allerseits,

nach längerer Forums-Abstinenz bin ich nun doch mal wieder hier gelandet, auf der Suche einer Lösung für mein Problem mit meiner Plausibilitätskontrolle.

Ich habe ein Unterformular mit mehreren (sieben) Registerblättern. In diesen befinden sich viele ungebundene Textboxen, in die man Zahlen eingeben kann (für statistische Auswertungen). Diese sind jeweils als TextA1, Text A2, ... TextB1, TextB2,... TextK6 numeriert (A, B,... für das Registerblatt, 1,2,... für die Nummer im Blatt).

Nun möchte ich vor dem Speichern der Daten (das über einen extra Funktionsaufruf erfolgt) in einer Funktion überprüfen, ob die eingegebenen Daten sinnvoll sind, d. h. eine Plausibiliätskontrolle machen. Dazu nehme ich Werte, die in den Registerblättern als Vorjahreswerte in den Feldern TextA1a, TextA2a,... TextK6a angezeigt werden.

Aufgrund der großen Anzahl an Steuerelementen möchte ich nicht alle Steuerelemente auflisten und für jedes was in diesem Sinn schreiben:
If TextA1/TextA1a>0,02 then
TextA1.backcolor="rot"
msgbox "Wert nicht plausibel"
End If

Lieber wäre mir aber eine Variante dieser Art als allgemeine Funktion, die ich vor dem Speichern aufrufen kann:
For Each ctl In Me.Controls
' Prüfen, ob das Steuerelement ein Textfeld ist.
If (ctl.ControlType = acTextBox And Right(ctl.Name, 1) = "a") Then 'Prüfen, ob ein Textfeld "Vorjahr" exisitert
If Len(ctl.Name) = 7 Then ' z. B. "TextA1a"
'Checkroutine einstellige Steuerelement-Ziffer
ElseIf Len(ctl.Name) = 8 Then ' z. B. "TextA12a"
'Checkroutine zweistellige Steuerelement-Ziffern
End If
End If
Next ctl
Hier fehlt mir jetzt noch die Möglichkeit, zu jeder Textbox "TextA1a " die Textbox "TextA1 " anzusprechen. Das erste hätte ich ja als ctl bereits da, aber wie komme ich auf das andere Element? Ich dachte an Mid(ctl.name,1,6) (weil die Felder sich nur durch das angehängte a unterscheiden), aber damit kann ich ja keine mathematische Funktion im Sinne von ctl/Mid(ctl.name,1,6)>0,02 machen.

Hat jemand eine Idee für mich?
Oder vielleicht einen ganz anderen Ansatz?

Ich möchte erreichen, dass die "unplausiblen" Werte (also die, die beispielsweise um mehr als 20 % abweichen) rot markiert werden und der Anwender mit einer (nur einer einzigen) Warnmeldung für alle Fehler informiert werden. Daraufhin soll er aber trotzdem die Daten bestätigen können und sozusagen die Warnung ignorieren können.

Freue mich auf jede Antwort!

Arne Dieckmann
23.10.2003, 15:57
So ganz durchgestiegen bin ich jetzt nicht, aber Du kannst ja mit ctl.Name den Namen ermitteln (machst Du ja auch schon).

Anschliessend könntest Du ungefähr mit (ungetestet):

Dim FehlerGefunden as Boolean
If Me(ctl.Name)/Me(ctl.Name &"a")>0.02 Then
me(ctl.Name).backcolor=255
Fehlergefunden=True
End If

bzw.

If Me(ctl.Name)/Me(Mid(ctl.Name,1,6)) > ?? Then

oder wie auch immer die Inhalte vergleichen.

Die Msgbox gibst Du dann ganz zum Schluss aus, indem Du bei unplausibler Eingabe eine Boolean-Variable setzt:

If FehlerGefunden Then Msgbox "Unplausibel..."

Mose.P
30.10.2003, 18:01
Hallo Arne,

vielen Dank für den Hinweis. Mit Me(ctl.name) und den entsprechenden Varianten (Mid, Right, Left) geht es wunderbar! Danke, genau das hatte ich gesucht! :10points: