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 - Déclarer wb et ws une fois, pour tous les modules


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Femme Profil pro
    Ingéniérie financière (orienté VBA Excel donc)
    Inscrit en
    Janvier 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Kazakhstan

    Informations professionnelles :
    Activité : Ingéniérie financière (orienté VBA Excel donc)

    Informations forums :
    Inscription : Janvier 2016
    Messages : 37
    Par défaut VBA - Déclarer wb et ws une fois, pour tous les modules
    Bonjour,

    Je suis à nouveau confronté à un soucis dont je n'ai jamais réussi à obtenir une réponse convenable :
    j'aimerais pouvoir déclarer une fois par exemple à l'ouverture du classeur dans le Workbook_Open() le classeur, les feuilles, éventuellement d'autres objets.

    Je déclare publiques le wb et les worksheets dans l'espace de code (module) du classeur
    Déjà ça n'est pas accessible dans les autres modules (mais pour ça, il faut mettre en Global les variables sauf que ce n'est pas possible pour des objets non primitifs j'ai l'impression !)

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Workbook_Open()
     
    'variables globales
     
    'Call declarationVariables
     
    Set wb = ThisWorkbook
    Set wsA = wb.Worksheets("AMORTISSEMENT")
    Set wsT = wb.Worksheets("TABLEAU_AUTOMATIQUE")
     
    debug.print wsA.Name & " dans wb_Open"
     
    End Sub

    Je suis tombé sur pas mal de topics présentant ce même soucis, mais je n'arrive pas à appliquer les solutions. Ca ne marche pas.
    Exemple : ce topic

    Je n'ai encore jamais rencontré le
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Property Get ModelWorksheet As Worksheet
    Je me renseigen pour l'utiliser,

    Mais avez-vous déjà rencontré ce problème,
    COmment l'avez-vous résolu ?

    Bien à vous,
    Douzal

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    c'est superflu vu les variables objet déjà prédéfinies comme ThisWorkbook et les CodeName des feuilles de calculs,
    pourquoi donc créer ce qui est déjà existant ?‼

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    Membre averti
    Femme Profil pro
    Ingéniérie financière (orienté VBA Excel donc)
    Inscrit en
    Janvier 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Kazakhstan

    Informations professionnelles :
    Activité : Ingéniérie financière (orienté VBA Excel donc)

    Informations forums :
    Inscription : Janvier 2016
    Messages : 37
    Par défaut
    Nb : j'ai aussi un autre module avec donc redéclaration des variables (pas bien déjà, ça m'ennuie beaucoup) et là l'affectation n'est pas effective

    Code VBA : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Option Base 1
    Option Explicit
     
    ' ________________________________________
     
    'Global wb As Workbook
    Public wb As Workbook
     
    Public MONTANT As Double
    Public TAUX As Long
    Public NBPER As Byte
    Public TYP As String
     
    Public wsA As Worksheet
    Public wsT As Worksheet
    'Public wb As Workbook
    Public c As Range
     
    ' ________________________________________
     
     
     
     
     
    Private Sub valider_Click()
     
    'Dim MONTANT As Double
    'Dim TAUX As Long
    'Dim NBPER As Byte
    Dim TYP As String
     
    'Dim wsA As Worksheet
    'Dim wsT As Worksheet
    'Dim wb As Workbook
    Dim c As Range
     
    'affectation
    'Set wb = ThisWorkbook
    'Set wsA = wb.Worksheets("AMORTISSEMENT")
    'Set wsT = wb.Worksheets("TABLEAU_AUTOMATIQUE")
    'Call declarationVariables
     
    MsgBox "Dans Valider_Click"
    MsgBox wsA.Name & " dans Valider_click"
    MsgBox "Dans Valider_Click"
     
     
    End Sub


    Nb : fichier en pj
    Fichiers attachés Fichiers attachés

  4. #4
    Membre averti
    Femme Profil pro
    Ingéniérie financière (orienté VBA Excel donc)
    Inscrit en
    Janvier 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Kazakhstan

    Informations professionnelles :
    Activité : Ingéniérie financière (orienté VBA Excel donc)

    Informations forums :
    Inscription : Janvier 2016
    Messages : 37
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    Bonjour,

    c'est superflu vu les variables objet déjà prédéfinies comme ThisWorkbook et les CodeName des feuilles de calculs,
    pourquoi donc créer ce qui est déjà existant ?‼

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    Oh ?
    Je dois me renseigner sur les CodeNames, jamais entendu parler !

    Mais dans chacune de mes proc, j'ai pris la bonne habitude de bien pointer sur le classeru et la feuille, et toujours passer par ces
    set wb = thisworkbook
    setws1 = wb.worksheets("nomFeuille1")

    Y'a plus simple ??
    (merci poru ta rapidité)

  5. #5
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Les variables prédéfinies automatiquement pour le classeur et ses feuilles de calculs
    étant disponibles dans tout type de module de ce même classeur, utiliser directement ThisWorkbook pour le classeur …

    Exemple de CodeName dans cette discussion

  6. #6
    Membre averti
    Femme Profil pro
    Ingéniérie financière (orienté VBA Excel donc)
    Inscrit en
    Janvier 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Kazakhstan

    Informations professionnelles :
    Activité : Ingéniérie financière (orienté VBA Excel donc)

    Informations forums :
    Inscription : Janvier 2016
    Messages : 37
    Par défaut
    Citation Envoyé par Marc-L Voir le message

    Les variables prédéfinies automatiquement pour le classeur et ses feuilles de calculs
    étant disponibles dans tout type de module de ce même classeur, utiliser directement ThisWorkbook pour le classeur …

    Exemple de CodeName dans cette discussion
    Merci,
    Je me renseigne ça peut effectivement être une solution qui change de mes habitudes mais qui fonctionne parfaitement !
    Si je peux assigner un String au CodeName, ça va le faire

    Top,
    Je regarde tout ça !!

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Conclusion :

    en utilisant directement ThisWorkbook ou/et les CodeName des feuilles de calculs,
    il est inutile  - superfétatoire même ! -  de créer des variables pour ces objets.

    Sans compter l'utilisation de l'instruction With

  8. #8
    Membre averti
    Femme Profil pro
    Ingéniérie financière (orienté VBA Excel donc)
    Inscrit en
    Janvier 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Kazakhstan

    Informations professionnelles :
    Activité : Ingéniérie financière (orienté VBA Excel donc)

    Informations forums :
    Inscription : Janvier 2016
    Messages : 37
    Par défaut
    Alors voici, je mets dans le module du classeur

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Explicit
    Option Base 1
     
    Public wsA As String
     
    Private Sub Workbook_Open()
     
    ' affectation a wsA (portee publique) du codeName de la feuille Amortissement
    wsA = ThisWorkbook.Worksheets("AMORTISSEMENT").CodeName
     
     
    End Sub

    Et dans le bouton associé au clic sur VALIDER :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub valider_Click()
     
    ' "variable non definie"
    MsgBox wsA
     
    End Sub
    La variable n'est pas definie ..

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    D'accord pour ThisWorkbook, mais pour les feuilles je serais moins catégorique personnellement.
    Un codename par défaut est Feuilxx, il faudait tous les reprendre dans VBE si on veut un code autocommenté.
    Pour moi c'est plus simple de déclarer une variable, sauf si on veut s'affranchir d'un renommage des feuilles.

    La déclarer (Public ou Global selon la portée voulue) au début d'un module Standard, avant toute procédure.
    eric

  10. #10
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Créer une variable pour le classeur contenant le code ou pour ses propres feuilles de calculs est :


    I N U T I L E


    Encore une fois et c'est la dernière :   juste utiliser directement leurs variables prédéfinies …

    Sauf à vouloir perdre du temps et gâcher des ressources systèmes !

  11. #11
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par eriiic Voir le message
    Un codename par défaut est Feuilxx, il faudait tous les reprendre dans VBE si on veut un code autocommenté.
    Salut Eric !

    le CodeName d'une feuille est modifiable (déjà sans code) afin qu'il soit plus parlant comme l'exemple Facture dans le lien du post #5 …

  12. #12
    Membre averti
    Femme Profil pro
    Ingéniérie financière (orienté VBA Excel donc)
    Inscrit en
    Janvier 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Kazakhstan

    Informations professionnelles :
    Activité : Ingéniérie financière (orienté VBA Excel donc)

    Informations forums :
    Inscription : Janvier 2016
    Messages : 37
    Par défaut
    Citation Envoyé par eriiic Voir le message
    Bonjour,

    D'accord pour ThisWorkbook, mais pour les feuilles je serais moins catégorique personnellement.
    Un codename par défaut est Feuilxx, il faudait tous les reprendre dans VBE si on veut un code autocommenté.
    Pour moi c'est plus simple de déclarer une variable.

    La déclarer (Public ou Global selon la portée voulue) au début d'un module Standard, avant toute procédure.
    eric
    Mais la déclarer global, ça ne fonctionne pas...
    Apparemment faudrait que je regarde plutôt sur les Property Get

    Je me renseigne dessus

  13. #13
    Membre averti
    Femme Profil pro
    Ingéniérie financière (orienté VBA Excel donc)
    Inscrit en
    Janvier 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Kazakhstan

    Informations professionnelles :
    Activité : Ingéniérie financière (orienté VBA Excel donc)

    Informations forums :
    Inscription : Janvier 2016
    Messages : 37
    Par défaut
    Citation Envoyé par Marc-L Voir le message

    Créer une variable pour le classeur contenant le code ou pour ses propres feuilles de calculs est :


    I N U T I L E


    Encore une fois et c'est la dernière :   juste utiliser directement leurs variables prédéfinies …

    Sauf à vouloir perdre du temps et gâcher des ressources systèmes !

    Mais du coup, je suis obligé de taper ces lignes pour chaque feuille, à chaque fois ?
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    wsX = ThisWorkbook.Worksheets("NomFeuilleX").CodeName

    Je dois zaper un truc

  14. #14
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    il y a bien mieux si le code se trouve dans le classeur contenant la feuille de calculs : son CodeName.

    Et dans ce cas il n'y a rien à programmer car c'est déjà un alias !

    Dans l'environnement VBA, dans la fenêtre Projet - VBAProject apparait chaque classeur ouvert.
    A l'intérieur figure le nom de chaque feuille de calculs entre parenthèses précédée de son CodeName,
    par exemple "Feuil1 (facture)" …

    Donc au lieu de Worksheets("facture").Range utiliser Feuil1.Range !
    Non juste le CodeName de la feuille (Ex Feuil1) comme pourtant déjà expliqué dans l'exemple de ce lien …

  15. #15
    Membre averti
    Femme Profil pro
    Ingéniérie financière (orienté VBA Excel donc)
    Inscrit en
    Janvier 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Kazakhstan

    Informations professionnelles :
    Activité : Ingéniérie financière (orienté VBA Excel donc)

    Informations forums :
    Inscription : Janvier 2016
    Messages : 37
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    Non juste le CodeName de la feuille (Ex Feuil1) comme pourtant déjà expliqué dans l'exemple de ce lien …
    Ok.
    Donc si l'alias change, je dois aller changer dans tous les appels de l'alias,
    Mais sinon la solution est top !

    On doit pouvoir gérer la récupération dans une string de l'alia, puis l'appel à la String ayant récupéré l'alias,
    Je n'ai aps le temps de m'y pencher à l'heure actuelle mais merci déjà pour ton aide

    Bien à vous,
    Doudouz

  16. #16
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Un simple Rechercher / Remplacer dans le VBE …
    Appel à une variable String :  encore une fois pourquoi vouloir compliquer alors qu'il y a déjà un alias opérationnel ?!

    Sinon quand tu crées un projet VBA, pour peu qu'il y ait eu un tant soit peu de jugeote au préalable (analyse)
    tu sais déjà avant de coder quoique ce soit quels sont les objets que tu vas utiliser
    et si Feuil1 n'est pas parlant pour toi tu peux déjà directement le modifier en ce que tu veux …

  17. #17
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Oui, je sais changer un codename.
    Si tu pouvais éviter les "INUTILE" en gras, rouge et taille 128 stp, j'ai l'impression d'avoir affaire à un ayatollah de la pensée unique là.
    Si j'ai envie d'utiliser des variables comme shS ou shD pour mes feuilles source et destination, je peux ou il faut une permission ?
    Parce qu'en fait ça m'arrange d'avoir le type même notation au long de certains codes bateaux, même pour des feuilles différentes.
    Tu dis.
    eric

  18. #18
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Eric, tu es bien sûr seul maître à bord !
    En espérant que tu libères bien toute variable objet avant la fin de la procédure …

  19. #19
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    En général oui
    Et sa question était quand même "comment bien déclarer une variable publique", et non comment s'en passer ;-)
    Donc dans un module Standard, et pas dans un module de classe (comme ThisWorkbook, feuille,...)

  20. #20
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Oui mais pour recréer ce qui existe déjà donc autant l'en informer !

    Qui plus est peu ou prou sont au courant de l'utilité - pour ne pas dire l'obligation - de libérer les variables objets
    avant la fin de la procédure, juste en lisant l'aide VBA de Nothing
    C'est sûr peu d'incidence avec les ordinateurs d'aujourd'hui mais il n'y a pas encore si longtemps sous XP
    avec 1Go de RAM je voyais des Excel avec des crashs de mémoire après l'exécution répétitive de telles procédures,
    obligation de redémarrer l'ordinateur sans compter le boxon dans les données …

    Donc quand c'est inutile, je préfère clairement l'indiquer au lieu de verser dans de l'usine à gaz !

Discussions similaires

  1. [PHP 5.0] [Conception] Une page pour tous les traitements ?
    Par keaton7 dans le forum Langage
    Réponses: 15
    Dernier message: 25/04/2009, 14h02
  2. Comment faire un alignement vertical d'une image pour tous les navigateurs?
    Par Alexandrebox dans le forum Mise en page CSS
    Réponses: 10
    Dernier message: 06/04/2009, 14h10
  3. Réponses: 4
    Dernier message: 18/08/2008, 15h11
  4. Réponses: 3
    Dernier message: 06/09/2007, 14h31
  5. Installation d'une imprimante pour tous les utilisateurs
    Par chobol dans le forum Windows XP
    Réponses: 4
    Dernier message: 04/09/2007, 22h28

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