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 :

Déclaration public - Constante


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut Déclaration public - Constante
    Bonjour,
    Dans le dernier fichier où j'ai travaillé, j'ai noté que j'avais écris 350 fois :
    Workbooks("FichierPrincipal.xlsm").Sheets("Données")
    Le plus souvent, pour accoller un .range("..") derière.

    Je voudrais savoir comment déclarer une constante du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Const RefDon as string = "Workbooks("FichierPrincipal.xlsm").Sheets("Données")"
    pour ensuite dans mes procédures n'avoir plus qu'à préciser la range
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RefDon.Range("A1") = "toto"
    Merci de votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Tu ne peux pas déclarer ça comme une String.
    Un workbook et un Worksheet sont des objets...

    Par contre, il y a l'utilisation de With qui pourrait t'éviter de réécrire plusieurs fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Workbooks("FichierPrincipal.xlsm").Sheets("Données")
       .Range("A1") = "toto"
       .Range("A2") = "titi"
    End With
    Autrement, tu peux déclarer des variables en Public que tu "Set" au démarrage de l'application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Bk as workbook, Sh as worksheet

  3. #3
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    bonsoir,

    utilise un objet feuille de calcul, il y as plein d'exemples sur le forum :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim sh as WorkSheet
    set sh= Workbooks("FichierPrincipal.xlsm").Sheets("Données")
     
    sh.range("A1")="Et vooilà"

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Effectivement utiliser 350 fois FichierPrincipal.xlsm peut être replacer par un variable public.

    En revanche tu n'expliques pas comment ce fichier arrive dans la vie de ton application!
    En effet, si ton fichier est ouvert par l'application , si l'ouverture est un prérequis et l'utilisateur doit l'ouvrir! Mais ce cas de figure est absurde!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public sh as WorkSheet
    Public wb as Workbook
    Sub init()
    Set wb=Workbooks.open("c:\FichierPrincipal.xlsm")
    set sh= wb.Sheets("Données")
    End Sub

  5. #5
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut
    Bonjour à Tous et merci pour vos réponses.
    Bbil
    quand j'essaie ton code, j'ai un message d'erreur d'exécution 9 : l'indice n'appartient pas à la selection (sur le Set)
    Mais j'ai le même motif avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Sh = Sheets("Données")
    par contre,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Sh = Wb.Sheets("Données")
    passe très bien (Rdurupt)

    rdurupt,
    Ce fichier est ouvert manuellement, puis il pilote un grand nombre de mises à jour qui consistent à ouvrir des fichiers, aller chercher des données, incrémenter une base de données, écrire quelques formules, fermer les fichiers tiers ; mais j'ai quelques interventions manuelles à faire quelques fois donc je lance ces actions avec des boutons et donc je vais perdre le set entre chaque lancement.
    Je suis sans arrêt en train de passer d'un fichier à l'autre, par contre les noms des feuilles de travail sont quasiment les mêmes.

    Car si je comprends ce que vous voulez me dire, c'est qu'en lançant un set, avec une variable publique, je garde la valeur de la variable tout le long de la procédure ? (je ne peux pas vérifier tant que je n'aurai pas résolu le message d'erreur - quand je dis "je", je pense bien évidemment à "Vous" ;>)

    Merci encore pour votre intervention.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Nous restons dans l'inconnu, car si FichierPrincipal.xlsm est le fichier qui contient tes macros, tu peux utiliser la méthode open de thisWorkbook pour renseigner ta variable
    Set Sh = ThisWorkbook.Sheets("Données")

  7. #7
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut
    Oui, rdurupt,
    Tu as raison, je vais faire comme tu le suggérais :
    • Faire une déclaration public
    • faire une Sub Init() avec tous les Set pour donner les valeurs aux variables
    • enfin, à chaque fois que je lance un nouveau bloc de procédures, de faire un Call Init pour réinitialiser les variables

    J'aurais préféré des constantes, mais si c'est pas possible, vous m'avez donné une méthode, je ferai avec et je serai très contente.

    Par contre, si vous pouvez me dire pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Sh = Sheets("Données")
    ne fonctionne pas...
    Je vous remercie pour tout.

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Probablement parce que Sheets("Données") n'existe pas dans le fichier actif.
    De là l'importance de spécifier dans quel classeur.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par parmi Voir le message
    Probablement parce que Sheets("Données") n'existe pas dans le fichier actif.
    De là l'importance de spécifier dans quel classeur.
    parfaitement exacte!

  10. #10
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut
    Bah non puisque Set Sh = Wb.Sheets("Données") fonctionne => le classer est ouvert et la feuille aussi.
    Le pire c'est que j'ai l'impression qu'un coup cela fonctionne et qu'un autre pas - Ah, je pense avoir compris en partie, il faut que le classeur soit actif.
    Donc j'avance dans la mise en place de cette méthode, maintenant, c'est l'activation du chemin "secondaire" qui ne fonctionne pas, or je mettrai ma main au feu que cela fonctionnait tout à l'heure, puisque j'ai ouvrert un fichier dans ce répertoire secondaire...

    Voici où j'en suis
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Option Explicit
    Public Sh, ShSc As Worksheet
    Public Wb, WbSc As Workbook
    Public ChemPr, ChemSc As String 'chemin principal et secondaire
     
    Sub LancmtProc()
     Call Init
     Call test1
    End Sub
     
    Sub Init()
    Dim Second As String
       Second = "AclasserCgoss"    'sous rép secondaire
     Set Wb = Workbooks("FichierPrincipal.xlsm")
      'Set Sh = Sheets("Données")        'si le fichier est actif OU
     Set Sh = Wb.Sheets("Données")
     Set ChemPr = Sh.[B3]    'Chemin actif B3=GAUCHE(CELLULE("nomfichier");TROUVE("[";CELLULE("nomfichier"))-1)
    'à partir d'ici, ça ne fonctionne plus
     Set ChemSc = ChemPr & Second    'Chem Secondaire pour ouvrir le 2ème fichier
     Set WbSc = Workbooks("Congel Mcg.xlsx")    'Nom du classeur secondaire
     Set ShSc = WbSc.Sheets(1)      'Nom de la feuille du classeur secondaire
    End Sub
     
    Sub test1()
    'exemple de procédure utilisant les Set
    Wb.Activate
    Sh.Range("A21") = Sh.Name  
    Sheets(2).Activate
    [A2] = "Toto"
    Sh.[A22] = [A2] & " et Titi"
    Workbooks.Open (ChemPr & "CopieCollTest.xlsm")   'ça cela fonctionne
    Workbooks.Open (ChemSc & "Congel Mcg.xlsx")      'ça, cela a fonctionné !!!
    Sh.[B22] = ShSc.[C3]
    End Sub
     
    Sub Nettoyage()
    Call Init
    With Sh
        .[A21] = ""
        .[A22] = ""
        .[B22] = ""
        .[A23] = ""
    End With
    Sheets(2).[A2].Clear
    End Sub
    Je n'arrive pas comprendre pourquoi cela a fonctionné et que maintenant, Excel envoie le message "Objet requis".
    Merci pour votre aide

  11. #11
    Invité
    Invité(e)
    Par défaut
    Apprends à utiliser les objets VB!

    Pas de select selection et autre activate!
    wb.Sheets(2).range("A2") = "Toto"!

    set wbCpTest= Workbooks.Open (ChemPr & "CopieCollTest.xlsm")

  12. #12
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut
    rdurupt
    Apprends à utiliser les objets VB!
    c'est bien ce que j'essaie de faire, grace à votre aide

    Je ne comprends pas ce que tu essaies de me dire.
    Je fais une sub pour initialiser mes variables, il n'y a qu'un seul classeur d'ouvert (il peut bien sur y en avoir d'autres, mais pour l'erreur en cause ?), je ne vois pas ce que je peux activer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Init()
    Dim Second As String
       Second = "AclasserCgoss"    'sous rép secondaire
     Set Wb = Workbooks("FichierPrincipal.xlsm")
      'Set Sh = Sheets("Données")        'si le fichier est actif OU
     Set Sh = Wb.Sheets("Données")
     Set ChemPr = Sh.[B3]    'Chemin actif B3=GAUCHE(CELLULE("nomfichier");TROUVE("[";CELLULE("nomfichier"))-1)
    'à partir d'ici, ça ne fonctionne plus
     Set ChemSc = ChemPr & Second    'Chem Secondaire pour ouvrir le 2ème fichier
     Set WbSc = Workbooks("Congel Mcg.xlsx")    'Nom du classeur secondaire
     Set ShSc = WbSc.Sheets(1)      'Nom de la feuille du classeur secondaire
    End Sub
    pourquoi fonctionne et pas le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set ChemSc = ChemPr & Second

  13. #13
    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,

    voici la déclaration de tes variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public ChemPr, ChemSc As String 'chemin principal et secondaire
    ChemPr est de type Variant car tu ne spécifies pas son type. Ca veut donc dire que tu peux utiliser cette variable dans n'importe quel contexte ... VBA se chargera de le typer à ta placer
    ChemSc est de type String


    donc ta ligne
    fonctionne parfaitement : VBA type ta variable en Range car tu lui affectes l'objet "Cellule" B3 de ta feuille Sh
    mais le comportement n'est pas celui que tu souhaites !! Toi tu veux la valeur de cette cellule, et non pas positionner un pointeur (une variable objet) sur cette cellule

    ta ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set ChemSc = ChemPr & Second
    doit probablement te renvoyer l'erreur "objet requis"
    ChemSc étant un String (et pas un objet), on lui assigne une valeur sans utiliser l'instruction Set (qu'on emploie pour instancier une variable Objet)



    Donc tu as deux problèmes :

    1) Déclarer correctement tes variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public ChemPr As String, ChemSc As String 'chemin principal et secondaire
    2) Assigner correctement une valeur à une variable "non objet"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ChemPr = Sh.[B3].value
    ChemSc = ChemPr & Second

  14. #14
    Invité
    Invité(e)
    Par défaut
    Au post #10 dans ton code voila ce que tu mets!
    Sheets(2).Activate!

    Et encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Workbooks.Open (ChemPr & "CopieCollTest.xlsm")   'ça cela fonctionne
    Workbooks.Open (ChemSc & "Congel Mcg.xlsx")

  15. #15
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut
    Bonjour Joé,

    Merci beaucoup pour toutes tes précisions, elles me sont très précieuses.

    J'ai encore un pb, maintenant que mes déclarations sont modifiées mes variables prennent bien les valeurs sauf une pour le motif "L'indice n'appartient pas à la sélection"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set WbSc = Workbooks(ChemSc & "Congel Mcg.xlsx")    'Nom du classeur secondaire
    Je rappelle qu'il s'agit d'un fichier qui n'est pas encore ouvert au moment où la macro est lancée ; ChemSc a bien la valeur du chemin avec \ en fin et que le fichier "Congel Mcg.xlsx" existe bien dans le chemin ChemSc

    Merci

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par mouftie Voir le message
    Bonjour Joé,
    Je rappelle qu'il s'agit d'un fichier qui n'est pas encore ouvert au moment où la macro est lancée ; ChemSc a bien la valeur du chemin avec \ en fin et que le fichier "Congel Mcg.xlsx" existe bien dans le chemin ChemSc

    Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set WbSc = Workbooks.open(ChemSc & "Congel Mcg.xlsx")    'Nom du classeur secondaire

  17. #17
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut
    Bonsoir rdurupt,
    Merci de ta réponse, mais mon objectif ici n'est pas d'ouvrir le fichier ou de travailler dedans.
    Par la suite je devrais l'ouvrir, le fermer, qqun d'autre apportera des données et je devrais le rouvrir pour les récupérer. Et de même pour d'autres.
    C'est pourquoi mon objectif est de créer une Sub Ini() pour rassembler toutes les variables de fichiers.
    Ensuite il me suffit de faire une Call Ini.

  18. #18
    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,

    tu peux préparer tes variables certes, mais dans le cadre d'un classeur qui n'est pas encore ouvert, tu ne peux pas emprunter le chemin direct

    un exemple, dans un module standard

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Const Chemin as String = "C:\"
    Const NomFichier as String = "MonClasseur.xlsm"
    et avec ça tu peux facilement retrouver ton objet classeur quand tu en as besoin, dans n'importe quelle procédure du projet, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Wb = Workbooks.Open(Chemin & NomFichier)

    A noter qu'on est pas obligé d'avoir un chemin écrit en dur dans le code, dans ce cas là tu passes par des variables publiques plutôt que des constantes :
    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
    Public Chemin As String
    Public NomFichier As String
     
    Sub Init()
    Chemin = Feuil1.[A1]
    NomFichier = Feuil1.[A2]
    End Sub
     
    Sub UneMacro()
    Call Init
    ' et tu fais ce que tu veux
    ' ici j'ouvre le classeur
    Set Wb = Workbooks.Open(Chemin & NomFichier)
     
    End Sub
    Suivant tes besoins, tu peux également placer un dans la procédure Workbook_Open()
    Cette procédure Init servira donc à paramétrer tes variables (objet ou non)

  19. #19
    Membre éclairé
    Femme Profil pro
    reconversion en cours
    Inscrit en
    Juillet 2009
    Messages
    633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : reconversion en cours
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 633
    Par défaut
    Bonjour Joé,

    Merci encore pour toutes tes précisions et ta patience, j'ai beaucoup apris et surtout, j'ai une méthode qui me sera bien utile à l'avenir.

    Merci à tous, bonne journée

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

Discussions similaires

  1. [String] Déclaration de constantes
    Par bulbo dans le forum Langage
    Réponses: 10
    Dernier message: 22/07/2008, 17h19
  2. déclaration de constante
    Par DiverSIG dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/06/2007, 08h07
  3. [VB.NET] Déclaration PUBLIC Multiple
    Par olbi dans le forum VB.NET
    Réponses: 2
    Dernier message: 06/04/2007, 11h02
  4. Réponses: 2
    Dernier message: 05/04/2007, 15h52
  5. Déclaration de constantes
    Par gilv57 dans le forum C
    Réponses: 2
    Dernier message: 13/12/2006, 21h35

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