Textboxänderungen ohne Zirkelbezug programmieren
20.05.2005 12:42:34
Vliegen
Sitze mal wieder vor einem Problem und brauche Hilfe. Hab auf einer UF verschiedene TBs deren Werte gegenseitig in mathematisch logischen Verhältnissen stehen müssen. Daher habe ich es so eingerichtet dass bei einer Veränderung eines TBs durch den Nutzer alle betroffenen TBs neu berechnet werden. Das bringt aber eine Art von Zirkelbezug auf die UF. Ich glaube das läuft dann eine gewisse Anzahl an Runden oder solange bis eine gewisse Abweichung innerhalb der Rechenläufe unterschritten wurde. Das Resultat ist dann immer eine Sache die fast genau stimmt aber viele Kommastellen hat.
Auf eine Frage im Forum hat mir vor einigen Wochen Nepumuk vorgeschlagen die Sache mit einer Boolean so zu gestalten dass sich der Berechnungen nur dann abspielen wenn die Änderung des Wertes in der TB auch tatsächlich vom User ausgelöst wurde und nicht durch Code. Hab das mal probiert und den untenstehenden Code zusammengestellt. Der läuft ohne die Booleangeschichte ganz gut. Auch mit läuft er aber nicht ganz so wie ich es mir vorstelle denn die erzwungene Eingabe von positiven Zahlwerten funktioniert dann noch nur beim ersten Mal richtig. Versucht der User ein zweites mal einen ungültigen Eintrag dann wird er akzeptiert.
Hab leider zu wenig Erfahrung in VBA und weiss daher nicht wie ich meinen Code umgestalten muss damit alles läuft wie beabsichtigt, sprich Zirkelbezüge vermieden werden, eventuelle Meldungen erscheinen und korrekte Eingaben erzwungen werden.
Freue mich über eure Anregungen und Vorschläge.
Gruss,
Francois
Option Explicite
Private bolAutoChange as Boolean
Private Sub TB1PotChQuatre29_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
'Um zu vermeidenen dass die TBs sich gegenseitig hochschaukeln wenn der Code des einen Veränderungen beim anderen auslöst
'sprich einen Zirkelbezug vermeiden mit der bolAutoChange Variablen
If Not bolAutoChange Then
bolAutoChange = True
'Um die Eingabe positiver Zahlwerte in die TB zu erzwingen
With Me.TB1PotChQuatre29
If Not IsNumeric(.text) Or _
.Value < 0 Then
MsgBox "Uniquement encoder des chiffres positifs dans ce champs !"
.Value = .BoundValue
.SetFocus
.SelStart = 0
.SelLength = .TextLength
GoTo Errorhandler
Else
Cancel = False
End If
End With
'Um betroffene andere TBs neu zu berechnen wenn Änderung durch den Nutzer erfolgte
With Me
Dim PcMS As Single 'pourcentage de matière sèche dans la matière fraiche
Dim PcMSorg As Single 'pourcentage de matière sèche organique dans la matière sèche
Dim PotMeth As Single 'potentiel méthanogène en litres CH4/ kg MSorg = m3 CH4/t MSorg
Dim PotGaz As Single 'potentiel de biogaz en m3 gaz/t MF
Dim QualGaz As Single 'qualité du biogaz en % CH4/unité biogaz
PcMSorg = .TB1MSorg21.Value
PcMS = .TB1MS20.Value
PotMeth = .TB1PotChQuatre29.Value
PotGaz = .TB1PotGaz31.Value
QualGaz = .TB1QualGaz30.Value
If .TB1MSorg21.Value = 0 Or .TB1MSorg21.Value = "" Or _
.TB1MS20.Value = 0 Or .TB1MS20.Value = "" Or _
.TB1PotChQuatre29.Value = 0 Or .TB1PotChQuatre29.Value = "" Or _
.TB1QualGaz30.Value = 0 Or .TB1QualGaz30.Value = "" _
Then
MsgBox "Suite à la modification que vous venez d'opérer un calcul correctif des autres paramètres concernés n'a pas pu être réalisé car parmi les données nécessaires à ce calcul au moins une valeur est nulle ou manque. Vérifier les champs teneur MS, teneur MSorg, potentiel méthanogène, potentiel biogaz, qualité biogaz !", vbExclamation, "Erreur de calcul possible!"
GoTo Ende
Else
.TB1PotGaz31.Value = PotMeth / 100 * PcMSorg / 100 * PcMS / QualGaz * 100
End If
End With
bolAutoChange = False
End If
Ende:
Exit Sub
Errorhandler:
Cancel = True
End Sub