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 :

Variables publiques dans un module


Sujet :

VBA Access

  1. #1
    Membre émérite Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Par défaut Variables publiques dans un module
    Bonjour,

    me revoilà

    Je vais avoir besoin de gérer des sessions (du genre apache), mais sous Access.

    Le souci, c'est que je bloque directement lors de la déclaration.

    J'ai mis dans un module "session", le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Compare Database
    Option Explicit
     
    ' ici on définit les variables de 'session'
    Public les_destinataires As String 'les destinataires
    Public le_mail_perso As String 'le corps du mail à envoyer
     
    Public la_requete As String 'on va la remplir plus tard..
     
     
    'test
    les_destinataires = "lui@toi.invalid"
    J'ai de suite une erreur "instruction incorrecte à l'extérieur d'une procédure"

    sur la ligne "les_destinataires". En cas de msgbox sur cette ligne, idem.

    Merci si vous pouvez me dépatouiller !

    A+

  2. #2
    Membre émérite Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Par défaut
    Pour info,

    le module global à l'air de "fonctionner", enfin d'être porté aux foms, car j'ai ce message à chaque ouverture de formulaire...

    Merci

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Tu dois mettre ton affectation dans une routine (sub) pour initialiser ta variable, ensuite tu appelles cette routine quand tu veux.

    Il n'y a que les déclarations qui peuvent être mises directement dans un module.

    Philippe

  4. #4
    Membre émérite Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Par défaut
    Bonjour et Merci,

    je souhaite avoir une variable tout le long de l'ouverture de la base.

    Peux-tu m'en dire plus sur ce que je dois mettre dans le module stp ?

    Merci.

    A+

  5. #5
    Invité
    Invité(e)
    Par défaut
    Re

    Dans ton module il te faut une routine du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub InitVariable()
        les_destinataires = "lui@toi.invalid"
    End Sub
    Ensuite tu peux appeler par exemple celle-ci au démarrage de ton premier formulaire :

    Voilà un exemple.

    Philippe

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Dans ton cas il s'agirait plutôt d'une constante!
    A moins que la valeur soit susceptible d'évoluer en cours de programme!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public const les_destinataires = "lui@toi.invalid"
    Si non mais je suis moins féru dans ce genre de sujet mais l'autoexec d'Access devrait permettre l'initiation!
    Dernière modification par Invité ; 06/09/2016 à 08h16.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Re

    Salut rdurupt

    Je dirais même que ce genre d'infos (Email) devrait être stockée dans une table car c'est une information qui peut-être modifiable dans le temps.

    Philippe

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour Philippe,
    Je te plussois!

    Effectivement une table suffit, bien sur il est utile de pouvoir la modifier par un formulaire mais il n'y a pas d'urgence à gérer la partie administration!

    par exemple, mois je définis une table four-tous, ou je stock mais données!

    à partir d'une fonction je récupère la valeur, si la valeur recherché n'existe pas je la rajoute avec sa valeur par défaut!

    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
    Sub test()
    les_destinataires = GetDefault("les_destinataires", "lui@toi.invalid")
    End Sub
    Public Function GetDefault(fld, Def)
    Dim Sql As String
    Dim Rs
    Sql = "SELECT * FROM TableDefaults WHERE defName = '" & safeEntry( fld) & "'"
    Set Rs = con.OpenRecordSet(Sql)
        If Not Rs.EOF Then
               GetDefault = Trim(Rs("defValue"))
        Else
     
            con.Execute "INSERT INTO TableDefaults(defName,defValue) VALUES('" & safeEntry( fld) & "','" &  safeEntry(Def)& "')"
            GetDefault = Def
        End If
        Set Rs = con.CloseRecordSet(Rs)
    End Function
    Public Function safeEntry(Txt) As String
    safeEntry = Txt
    safeEntry = Replace(safeEntry, "'", "''")
    safeEntry = Replace(safeEntry, Chr(34), Chr(34) & Chr(34))
    End Function
    Dernière modification par Invité ; 06/09/2016 à 09h49.

  9. #9
    Membre émérite Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Par défaut
    Bonjour et merci à vous,

    pour info, oui la variable va évoluer, d'où variable...

    J'ai mis dans un module nommé "sessions", le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Compare Database
    Option Explicit
     
    ' ici on définit les variables de 'session'
    Dim le_corps_mail As String
    Dim les_destinataires As String
     
     
    Public Sub InitVariables()
        les_destinataires = "lui@toi.invalid"
    End Sub
    Dans l'évènement load() d'un formulaire, j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_Load()
    'on va récupérer les variables de 'sessions' via le module 'session'
    Call InitVariables
     
    MsgBox les_destinataires
     
    End Sub
    Mon msgbox me renvoie une chaîne vide...

    Une idée ?

    Merci encore.

    A+

  10. #10
    Membre émérite Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Par défaut
    Bon, après tests, j'ai "trouvé".

    Au lieu des "dim", j'ai mis "public"

    Voici le code du module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Option Compare Database
    Option Explicit
     
    ' ici on définit les variables de 'session'
    Public le_corps_mail As String
    Public les_destinataires As String
    Les formulaires, d'après les 1ers tests effectués, récupèrent bien les variables définies par "public" au lieu de "dim".

    A+

  11. #11
    Membre émérite Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Par défaut
    Bon, je me doutais bien que j'allais revenir ici !

    Donc, j'ai mon module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Option Compare Database
    Option Explicit
     
    ' ici on définit les variables de 'session'
    Public le_corps_mail As String
    Public les_destinataires As String
     
    Public Sub InitVariables()
        les_destinataires = "lui@toi.invalid"
    End Sub
    Quand j'ouvre mon formulaire, voici ce que j'ai mis pour débugger l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Form_Load()
    'on va récupérer les variables de 'sessions' via le module 'session'
    Call InitVariables
     
    MsgBox "voici la variable en début de session : " & vbCrLf & vbCrLf & les_destinataires, , "Paroles de Poètes"
    end sub
    Cela fonctionne !

    Mais voici le hic ! Je souhaite modifier (ajouter) ma variable, au moment d'un clic sur un bouton du form ; voici le code, rien de + simple, je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If Cocher30 = True Then 'on rajoute le mail à la variable de session
    les_destinataires = les_destinataires & ";" & Me.E_mail
     
    MsgBox "voici la variable en cours de session : " & vbCrLf & vbCrLf & les_destinataires, , "Paroles de Poètes"
     
    End If
    Le msgbox me montre bien la variable incrémentée du mail...

    Tout va bien, mais non...

    Quand je ferme mon formulaire et que je le réouvre (sans être sorti d'Access), la variable "récupère" sa première valeur, déclarée dans le module, soit "lui@toi.invalid"

    Donc j'ai un souci de conservation de la valeur.

    Je ne vois franchement pas où.

    Merci à qui peut m'aider.

    A+

  12. #12
    Membre émérite Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Par défaut
    S'il faut passer par une table, je le ferai, mais j'aurai l'impression de réinventer la "roue"...

    Aussi, donc vous aurez compris que je crée une variable avec un mail à l'ouverture de mon appli, et qu'en cas de case cocher à vrai (case cochée true), j'incrémente le mail. Cela fonctionne, mais jusqu'à la fermeture du formulaire, alors que je souhaiterais que la variable garde sa nouvelle valeur jusqu'à la fermeture Access...


    Pour incrémenter la variable, voici ce que je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If Cocher30 = True Then 'on rajoute le mail à la variable de session
    les_destinataires = les_destinataires & ";" & Me.E_mail
     
    MsgBox "voici la variable en cours de session : " & vbCrLf & vbCrLf & les_destinataires, , "Paroles de Poètes" 'test
     
    End If
    Par la suite, j'aimerai aussi, si je décoches la case 'cocher30', enlever de la variable me.e-mail. Là je crois que je complique le truc !

    Merci

  13. #13
    Membre émérite Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Par défaut
    Bon, je pense savoir où se situe le pb.

    A chaque fois que j'appelle la sub dans le formulaire, celui-ci reprend la valeur par défaut que j'ai définie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub InitVariables()
        les_destinataires = "lui@toi.invalid"
    End Sub
    Donc, tant que le form reste ouvert, la valeur les_destinataires s'incrémente. Mais au moment où je remets ce code, elle retourne à la valeur définie dans la sub...

    Comment garder la valeur, that is my question !

    Merci

  14. #14
    Invité
    Invité(e)
    Par défaut
    Re

    Ce qui se passe est un comportement normal, et cela ne vient pas d'Access, c'est le cas dans tout logiciel de programmation.

    Si tu veux conserver la modification de la variable, il faut la stocker quelque part (table, fichier texte, etc...) et la rappeler quand tu as besoin.

    C'est ce que l'on te disait dans les précédents messages de cette discussion.


    Philippe

  15. #15
    Membre émérite Avatar de HDU71000
    Homme Profil pro
    Développement Access - En recherche de poste télétravail (invalide)
    Inscrit en
    Août 2016
    Messages
    716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement Access - En recherche de poste télétravail (invalide)

    Informations forums :
    Inscription : Août 2016
    Messages : 716
    Par défaut
    Merci de ta réponse,

    mais entre temps, je viens juste de solutionner mon souci (le premier, il me restera la fonction pour enlever un élément de la variable au cas où je décoche) :

    Le module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Compare Database
    Option Explicit
     
    ' ici on définit les variables de 'session', j'ai donc changé en 'global'
    Global le_corps_mail As String
    Global les_destinataires As String
     
    Public Sub InitVariables()
     
      les_destinataires = les_destinataires
     
    End Sub
    Dans mon form, at load ()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'on va récupérer les variables de 'sessions' via le module 'session'
    Call InitVariables
     
     
    MsgBox "voici la variable destinataires de session : " & vbCrLf & vbCrLf & les_destinataires, , "Paroles de Poètes"
    La msgbox est vide, normal

    Dans mon form, sur clic d'une case :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Call InitVariables
    If Cocher30 = True Then 'on rajoute le mail à la variable de session
    If les_destinataires = "" Then 'au début, pour empêcher d'avoir un ; au début de la variable...
        les_destinataires = "moi@moi.fr"
    End If
    les_destinataires = les_destinataires & ";" & Me.E_mail 'on rajoute à la variable globale
     
    MsgBox "voici la variable de session Rolanderies : " & vbCrLf & vbCrLf & les_destinataires, , "Paroles de Poètes"
     
    End If
    Cela fonctionne super.

    Donc mon souci venait des "global" au lieu des "public"..

    A+

Discussions similaires

  1. Variables différentes dans plusieurs modules VBA
    Par soeursourire dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/11/2008, 13h45
  2. Réponses: 6
    Dernier message: 05/03/2008, 15h52
  3. Utilisation d'une variable publique dans une DLL
    Par Delphi-ne dans le forum Delphi
    Réponses: 13
    Dernier message: 05/12/2006, 13h19
  4. Variable publique dans main ?
    Par Magicien d'Oz dans le forum Langage
    Réponses: 13
    Dernier message: 13/07/2006, 11h40
  5. Variable Globale dans un module de formulaire.
    Par wisiwi dans le forum Access
    Réponses: 5
    Dernier message: 30/03/2006, 14h03

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