OVH Cloud OVH Cloud

Execution code sur formulaire

12 réponses
Avatar
cocochanel
Bonjour à tous,

Je souhaite récupérer la valeur d'un contrôle dans un formulaire au
chargement de celui-ci.
Pour cela je fais un script en vb sur le form load qui atteint le contrôle
puis récupère sa valeur.
Là j'ai un message d'erreur car la récupération de la valeur du contrôle se
faisant sur le chargement de la feuille, il se fait avant même que la valeur
se soit affichée dans le contrôle.

Pour contourner ça, j'ai utilisé la fonction timer, ce qui fait qu'il ne va
récupérer la valeur du contrôle qu'une seconde après le chargement du
formulaire; c'est-à-dire après que la valeur se soit affichée dans ce
contrôle.

Pourtant cette solution ne me satisfait pas du tout. Elle est approximative
et fait perdre un temps précieux à l'utilisateur.

Ma question est donc la suivante : y'a t-il possibilité de récupérer la
valeur contenue dans un contrôle au chargement du formulaire sans passer par
le timer ?

Par avance, merci.

10 réponses

1 2
Avatar
Gilles MOUGNOZ
Bonjour à tous,
Je souhaite récupérer la valeur d'un contrôle dans un formulaire au
chargement de celui-ci.
Pour cela je fais un script en vb sur le form load qui atteint le contrôle
puis récupère sa valeur.
Là j'ai un message d'erreur car la récupération de la valeur du contrôle
se
faisant sur le chargement de la feuille, il se fait avant même que la
valeur
se soit affichée dans le contrôle.
Pour contourner ça, j'ai utilisé la fonction timer, ce qui fait qu'il ne
va
récupérer la valeur du contrôle qu'une seconde après le chargement du
formulaire; c'est-à-dire après que la valeur se soit affichée dans ce
contrôle.
Pourtant cette solution ne me satisfait pas du tout. Elle est
approximative
et fait perdre un temps précieux à l'utilisateur.
Ma question est donc la suivante : y'a t-il possibilité de récupérer la
valeur contenue dans un contrôle au chargement du formulaire sans passer
par
le timer ?
Par avance, merci.


Bonjour, Mademoiselle Coco (!)

Si on consulte l'aide sur les événements, on trouve ceci:
(Extrait)
"Lorsque vous ouvrez un formulaire pour la première fois, les événements
suivants se produisent dans cet ordre :
Open ? Load ? Resize ? Activate ? Current
Lorsque vous fermez un formulaire, les événements suivants se produisent
dans cet ordre :
Unload ? Deactivate ? Close"
Je te suggère donc d'utiliser plutôt les événements Activate ou Current,
quitte à mettre en place un booléen pour ne réaliser tes actions qu'une
seule fois, ces événements étant reproduits à chaque activation (passage sur
un autre form et retour pour Activate) ou à chaque changement
d'enregistrement ou actualisation de la source (pour Current).
Une autre solution consisterait à recupérer la valeur du champ directement
dans la source du form:

Dim TaSource As Recordset
Set TaSource = Me.RecordsetClone
If TaSource.RecourdCount <> 0 Then ' attention: si aucun enregistrement,
MoveFirst plante
TaSource.MoveFirst
TaValeur = TaSource.Fields("TonChamp")
Else
TaValeur = "" ' ou 0 si c'est un numérique
End If
Set TaSource = Nothing

Mais peut-être que le RecordsetClone n'est pas complèteemnt initialisé non
plus au moment du Load...

Bonne continuation

Avatar
cocochanel
Re,

J'ai déjà essayé avec current et activate, mais ça ne fait jamais rien.
Il y a peut-être un secret que j'ignore, mais il me semble que ces
procédures ne sont pas appelées à l'ouverture.

Pour la deuxième solution, c'est quand même pas mal l'usine à gaz !
Avatar
Gilles MOUGNOZ
Re,
J'ai déjà essayé avec current et activate, mais ça ne fait jamais rien.
Il y a peut-être un secret que j'ignore, mais il me semble que ces
procédures ne sont pas appelées à l'ouverture.
Pour la deuxième solution, c'est quand même pas mal l'usine à gaz !


Re,

Désolé pour l'usine à gaz, en te lisant, j'avais cru que tu parlais le VBA
couramment ! :-(
Ceci dit, si les événement sus-dits ne se déclenchent pas, cela ne serait-il
pas dû au fait qu'il s'agit d'un sous-formulaire ?
Dans ce cas, saches que les événements du sous-formulaire se produisent
avant ceux du formulaire principal.
Ainsi, si le sous-formulaire et le formulaire principal sont liés, les
données du principal ne seront chargées qu'après le chargement du sous-form,
ce qui expliquerait tes aléas dans ce monde de brutes...
Peut-être vaudrait-il alors mieux placer ton code dans le load du form
principal.

Bonne continuation

Avatar
Bareuzai
Bonjour à tous,

Je souhaite récupérer la valeur d'un contrôle dans un formulaire au
chargement de celui-ci.
Pour cela je fais un script en vb sur le form load qui atteint le contrôle
puis récupère sa valeur.
Là j'ai un message d'erreur car la récupération de la valeur du contrôle se
faisant sur le chargement de la feuille, il se fait avant même que la valeur
se soit affichée dans le contrôle.



Bonjour Cocochanel,

Perso j'aurais plutôt tendance à mettre cela sur le Form_Current ('sur
activation'), en ayant bien conscience que ça va changer chaque fois que
tu passes sur un autre enregistrement (c'est d'ailleurs fait pour ça...)

Une autre solution c'est de faire une gestion d'erreur : tu récupères
ton N° d'erreur, tu testes si cela correspond bien au cas où tu es en
train de charger. Si c'est le cas un 'resume next' permettra de
continuer le code sans envoyer de message.

A+
Bareuzai

Avatar
cocochanel
Pourtant je vous assure que current ne fait rien du tout !
Et je n'ai pas de sous-formulaire !


Je vous mets le code au cas où...

<< Private Sub Form_Current()
Dim stDocName, ok As String
DoCmd.GoToControl "Texte15"
ok = Texte15.Text
DoCmd.GoToControl "N°facture"
If ok = "0" Then
If bouton <> 1 Then
stDocName = "M-fermer F-parrainage"
DoCmd.RunMacro stDocName
MsgBox ("Ce numéro n'est pas valide !")
bouton = 0
End If
End If
End Sub >>
Avatar
Raymond [mvp]
Bonjour.

change ok = Texte15.Text par ok = Texte15.Value ou
ok = Texte15

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://www.mpfa.info/ pour débuter sur le forum.
l'abonnement TechNet !
http://www.microsoft.com/france/technet/presentation/cd/default.mspx


"cocochanel" a écrit dans le message
de news:
Pourtant je vous assure que current ne fait rien du tout !
Et je n'ai pas de sous-formulaire !


Je vous mets le code au cas où...

<< Private Sub Form_Current()
Dim stDocName, ok As String
DoCmd.GoToControl "Texte15"
ok = Texte15.Text
DoCmd.GoToControl "N°facture"
If ok = "0" Then
If bouton <> 1 Then
stDocName = "M-fermer F-parrainage"
DoCmd.RunMacro stDocName
MsgBox ("Ce numéro n'est pas valide !")
bouton = 0
End If
End If
End Sub >>


Avatar
cocochanel
c'est fait mais ça ne change rien.

Surtout je ne comprends pas pourquoi le current ne fonctionne pas...
mystère et boule de gomme.
Visiblement ça n'arrive qu'à moi !


Bonjour.

change ok = Texte15.Text par ok = Texte15.Value ou
ok = Texte15

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://www.mpfa.info/ pour débuter sur le forum.
l'abonnement TechNet !
http://www.microsoft.com/france/technet/presentation/cd/default.mspx


"cocochanel" a écrit dans le message
de news:
Pourtant je vous assure que current ne fait rien du tout !
Et je n'ai pas de sous-formulaire !


Je vous mets le code au cas où...

<< Private Sub Form_Current()
Dim stDocName, ok As String
DoCmd.GoToControl "Texte15"
ok = Texte15.Text
DoCmd.GoToControl "N°facture"
If ok = "0" Then
If bouton <> 1 Then
stDocName = "M-fermer F-parrainage"
DoCmd.RunMacro stDocName
MsgBox ("Ce numéro n'est pas valide !")
bouton = 0
End If
End If
End Sub >>







Avatar
Raymond [mvp]
il te reste à placer un point d'arrêt sur chaque ligne de code et regarder
par où tu passes en contrôlant les valeurs de chaque donnée.

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://www.mpfa.info/ pour débuter sur le forum.
l'abonnement TechNet !
http://www.microsoft.com/france/technet/presentation/cd/default.mspx


"cocochanel" a écrit dans le message
de news:
c'est fait mais ça ne change rien.

Surtout je ne comprends pas pourquoi le current ne fonctionne pas...
mystère et boule de gomme.
Visiblement ça n'arrive qu'à moi !



Avatar
cocochanel
OK.
Bizarre, j'utilise toujours les points d'arrêt en delphi, et j'ai pas eu le
réflexe en vb.
'vais pas bien moi...

Donc en mettant un point d'arrêt, je constate effectivement que "la fonction
atteindre le contrôle n'est pas encore disponible".
Je ne sais pas pourquoi il me met pas un message d'erreur pendant
l'exécution mais bon...

En tout cas je me retrouve au point de départ : même avec activate, le
contrôle ne peut être atteint parce que pas encore chargé. Du coup, je crois
que la seule solution qu'il me reste est de travailler sur le code de Gilles
(après tout c'est peut être pas si "usine à gaz" ;-))

Si quelqu'un a cependant une solution plus simple, c'est la bienvenue !


il te reste à placer un point d'arrêt sur chaque ligne de code et regarder
par où tu passes en contrôlant les valeurs de chaque donnée.

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://www.mpfa.info/ pour débuter sur le forum.
l'abonnement TechNet !
http://www.microsoft.com/france/technet/presentation/cd/default.mspx


"cocochanel" a écrit dans le message
de news:
c'est fait mais ça ne change rien.

Surtout je ne comprends pas pourquoi le current ne fonctionne pas...
mystère et boule de gomme.
Visiblement ça n'arrive qu'à moi !








Avatar
Raymond [mvp]
normalement, lors de l'événement OnLoad du formulaire, tous les contrôles
sont affichés avec leur valeur.

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://www.mpfa.info/ pour débuter sur le forum.
l'abonnement TechNet !
http://www.microsoft.com/france/technet/presentation/cd/default.mspx


"cocochanel" a écrit dans le message
de news:
| OK.
| Bizarre, j'utilise toujours les points d'arrêt en delphi, et j'ai pas eu
le
| réflexe en vb.
| 'vais pas bien moi...
|
| Donc en mettant un point d'arrêt, je constate effectivement que "la
fonction
| atteindre le contrôle n'est pas encore disponible".
| Je ne sais pas pourquoi il me met pas un message d'erreur pendant
| l'exécution mais bon...
|
| En tout cas je me retrouve au point de départ : même avec activate, le
| contrôle ne peut être atteint parce que pas encore chargé. Du coup, je
crois
| que la seule solution qu'il me reste est de travailler sur le code de
Gilles
| (après tout c'est peut être pas si "usine à gaz" ;-))
|
| Si quelqu'un a cependant une solution plus simple, c'est la bienvenue !
|
1 2