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

Macros et VBA Excel Discussion :

[VBA Excel] Conserver une donnée d'une macro à une autre


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 43
    Points : 20
    Points
    20
    Par défaut [VBA Excel] Conserver une donnée d'une macro à une autre
    Bonjour à tous,

    J'ai besoin de votre science éclairée chers forumeurs.
    Je souhaite conserver une donnée (type string) que je génère d'une macro type Private Sub (elle est ds "thisWorkBook") pour l'utiliser dans une macro plus simple (Module).

    Savez-vous comment conserver ma donnée ?
    Je ne souhaite pas utiliser la solution de créer une nouvelle feuille (même cacher) et y insérer les données q je veux conserver.

    Y'a t il alors une autre solution ?

    Merci d'avance pr votre aide !!

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    tu as essayé de la déclarer en publique?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public variable as variant

  3. #3
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par Mourne
    Je souhaite conserver une donnée (type string)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public variable As String
    A écrire dans un module standard (pas le code d'une feuille).

  4. #4
    Membre habitué Avatar de Chewi
    Étudiant
    Inscrit en
    Août 2006
    Messages
    180
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Bonjour,

    Providence ou pas, j'avais justement une question similaire, je profite donc de ce topic.

    Dans un module de classe standard, je déclare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public utilisateur As string
    Dans le but de n'entrer qu'une fois le nom de l'utilisateur qui servira à maintes reprises dans les autres modules, userforms et ThisWorkbook.
    Suivant le poste sur lequel je travaille, le nom d'utilisateur change (bureau, école, domicile)
    D'où l'intérêt de ne changer qu'une seule fois le nom d'utilisateur et de ne pas parcourir tout le code pour remplacer.

    Si j'entre ceci, j'ai une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public utilisateur As String
    utilisateur = "chewi"
    Vous me répondrez certainement "logique!"

    Dois-je déclarer dans chaque sub "utilisateur =" ?
    Car je ne désire forcément pas donner une valeur dans chaque sub, sinon je perds l'utilité du "public".

    Pouvez-vous me dire comment ne changer qu'une seule fois la valeur ?
    Et donc n'entrer qu'une seule fois "utilisateur = chewi" ou " =moi" ou ...

    PS Mourne: regarde ce tuto très utile:
    http://silkyroad.developpez.com/VBA/LesVariables/#LV

    Merci à vous

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    On vient de le dire, non ?

    Bon, Chewi, je t'en voulais parce que tu as volé la question de Mourne mais bon, ça pourra lui servir.
    Tu as deux solutions selon ce que tu veux faire.
    1 - Ou tu souhaites que les mauvais utilisateurs ne puissent pas lancer les macros de ton appli, toutes les macros...
    2 - Ou tu souhaites ne les priver que de certaines macros.

    1 - Tu détectes le User dans Workbook_Open, détection que tu places dans Thisworkbook. Si ce n'est pas le bon, tu mets Exit sub après ton test.

    2 - Tu déclares un boolean en Public dans le module standard
    .....Public UserOk as boolean
    Tu détectes ensuite le User au même endroit que précédemment
    .....UserOk = LeUser est le bon
    Et tu conditionnes l'exécution de chaque macro par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not UserOk then exit sub

  6. #6
    Membre habitué Avatar de Chewi
    Étudiant
    Inscrit en
    Août 2006
    Messages
    180
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Désolé Ouskel'nord, je dois avoir du mal à m'exprimer je pense

    En fait, il n'y a pas de "mauvais utilisateur"

    Mais j'utilise mon code sur plusieurs postes, je modifie mon code, je le reprend, je l'utilise sur un autre poste et ainsi de suite et vu que je ne sais pas encore détecter automatiquement l'utilisateur en cours, lorsque j'utilise des chemins (C:\Doc and Settings\Chewi), je dois modifier chewi en paul sur un poste puis en J-luc sur un autre et ainsi de suite.

    Donc, pour que mon code puisse fonctionner, je dois modifier le chemin et mettre l'utilisateur courant à la place de chewi.

    Et plutôt que de modifier 42 fois, je souhaite utiliser "public" puis modifier 1 seule fois le nom de l'utilisateur.

    D'où ma question où puis-je dire "utilisateur=chewi"?
    Car tel quel en dessous de public utilisateur as string, j'ai une erreur.

    Bon, Chewi, je t'en voulais parce que tu as volé la question de Mourne mais bon, ça pourra lui servir.
    Je pensais bien faire en ne créant pas un 2ème topic identique

    B à T,

    Chewi

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Tu le mets ou Utilisateur = "Chewi" ? Tu dois le placer dans une sub...
    Pour avoir le nom du User, tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Utilisateur = Environ("USERNAME")
    Pour passer en revue le nom des utilisateurs et traiter le chemin, tu peux en créer un tableau à deux dimensions incluant les deux...
    Juste une idée

  8. #8
    Membre habitué Avatar de Chewi
    Étudiant
    Inscrit en
    Août 2006
    Messages
    180
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Bonjour et merci Ouskel'nord.

    Le fait de déclarer ma variable en public ne me sert donc pas vraiment dans mon cas car dans chaque sub je dois alors, si je comprends bien remplacer le nom d'utilisateur.

    Mais par contre, avec "environ", que tu me propose là, je ne dois plus jamais modifier mon chemin vu qu'il va s'adapter.

    Un grand merci donc!

    A la prochaine!

    PS. La question de Mourne ne rejoint-elle pas la mienne dans le sens ou il devra aussi remettre la valeur dans chaque sub ?

    A moins que, si j'ai compris, en donnant la valeur dans la 1ère sub, la valeur est réutilisable par après sans redonner la valeur.
    Vais voir ça...

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Mais j'utilise mon code sur plusieurs postes, je modifie mon code, je le reprend, je l'utilise sur un autre poste et ainsi de suite et vu que je ne sais pas encore détecter automatiquement l'utilisateur en cours, lorsque j'utilise des chemins (C:\Doc and Settings\Chewi), je dois modifier chewi en paul sur un poste puis en J-luc sur un autre et ainsi de suite.
    Pour connaître l'utilisateur qui est connecté, il suffit de créer un nouveau module et d'y copier le code ci-dessous :
    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
    24
    25
    26
    27
    28
     
    Declare Function JP_API_GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
    (ByVal lpBuffer As String, nsize As Long) As Long
     
    Public Function GetApplicationUserName()
     
    '   Procédure interne qui permet de retrouver le nom de la personne qui a effectué son LogOn
     
        Dim nRet As Integer
        Dim strName As String
        Dim strLong As Long
     
     
        strName = String(20, 0)
        strLong = Len(strName)
     
     
        nRet = JP_API_GetUserName(strName, strLong)
        While Right(strName, 1) = Chr(0)
            strLong = strLong - 1
            strName = Left(strName, strLong)
        Wend
     
     
        strusername = UCase$(strName)           ' On initialise la variable interne
        GetApplicationUserName = strusername
     
    End Function
    Il reste à appeler la fonction ainsi définie quand c'est nécessaire.
    Pour ma part, je copie cette valeur dans les "CustomDocumentProperties" juste avant de sauvegarder le fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     
    'CustomDocumentProperties.Add Name:="Updated on", LinkToContent:=False, Type:=msoPropertyTypeDate, Value:=Now()
    'CustomDocumentProperties.Add Name:="by", LinkToContent:=False, Type:=msoPropertyTypeString, Value:="delire.a"
     
    'update by who and when the file was saved the last time
     
    ActiveWorkbook.CustomDocumentProperties("Updated on") = Now()
     
    ActiveWorkbook.CustomDocumentProperties("by") = GetApplicationUserName
     
    End Sub
    Petites remarques :
    1) Les deux lignes commençant par "CustomDocumentProperties.Add Name" doivent être utilisées la première fois que le code est appelé. Ensuite, elles ne sont plus nécessaires d'ou en remarque dans mon exemple.
    2) Ce code fonctionne que le PC soit ou non connecté à un réseau.

  10. #10
    Membre habitué Avatar de Chewi
    Étudiant
    Inscrit en
    Août 2006
    Messages
    180
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Bonjour à tous et Merci Darkangel50,

    Mais vu mon utilisation, "Environ("UserName")" me suffit amplement.
    Ceci, je garde ton code sous le bras car je sais que je l'utilserai prochainement.

    Pour compléter la question à l'origine de ce post,

    Si je déclare "utilisateur =" dans une fonction public, cette valeur ne peut-elle pas être utilisée dans un private sub?

    Sinon, dans chaque private sub, je suis bon pour répéter "utilisateur = " en haut de chaque code?

  11. #11
    Membre habitué Avatar de Chewi
    Étudiant
    Inscrit en
    Août 2006
    Messages
    180
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Re le forum,

    Je reformule ma question (car je n'ai pas trouvé de réponse) dans le but d'augmenter mes chances:

    Est-il possible d'utiliser une variable dont on a fait la déclaration et l'affection en "public" dans des private sub d'autres modules?
    (Je pense aux Privates des UserForm).

    Merci à vous

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Il a rien compris
    Pour être reconnue partout-partout, une déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public MonUser as string 'Par exemple...
    Doit se faire en tête d'un module STANDARD de ton projet.
    Ce n'est pas une fonction mais une simple déclaration.
    Une fois là, elle sera reconnu aussi bien dans le/les modules de ton projet que dans le/les userform(s), les privates ou les pas privates sub.
    ...................................................P a r........t o u t !

    C'est bien, hein !

  13. #13
    Membre habitué Avatar de Chewi
    Étudiant
    Inscrit en
    Août 2006
    Messages
    180
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Ok c'est bon, ça vient de faire

    Mais il faut que l'affectation se fasse avant la réutilisation de la variable, je m'explique:
    Je ne peux pas affecter dans un coin de mon code une valeur à ma variable et lorsque j'appelle ma variable, qu'elle prenne la valeur automatiquement.

    Je suis obligé d'affecter sa valeur où je suis certain que mon code passe par avant comme dans thisWorkbook.

    Merci

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Ben voui !
    Dans un module standard tu déclares
    Puis dans le même module, dans la
    tu metsPuis dans les sub défendues, tu testes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Environ("UserName") <> Moi then exit sub
    Si toi pas comprendre, moi m'arracher mes 2 derniers cheveux !

  15. #15
    Membre habitué Avatar de Chewi
    Étudiant
    Inscrit en
    Août 2006
    Messages
    180
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Moi compris


    Garde tes cheveux

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 03/07/2015, 11h55
  2. Réponses: 1
    Dernier message: 22/04/2014, 16h32
  3. vba excel translation des données d'une feuille à l'autre
    Par Marc31 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 18/09/2010, 15h31
  4. Réponses: 8
    Dernier message: 16/07/2008, 09h08
  5. [VBA E] Conserver le derniere valeur selectionné d'une combobox
    Par zoumzoum59 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 18/06/2006, 10h28

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