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 :

Créer un objet disponible pour tous les modules et userform [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut Créer un objet disponible pour tous les modules et userform
    Bonjour à tous,

    Je suis coincé depuis un moment avec un problème frustrant car je sens que la solution est simple .

    J'ai X UserForms qui contiennent Y Procédures.

    Dans chaque UserForm je déclare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public InitWork, InitData, InitList, InitDev, InitPiece, InitAccueil As Object 
     
    Private Sub UserForm_Initialize()
     
        Set InitWork = ActiveWorkbook
        Set InitAccueil = InitWork.Sheets("Accueil")
        Set InitData = InitWork.Sheets("BdD")
        Set InitList = InitWork.Sheets("List")
        Set InitDev = InitWork.Sheets("Inter-Dev")
        Set InitPiece = InitWork.Sheets("Pièces")
    Ca marche nickel dans tout l'userform, par contre je n'arrive pas à appeler ces objets depuis un autre UserForm ou un autre module (et donc je les créé à chaque fois...).

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    ta ligne de déclaration n'est pas correcte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public InitWork, InitData, InitList, InitDev, InitPiece, InitAccueil As Object
    devrait être plus précisément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public InitWork As Object, InitData As Object, InitList As Object, InitDev As Object, InitPiece As Object, InitAccueil As Object
    Je ne comprends pas la seconde partie de ton problème par contre.

    Tu utilises une structure de données similaire ?
    Pourquoi ne pas passer par les modules de classes ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    pourquoi ne pas déclarer ces variables publiques dans un module standard ?
    et ajouter une seule procédure d'instanciation des objets dans le module standard, qu'il te suffit d'appeler (si besoin) dans tes userform quand il y a changement de classeur actif ?

  4. #4
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    Citation Envoyé par jpcheck Voir le message
    devrait être plus précisément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public InitWork As Object, InitData As Object, InitList As Object, InitDev As Object, InitPiece As Object, InitAccueil As Object
    Voilà déjà un premier point cela dit je suis assez surpris, car j'ai toujours déclaré mes variables comme ça et ça marche.

    Je ne comprends pas la seconde partie de ton problème par contre.

    Tu utilises une structure de données similaire ?
    Pourquoi ne pas passer par les modules de classes ?
    Bon alors j'ai une 10éne d'Userforms et 1 module qui s'initialise avec des données comprises dans différentes pages de différents tableaux (et qui enregistre aussi dans différents tableaux).

    J'aimerais déclarer une bonne fois pour toutes mes objets Sheets... afin de pouvoir naviguer entre les feuilles en utilisant le nom d'objet. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InitAccueil.Cells(x,x)=PlanningMetro.Cells(x,x)
    Jusqu'ici tout marche parfaitement, avec la déclaration de mes objets dans mon userform Ex:UF1, ils sont exploitables par toutes les procédures de UF1.
    Le problème c'est que je n'arrive pas à les exploiter dans un autre userform (Ex: UF2) et que je suis donc obliger de les redéclarer dans UF2 et UF3...

    J'imagine qu'il faut les déclarer une fois pour toute dans un module (de classe?) mais je ne trouve pas la syntaxe correcte pour que mes objets soient exploitable ensuite partout.

    J'espère que c'est clair

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2011
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 216
    Par défaut
    Bonjour,

    Pourquoi ne crées tu pas une procédure d'initialisation qui te fait un Set (sur des variables globales "projet") des classeurs et feuilles que tu utilises (avec une éventuelle gestion d'erreur si une feuille n'existe pas) ?

    Mise à jour: je crois que j'ai fais la même réponse que joe.levrai ...

    Remarque sur la déclaration de variable:
    si tu ne définis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public InitWork, InitData, InitList, InitDev, InitPiece, InitAccueil As Object
    Tu as déclaré 5 variables de type "variant" et une seule de type "Object" (la dernière).
    Cela va effectivement fonctionner mais tu n'as pas le typage que tu penses avoir écrit...

  6. #6
    Membre éprouvé Avatar de Neutthsch
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2016
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 105
    Par défaut
    Citation Envoyé par GastonLagaffe25 Voir le message
    Remarque sur la déclaration de variable:
    si tu ne définis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public InitWork, InitData, InitList, InitDev, InitPiece, InitAccueil As Object
    Tu as déclaré 5 variables de type "variant" et une seule de type "Object" (la dernière).
    Cela va effectivement fonctionner mais tu n'as pas le typage que tu penses avoir écrit...
    Alors déjà merci pour l'info, je tombe un peu des nues , ça fait bien longtemps que je fais cette erreur.

    Pourquoi ne crées tu pas une procédure d'initialisation qui te fait un Set (sur des variables globales "projet") des classeurs et feuilles que tu utilises (avec une éventuelle gestion d'erreur si une feuille n'existe pas) ?
    Bon je suis désolé je suis perdu.
    Si je crée un sub dans un module indépendant je serais obligé d'appeler la variable avec le nom du module, Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Module1.InitAccueil.Cells(x,x)=...
    Et j'aimerais éviter ça (entre autre parce qu'une énorme partie de mon code est déjà écrit ).

    En gros j'aimerais créer un objet global qui appartient à tout le monde. On est très proche de la définition du module de classe je sais mais je n'arrive pas à formuler ça.

  7. #7
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Nul besoin de faire référence au nom du module.

    fait comme ça :

    1) créer un module standard
    2) tout en haut du module, tu déclares tes variables publiques
    3) en dessous de la déclaration, tu crée une procédure dans laquelle tu instancies tout tes objets (par exemple, appelle la Initialisation)
    4) suivant l'usage de ton projet (que je ne connais pas) : dans la procédure Workbook_Open tu appelles la procédure Initialisation .. ou alors tu lance cette Initialisation au moment qui te semble le plus opportun.

    si tes objets ne doivent pas changer .. alors après avoir lancé la procédure Initialisation, tout tes objets sont accessibles directement par leur nom de variable, jusqu'à la fermeture de ton classeur qui contient le code

    si tu dois modifier l'instanciation (changement de ActiveWorbook), il te suffit de relancer la procédure Initialisation


    j'ai pas mal de projet qui fonctionnent comme ça, et c'est terriblement pratique.

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

Discussions similaires

  1. [2.x] [Twig] Fonction disponible pour tous les bundles
    Par Vinorcola dans le forum Symfony
    Réponses: 8
    Dernier message: 27/04/2011, 13h17
  2. Réponses: 2
    Dernier message: 04/11/2009, 10h17
  3. Réponses: 12
    Dernier message: 29/07/2009, 16h26
  4. Réponses: 0
    Dernier message: 23/07/2009, 15h21
  5. Réponses: 0
    Dernier message: 23/07/2009, 15h21

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