IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Problème complexe (VBA) [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Par défaut Problème complexe (VBA)
    Bonjour!

    Je suis présentement en train de développer une base de donnée pour la gestion d'un centre de conditionnement physique basée sur Access. J'aurais besoin de votre aide pour ce qui suit :

    Dans l'interface principal (formulaire client), j'ai un onglet. Cet onglet contient 5 pages : "Informations personnelles", "Gestionnaire d'entraînement", "Outils divers", "Rapports disponibles" et "Comptes clients". La page "Gestionnaire d'entraînement" comporte un sous-formulaire. Il s'agit en fait d'une liste (formulaire continu) des programmes d'entraînements créés pour le client. Un programme d'entraînement a une certaine durée de vie... Ainsi, au bout d'un certain temps, il devient périmé, on doit alors en créer un nouveau pour le client. L'intérêt d'afficher tous les programmes d'entraînements actifs et périmés est qu'il est possible de consulter ceux-ci à n'importe quel moment.

    Or, il est préférable de toujours afficher (sélectionner) le programme d'entraînement actif (ou le dernier actif). Ainsi, j'ai programmé quelques lignes de codes qui permettent de trouver le dernier programme d'entraînement actif pour le client, de sélectionner (focus) le sous-formulaire et d'atteindre l'enregistrement. Ce code s'exécute chaque fois que l'utilisateur change de fiche-client (passe d'un client à un autre dans le formulaire principal). Le code fonctionne très bien, même s'il m'apparaît plutôt lourd.

    Pour vous mettre en contexte, l'utilisateur peut se trouver dans n'importe quelle page de l'onglet alors qu'il lance l'évènement. Ainsi, s'il se trouve dans l'onglet "Gestionnaire d'entraînement", tout se passe bien. Mais, s'il se trouve dans un autre onglet, l'onglet "Informations personnelles" par exemple, un problème survient. D'un point de vue technique, tout va bien. Mais, l'exécution du code à cet occasion crée une indésirable apparition du sous-formulaire (liste des programmes d'entraînements) en plein milieu de la page "Informations personnelles", où il ne devrait pas être visible. Ainsi, l'aspect esthétique en prend un coup.

    ------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Cela s'explique par le fait que, pour atteindre l'enregistrement recherché (programme d'entraînement actif, ou le dernier), je dois d'abord exécuter les lignes de code suivantes : 
     
    Dim VarRefProgramme As Integer
    Dim VarRefClients As Integer
    VarRefClients = Me.Ref_Clients.Value
     
    DoCmd.SetWarnings False
     
    DoCmd.RunSQL "DELETE * FROM T_Programmes_Temporary" (vide une table temporaire servant à trouver l'enregistrement en question)
    DoCmd.RunSQL "INSERT INTO T_Programmes_Temporary SELECT T_Programmes.* FROM T_Programmes WHERE T_Programmes.Ref_Programme <> 0 And T_Programmes.Actif like '-1' And T_Programmes.Ref_Clients like '" & VarRefClients & "';"     (Sélectionne le dernier programme d'entraînement actif et l'envoie dans la table temporaire "T_Programmes_Temporary" pour indentification)
     
    Dim VarDcount As Integer
    VarDcount = DCount("[Ref_Programme]", "T_Programmes_Temporary")   (Vérifi s'il y a un programme d'entraînement actif)
    SQEL - "SELECT T_Programmes_Temporary.* FROM T_Programmes_Temporary;"
    Set Bds = CurrentDb
    Set rdst = Bds.OpenRecordset(SQEL)
    rdst.MoveFirst
    VarRefProgramme = rdst.fields("Ref_Programme").Value    (stock le numéro du programme d'entraînement dans la variable "VarRefProgramme")
    rdst.close
    Set Bds = Nothing
    ------------------------

    'Ce qui suit pose problème, puisqu'il y a focus du sous-formulaire et donc perturbation de l'interface du formulaire principal si l'onglet est dans une page autre que dans laquelle le sous-formulaire en question se trouve.

    Forms!MainForm!SubForm.SetFocus
    Forms!MainForm!SubForm!Ref_Programme.SetFocus (champ où je recherche une expression)
    DoCmd.FindRecord VarRefAbonnement, ,True, , True (atteindre l'enregistrement stocké dans "VarRefAbonnement")

    Quelqu'un pourrait-il me donner une solution ou une piste de solution svp? Il y a des jours que je recherche sur ce sujet et je ne trouve rien.

    Pistes de solutions proposées de mon cru (mais j'ignore si c'est possible) :
    1. Atteindre l'enregistrement du sous-formulaire sans passer par un SetFocus.
    2. Geler l'affichage à l'écran jusqu'à ce que tout soit fin prêt à afficher.

    Merci de votre attention!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour et bienvenue
    Je n'ai pas tout bien saisi, mais pour le gel de l'affichage il y a cela.
    http://access.developpez.com/faq/?page=IHM#DesRafrEcr

  3. #3
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    une alternative à DoCmd.FindRecord consiste à utiliser les signets du jeu d'enregistrement du sous-formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Dim rs As DAO.Recordset
    ' Référence le clone du recordset du sous-formulaire
    Set rs = Me.SubForm.Form.RecordsetClone
     
    ' Si le jeu d'enregistrements n'est pas vide
    ' et si on a une valeur à chercher
    If rs.RecordCount>0 And VarRefAbonnement>0 then
       ' Chercher le premier enregistrement correspondant au critère
       ' Ref_Programme = valeur_recherchée
       rs.FindFirst "(Ref_Programme)=" & VarRefAbonnement
       ' Si la recherche n'a pas échoué
       If Not rs.NoMatch Then
          ' se positionner sur l'enregistrement trouvé en fournissant
          ' la valeur de son signet (unique pour chaque enregistrement)
          Me.SubForm.Form.Recordset.Bookmark = rs.Bookmark
       End If
    End if
    Set rs = Nothing
    Ainsi, pas besoin de donner le focus au sous-formulaire.

    Sinon, avec ta méthode actuelle, peut-être que tu pourrai donner le focus à la page contenant le sous-formulaire, avant de donner le focus au sous-formulaire.

    A+

  4. #4
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Par défaut Merci!
    Merci! C'est exactement ce qu'il me fallait!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème EXCEL VBA
    Par olivierm34 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/03/2007, 23h52
  2. Problème complexe
    Par Flobynaldo dans le forum Langage
    Réponses: 5
    Dernier message: 26/06/2006, 15h37
  3. Problème valeurs[VBA]
    Par Yanmeunier dans le forum Access
    Réponses: 1
    Dernier message: 18/05/2006, 15h17
  4. Problème de VBA de passage de 2000 à 2002
    Par Oberown dans le forum Access
    Réponses: 9
    Dernier message: 10/05/2006, 14h51
  5. problème avec VBA
    Par Delph dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2002, 13h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo