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 :

Garder une variable entre 2 procédures


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    team manager
    Inscrit en
    Juin 2015
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : team manager
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2015
    Messages : 191
    Points : 67
    Points
    67
    Par défaut Garder une variable entre 2 procédures
    Bonjour à tous

    Sur un form_open je crée et je remplis des variables, je le contrôle avec un debug.print et tout va bien.

    Sur l'évènement suivant par exemple dans l'entrée d'un champ les variables sont à zero...

    Donc est-ce que c'est normal que les variables disparaissent quand on sort du sub et comment contourner ce problème ?

    Merci de votre aide

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 116
    Points : 1 639
    Points
    1 639
    Par défaut
    Oui, les variables déclarées dans une fonction ou procédure sont automatiquement détruites lorsque la fonction se termine.

    Cependant, les fonctions peuvent retourner une variable.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    '// Fonction Add
    '// Prend 2 argument de type entier en entrée
    '// Retourne un entier
    Public Function Add(ByVal LeftOperand As Integer, ByVal RightOperand As Integer) As Integer
        Dim Result As Integer
        Result = Left Operand + RightOperand    '// Additionne les 2 arguments, enregistre le résultat dans Result
        Add = Result    '// Retourne la valeur enregistrée dans result
    End Function
     
    '// Appel
    Dim somme As Integer
    Somme = Add(3, 7)    '// Somme contient 10
    Et si tu as besoins de plus, tu peux utiliser des arguments d'entre/sortie, avec le mot clef ByRef.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    '// Procedure Add
    '// Prend 2 argument de type entier en entrée, et un argument de type entier en sortie
    Public Sub Add(ByVal LeftOperand As Integer, ByVal RightOperand As Integer, ByRef Result As Integer)
        Dim Result As Integer
        Result = Left Operand + RightOperand    '// Additionne les 2 arguments, enregistre le résultat dans Result
    End Sub
     
    '// Appel
    Dim somme As Integer
    Add 3, 7, Somme    '// Somme contient 10

  3. #3
    Membre du Club
    Homme Profil pro
    team manager
    Inscrit en
    Juin 2015
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : team manager
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2015
    Messages : 191
    Points : 67
    Points
    67
    Par défaut
    OK, merci beaucoup, mais je ne comprends pas comment adapter ca à mon besoin parce que je récupère des valeurs dans des requetes....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DoCmd.OpenQuery "rqcircdist", , acReadOnly
        DoCmd.OpenQuery "rqtiremaxdist", , acReadOnly
        ckm = DLookup("cctlap", "rqcircdist")
        dkm = DLookup("dkm", "rqtiremaxdist")
        DoCmd.Close acQuery, "rqcircdist", acSaveNo
        DoCmd.Close acQuery, "rqtiremaxdist", acSaveNo
    Je n'ai pas de calcul à faire sur les variables (avant plus tard) et je m'en sers dans plusieurs procédures par la suite....

    Peut être avec une table temporaire ?

    Qu'en pensez-vous ?

    Merci de l'aide

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Bonjour,

    Je ne comprend pas ce que tu veux faire avec cette suite d'instruction. Cela fait peut-être parti d'un tout ?

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  5. #5
    Membre du Club
    Homme Profil pro
    team manager
    Inscrit en
    Juin 2015
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : team manager
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2015
    Messages : 191
    Points : 67
    Points
    67
    Par défaut
    Je récupère mes 2 variables ckm et dkm dans un sub et j'ai besoin de les utiliser plus tard dans d'autres sub(s)

    Donc je cherche une méthode pour les garder d'un sub à l'autre.

    Merci

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 116
    Points : 1 639
    Points
    1 639
    Par défaut
    Bon ...

    Avant de coder, il faut suivre des cours !!!
    https://heureuxoli.developpez.com/office/word/vba-all/

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    En effet il y a des tutos pour expliquer cette partie de VBA.

    Je réitère ma question : Qu'est-ce que ces 4 instructions viennent faire dans la question ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DoCmd.OpenQuery "rqcircdist", , acReadOnly
        DoCmd.OpenQuery "rqtiremaxdist", , acReadOnly
    ....
        DoCmd.Close acQuery, "rqcircdist", acSaveNo
        DoCmd.Close acQuery, "rqtiremaxdist", acSaveNo
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  8. #8
    Membre du Club
    Homme Profil pro
    team manager
    Inscrit en
    Juin 2015
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : team manager
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2015
    Messages : 191
    Points : 67
    Points
    67
    Par défaut
    J'ouvre les requetes qui me servent a générer les infos des variables et je récupère les variables dans ckm et dkm

  9. #9
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonjour,
    J'ouvre les requetes qui me servent a générer les infos des variables et je récupère les variables dans ckm et dkm
    d'où la question de loufab ... il est inutile de les ouvrir, puisque les fonctions comme DLookup() y ont accès directement.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  10. #10
    Membre du Club
    Homme Profil pro
    team manager
    Inscrit en
    Juin 2015
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : team manager
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2015
    Messages : 191
    Points : 67
    Points
    67
    Par défaut
    Ok, je ne savais pas que dlookup allait chercher même dans les objets non ouverts....

    Je suis parti sur ma création de table temporaire, j'arrive à mettre le contenu des 2 variables que je veux dans 2 champs et maintenant je me bagarre pour récupérer ces valeurs dans mon sub ....

    J'ai essayé comme ça mais ça ne marche pas encore....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     me.tkm= [table].[tvariable].[Tmax]
    Et ça ne me trouve pas la valeur mais comme j'ai encore 4 heures de train devant moi je suis confiant

    Merci de votre aide

  11. #11
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 870
    Points : 3 449
    Points
    3 449
    Par défaut
    Bonjour jchuillier2,

    Je crois que vous vous compliquez la vie. Dans le post# 6 deedolith vous donnait un lien vers une formation VBA. Dans cette formation on explique clairement la portée des variables. Dans votre cas si vous désirez que la variable soit accessible tant que votre formulaire est ouvert vous devez la déclaré en en tête de module (Formulaire). Voici un exemple:
    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
    21
    22
    23
    Option Compare Database
    Option Explicit
     
    Dim sToutLeFormulaire As String     'Sera accessible tant que le formulaire est ouvert
     
    Private Sub Form_Load()
     
        Dim sSeulementIci As String     'Sera accessible seulement dans la sub Form_Load
     
        sSeulementIci = "QuelqueChose"
        sToutLeFormulaire = "Autrechose"
     
        Debug.Print sSeulementIci
        Debug.Print sToutLeFormulaire
     
    End Sub
     
    Private Sub btnMaJ_Couleur_Click()
     
        Debug.Print sSeulementIci       'Va déclencher une erreur parce qu'elle n'existe plus
        Debug.Print sToutLeFormulaire   'Va fonctionner
     
    End Sub
    Vous pourrez ainsi faire autre chose durant vos 4 heures de train.

    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  12. #12
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Tu as tout pour le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ckm = DLookup("cctlap", "rqcircdist")
    +
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    me.tkm= [table].[tvariable].[Tmax]
    devient simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    me.tkm = DLookup("cctlap", "rqcircdist")
    Je pense que tu devrais lire un bouquin sur la programmation en général et un autre sur VBA. Pas forcément des pavés mais juste de quoi avoir les bases.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  13. #13
    Membre du Club
    Homme Profil pro
    team manager
    Inscrit en
    Juin 2015
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : team manager
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2015
    Messages : 191
    Points : 67
    Points
    67
    Par défaut
    C'est sur que je m'avance en tâtonnant mais je veux faire une bdd/app qui fonctionne dans mon vrai métier (les courses de voitures) et franchement entre les différents programmes de télémétrie et le coaching pilote ca ne laisse pas beaucoup de temps pour le reste....

    D'autre part je ne pense pas créer d'autre bdd ensuite mais juste faire évoluer celle la pour qu'elle corresponde à mes besoins.

    La bonne nouvelle c'est que j'ai maintenant 2 options, soit déclarer les variables en début de form (mais est-ce que mes variables ne vont pas être perdues si j'arrive dans un sous-form ce qui est le cas ?) ou alors travailler avec les tables.

    Me.tkm est la distance totale parcourue par un train de pneus, donc je veux qu'a chaque nouveau tour quand j'arrive dans le controle tkm du sous form sfrmstint il ajoute la distance d'un tour de circuit soit cctlap.

    Je stocke dans ma table tvariable tmax qui est la valeur maximale de tkm dans le form en cours (si je reprend un train de pneus pas neuf je ne veux pas repartir de zéro) et cctlap qui est la longueur d'un tour de circuit (par exemple le castellet 5,822 km)

    Comme jusqu'a maintenant tout les autres ingés de course le font avec excel on a juste un truc du genre B12=B11+$A$3 ou B12 est la distance au tour 12, B11 au tour 11 et A3 la longueur du tour, mais j'ai déja compris qu'avec access ca n'est pas aussi facile que ca

    Mais comme je suis têtu et que j'aime bien faire les choses comme il faut je veux utiliser access au lieu d'excel et des feuilles avec des milliers de cellules et de la bricole permanente.

    Donc mon idée c'est au début de l'utilisation d'un train de pneu (tkm=0) on fasse tkm=cctlap et qu'a chaque fois qu'on rentre dans tkm on fasse tkm=tmax+cctlap puisqu'on m'a déja expliqué que tkm=tkm+cctlap ne marchera pas.

    Grace a vos conseils j'ai tenté un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Debug.Print "variables"; DLookup("cctlap", "tvariable"); DLookup("tmax", "tvariable")
        Me.TKm = DLookup("cctlap", "tvariable") + DLookup("tmax", "tvariable")
        Debug.Print "tkm apres calcul"; Me.TKm
    Et ca fonctionne nickel, donc je continue la dedans et je vous remercie de l'aide

  14. #14
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    En effet c'est un projet sympathique et ce sera toujours moins "la bricole" qu'avec Excel.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

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

Discussions similaires

  1. [Python 3.X] Tkinter : garder une variable entre plusieurs fenetres
    Par Invité dans le forum Général Python
    Réponses: 5
    Dernier message: 27/04/2017, 15h43
  2. Sauvegarder une variable entre deux procédures
    Par Patouillou dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 04/01/2016, 07h47
  3. [Makefile] Garder une variable en mémoire entre 2 make
    Par Gui13 dans le forum Systèmes de compilation
    Réponses: 1
    Dernier message: 12/01/2009, 14h30
  4. Passer une variable entre deux fenêtres
    Par DeezerD dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/08/2005, 09h52
  5. Partage d'une variable entre les processus fils
    Par Mehdi Feki dans le forum Linux
    Réponses: 7
    Dernier message: 09/01/2005, 13h34

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