Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
612to616
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
612to616
612to616
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Läuft nur korrekt bei Debug Einzelschritt

Läuft nur korrekt bei Debug Einzelschritt
24.05.2005 13:12:02
Vliegen
Hallo alle,
Hab da mal wieder ein Problem und würde mich über eure Hilfe freuen.
Auf UF sind einige TBs. Davon sind zwei gegenseitig von einander abhängig und berechnen sich gegenseitig neu. Bedingung zum Nachrechnen ist dass der User das mit Ja in einer Message bestätigt und die Werte in anderen TBs bestimmte Bedingungen erfüllen. Hab um Zirkelbezug zwischen den beiden abhängigen TB zu vermeiden mit einer boolschen Variablen gearbeitet die ich mal auf True mal auf False stelle so dass das Makro des BeforeUpdate -Ereignisses nur dann laufen soll wenn die Änderung des Wertes tatsächlich durch den User ausgelöst wurde und nicht per Code. Die Sache mit den Berechnungen diesbezüglich klappt aber nur bedingt. Bei der Laufzeit werden beide BeforeUpdateMakros durchlaufen (das sehe ich daran dass er mehrmals Nachrichten anzeigt). Allerdings geschieht dieser Fehler nur im Modus Sub ausführen.
Setze ich einen Haltepunkt an den Anfang der BeforeUpdate-Ereignisse beider TB und lasse die Sache Einzelschritt (F8) durchlaufen klappt die Sache problemlos und er durchlâuft nur ein Makro nicht aber das zweite. Wenn ich nach den Haltpunkten aber auf den grünen Pfeil klicke und den gesamten Rest ablaufen lassen springt er wieder in das zweite Makro und beginnt den Zirkelbezug. Rechnerisch ist das nicht schlimm denn er rechnet richtig aber leider zeigt er mehr Messagboxen an als logisch wäre und der User versteht dann nicht was läuft.
Den Code der beiden TB BeforeUpdate Makros hab ich mal hier unten eingefügt.
Würde mich freuen wenn mir jemand zu diesem seltsamen Laufzeitverhalten etwas sagen kann. Bin für jeden Tipp dankbar.
Gruss,
François Vliegen
Option Explicite
Private bolAutoChange As Boolean 'cette variable prend la valeur false si la modification a été faite par code et true sie l'utilisateur lui-même a provoqué la modification

Private Sub TB1VolPerPat33_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim Message1 As Integer
Dim Message2 As Integer
'pour éviter que les modifications réalisées par code ne se transmettent en boucle
'seul les changements réalisés par l'utilisateur sont retenu
If Not bolAutoChange Then
bolAutoChange = True
'pour informer l'utilisateur que la valeur utilisée est issue des normes de production de la directive nitrate et qu'il faut être prudent avec les changements
Message1 = MsgBox _
("La valeur proposée que vous tentez de modifier indique pour un animal et un effluent défini le volume quotidien de production pendant la période de pâturage.  Cette proposition correspond aux normes légales de production d'effluents d'élevages telles qu'elles sont définies en Région Wallonne dans le cadre de la mise en application de la Directive Nitrates européene.  Pour respecter un dimensionnement de votre projet en fonction de ces normes il est vivement déconseillé de modifier cette valeur qui a notamment un impacte direct sur la capacité de stockage, le taux de liaison au sol et le bilan d'azote. Cliquer sur 'Oui' si vous souhaitez malgré tout modifier cette valeur, pour annuler la modification et retourner à la valeur proposée cliquer sur 'Non'.", _
vbYesNo + vbExclamation, "Attention !")
If Message1 = vbNo Then
Me.TB1VolPerPat33.Value = Me.TB1VolPerPat33.BoundValue 'remettre l'ancienne valeur
bolAutoChange = False
Exit Sub
Else
'Pour forcer une encodage de chiffre positif dans ce textbox
With Me.TB1VolPerStab32
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
'si modification pour corriger la production d'éffluent en période de stabulation en fonction du mode de stabulation choisi
With Me
Dim Stabulation As Single
Dim Paturage As Single
Stabulation = .TB1VolPerStab32.Value 'production en période de stabulation
Paturage = .TB1VolPerPat33.Value 'production en période de pâturage
'si une valeur nécessaire est nulle ou vide il ne peut pas recalculer et quitte en informant simplement
If .TB1VolPerStab32.Value = 0 Or .TB1VolPerStab32.Value = "" Or _
.TB1VolPerPat33.Value = "" Or .TB1VolPerPat33.Value = 0 _
Then
MsgBox "Suite à la modification que vous venez d'opérer un calcul correctif du volume produit en période de pâturage n'a pas pu être réalisé car parmi les données nécessaires à ce calcul au moins une valeur est nulle ou manque.  Eviter d'introduire une valeure nulle et vérifier le champs volume quotidien produit en période de pâturage!", vbExclamation, "Erreur de calcul possible!"
.TB1VolPerPat33.Value = .TB1VolPerPat33.BoundValue
.TB1VolPerPat33.SetFocus
.TB1VolPerPat33.SelStart = 0
.TB1VolPerPat33.SelLength = .TB1VolPerPat33.TextLength
' si le mode de stabulation est Pâturage jour et nuit la production ne peut pas être modifié (car non-sens)
ElseIf .CB1ModeStab5.Value = "Pâturage jour et nuit" _
Then
MsgBox "Vous avez choisi le mode de stabulation 'Pâturage jour et nuit'.  La production d'effluents utilisables pour l'installation est donc forcément égale à 0. Vous ne pouvez pas modifier cette valeur ! ", vbCritical, "Modification impossible !"
GoTo Errorhandler
Else
'ajouter le message de demande si conversion automatique de la production en période
'de pâturage est souhaitée
Message2 = MsgBox _
("La production quotidienne d'effluent/animal en période de stabulation et la production d'effluent/animal en période de pâturage sont étroitement liés. En fonction du mode de stabulation choisi et de votre modification au niveau de la production en période de pâturage le logiciel suggère un changement de la production quotidienne d'effluent en période de stabulation.  Les facteurs de conversion suggérés sont de 100 % en cas de stabulation permanente, 50 % en cas de stabulation jour et de stabulation nuit, 10 % en cas de pâturage jour et nuit avec traite à l'étable et 0 % en cas de pâturage jour et nuit. Pour pour que le logiciel recalcul le production en période de pâturage cliquer sur 'Oui' pour ne pas recalculer et modifier uniquement la production en période de stabulation cliquer sur 'Non'.", _
vbYesNo + vbQuestion, "Recalcul automatique souhaité ?")
If Message2 = vbNo Then
bolAutoChange = False
Exit Sub
Else
bolAutoChange = True
Select Case .CB1ModeStab5.Value 'en fonction du mode de stabulation le rapport entre production en période de stabulation et de pâturage varie (100 %, 50 %, 10 % ou 0 %)
Case "Stabulation permanente"
.TB1VolPerStab32.Value = Paturage
Case "Stabulation jour"
.TB1VolPerStab32.Value = Paturage * 2
Case "Stabulation nuit"
.TB1VolPerStab32.Value = Paturage * 2
'Case "Pâturage jour et nuit" a été éliminé par la condition un peu plus haut
'un recalcul est impossible donc il faut éviter une modification
'.TB1VolPerStab32.Value = 0
Case "Pâturage jour et nuit avec traite à l'étable"
.TB1VolPerStab32.Value = Paturage * 10
End Select
End If
End If
End With
End If
End If
bolAutoChange = False
Exit Sub
Errorhandler:
bolAutoChange = False
Cancel = True
End Sub


Private Sub TB1VolPerStab32_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim Message1 As Integer
Dim Message2 As Integer
'pour éviter que les modifications réalisées par code ne se transmettent en boucle
'seul les changements réalisés par l'utilisateur sont retenu
If Not bolAutoChange Then
bolAutoChange = True
'pour informer l'utilisateur que la valeur utilisé est issue des normes de production de la directive nitrate et qu'il faut être prudent avec les changements
Message1 = MsgBox _
("La valeur proposée que vous tentez de modifier indique pour un animal et un effluent défini le volume quotidien de production pendant la période de stabulation.  Cette proposition correspond aux normes légales de production d'effluents d'élevages telles qu'elles sont définies en Région Wallonne dans le cadre de la mise en application de la Directive Nitrates européene.  Pour respecter un dimensionnement de votre projet en fonction de ces normes il est vivement déconseillé de modifier cette valeur qui a notamment un impacte direct sur la capacité de stockage, le taux de liaison au sol et le bilan d'azote. Cliquer sur 'Oui' si vous souhaitez malgré tout modifier cette valeur, pour annuler la modification et retourner à la valeur proposée cliquer sur 'Non'.", _
vbYesNo + vbExclamation, "Attention !")
If Message1 = vbNo Then
Me.TB1VolPerStab32.Value = Me.TB1VolPerStab32.BoundValue 'remettre l'ancienne valeur
bolAutoChange = False
Exit Sub
Else
'Pour forcer une encodage de chiffre positif dans ce textbox
With Me.TB1VolPerStab32
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
'si modification pour corriger la production d'éffluent en période de pâturage en fonction du mode de stabulation choisi
With Me
Dim Stabulation As Single
Dim Paturage As Single
Stabulation = .TB1VolPerStab32.Value 'production en période de stabulation
Paturage = .TB1VolPerPat33.Value 'production en période de pâturage
If .TB1VolPerStab32.Value = 0 Or .TB1VolPerStab32.Value = "" Or _
.TB1VolPerPat33.Value = "" _
Then
MsgBox "Suite à la modification que vous venez d'opérer un calcul correctif du volume produit en période de pâturage 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 le champs volume quotidien produit en période de pâturage!", vbExclamation, "Erreur de calcul possible!"
Else
'ajouter le message de demande si conversion automatique de la production en période
'de pâturage est souhaitée
Message2 = MsgBox _
("La production quotidienne d'effluent/animal en période de stabulation et la production d'effluent/animal en période de pâturage sont étroitement liés. En fonction du mode de stabulation choisi et de votre modification au niveau de la production en période de stabulation le logiciel suggère un changement de la production quotidienne d'effluent en période de pâturage.  Les facteurs de conversion suggérés sont de 100 % en cas de stabulation permanente, 50 % en cas de stabulation jour et de stabulation nuit, 10 % en cas de pâturage jour et nuit avec traite à l'étable et 0 % en cas de pâturage jour et nuit. Pour pour que le logiciel recalcul le production en période de pâturage cliquer sur 'Oui' pour ne pas recalculer et modifier uniquement la production en période de stabulation cliquer sur 'Non'.", _
vbYesNo + vbQuestion, "Recalcul automatique souhaité ?")
If Message2 = 7 Then 'si l'utilisateur dit non finir sans calculer
bolAutoChange = False
Exit Sub
Else
bolAutoChange = True
Select Case .CB1ModeStab5.Value 'en fonction du mode de stabulation le rapport entre production en période de stabulation et de pâturage varie (100 %, 50 %, 10 % ou 0 %)
Case "Stabulation permanente"
.TB1VolPerPat33.Value = Stabulation
Case "Stabulation jour"
.TB1VolPerPat33.Value = Stabulation / 2
Case "Stabulation nuit"
.TB1VolPerPat33.Value = Stabulation / 2
Case "Pâturage jour et nuit"
.TB1VolPerPat33.Value = 0
Case "Pâturage jour et nuit avec traite à l'étable"
.TB1VolPerPat33.Value = Stabulation / 10
End Select
End If
End If
End With
End If
End If
bolAutoChange = False
Exit Sub
Errorhandler:
bolAutoChange = False
Cancel = True
End Sub

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Glaubst du wirklich, ...
24.05.2005 13:20:26
u_
Hallo,
dass sich jemand das antut? Habe leider keinen 2m breiten Bildschirm.
Gruß
Geist ist geil!
AW: Glaubst du wirklich, ...
24.05.2005 14:54:23
Vliegen
Hallo U,
Bei mir reichen eigentlich nur die Inhalte der MsgBoxen über den Bildschirmrand hinaus. Alles andere passt auf den 19 Zoll Bildschirm bei Einstellung 1024*768 Pixel.
Allerdings weiss ich bislang nicht wie ich denn beispielweise den Meldungsinhalt von MsgBoxen an die Zeile bringen kann (mit _ klappt das ja nicht). Muss ich da "xxx" & _ & "yyy" machen oder geht es auch anders ?
Gruss,
François
AW: Glaubst du wirklich, ...
24.05.2005 15:33:47
Volker
Hallo Francois,
so gehts:
MsgBox "xxx" & _
"yyy"
Was den Rest angeht, muß ich passen.
Die französischen Kommentare erhöhen aber auch nicht grad die Lesbarkeit.
Gruß
Volker
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige