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 :

problème de portée de variables [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2014
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2014
    Messages : 72
    Par défaut problème de portée de variables
    Bonsoir

    Je souhaiterai, dans un même module, pouvoir déclarer et initialiser des variables une fois, pour qu'elles soient ensuite visible dans tout le module. Mon idée était la suivante

    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
     
    Option Explicit 
    Private FeuilleDonnees As Worksheet 
    Private FeuilleMacro As Worksheet 
    Private NbrLigDon As Long 
     
    Sub InitialisationVariables() 
    Set FeuilleDonnees = Worksheets("Octobre")         
    Set FeuilleMacro = Worksheets("Macro CRT") 
             ' Déterminer la dernière ligne de la feuille de données 
            NbrLigDon = FeuilleDonnees.Range("A" & Rows.Count).End(xlUp).Row ' ce qui donne 7500 dans mon cas de figure
    End Sub 
     
    Sub valid_1() 
       call InitialisationVariables
       MsgBox (NbrLigDon)  ' je souhaiterai qu'il me retourne 7500
    etc 
    End sub 
     
    Sub valid_2() 
       call InitialisationVariables 
     
    etc 
    End sub
    Un bouton est attibué à chaque valid_n(), et il n'y a aucun rapport ou lien entre les deux

    Il se trouve que MsgBox (NbrLigDon) retourne 0.

    Merci à celui ou celle qui m'éclairera sur la raison, car j'ai tout essayé. Public, static...

    ps :comment fait-on pour écrire le code "formaté" avec les couleurs ?

  2. #2
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Tout d'abord, il te faut absolument lire ce tutoriel

    http://silkyroad.developpez.com/VBA/LesVariables/

    Tout dépend de la porté de tes variables.

    De plus, je n'ai pas très bien compris le sens de ta dernière question.

  3. #3
    Membre confirmé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2014
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2014
    Messages : 72
    Par défaut
    Bonsoir MarcelG;7720308

    Bon, je vais lire ce que vous m'avez envoyé, la tête reposée.


    De plus, je n'ai pas très bien compris le sens de ta dernière question.
    question que j'ai oublié d'enlever du premier message puisque j'ai trouvé la sollution (c'est le bouton # => [code ]qu'il faut utiliser pour que le code s'affiche en tant que code dans une discussion, en non [quote])

    Bonsoir MarcelG

    J'ai lu le tutoriel mais cela ne m'a pas aidé pour autant.
    J'ai bien déclaré les variables en tête de module et hors procédure ou fonction, qui plus est par un private qui, si j'ai bien compris, permet de les rendre visibles à toutes procédures du même module.

    Je comprend aussi qu'il y a une différence entre :
    • Portée : Accessibilité d'une variable ou constante
    • Durée de vie : Durée de conservation de la valeur


    Dans l'exemple posé, NbrLigDon "meurt" en sortant de la procédure InitialisationVariables (tout comme les autres variables d'ailleurs, par solidarité communautaire, je suppose)
    A vrai dire c'est plus cela qui me pose tracas.

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Et en les déclarant en Public, bien entendu en en-tête de module?

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

    pas de problème de portée dans le code que tu nous montre ... est tu sur de nous montrer le bon code ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Salut,

    Essaie comme ceci:
    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
    Option Explicit
     
    Private Static Property Get FeuilleDonnees() As Excel.Worksheet
        Dim Temp As Excel.Worksheet
        If Temp Is Nothing Then
            Set Temp = Worksheets("Octobre")
        End If
        Set FeuilleDonnees = Temp
    End Property
     
    Private Static Property Get FeuilleMacro() As Excel.Worksheet
        Dim Temp As Excel.Worksheet
        If Temp Is Nothing Then
            Set Temp = Worksheets("Macro CRT")
        End If
        Set FeuilleMacro = Temp
    End Property
     
    Private Property Get NbrLigDon() As Long
        With FeuilleDonnees
            ' Donne 7500 dans mon cas de figure
            NbrLigDon = .Range("A" & .Rows.Count).End(xlUp).Row
        End With
    End Property
     
     
    ' -------------------------------------------------------------------------------------------------
    ' --------------------------------------   CODE  ICI  ------------------------------------------
     
    Sub valid_1()
       MsgBox (NbrLigDon)  ' je souhaiterai qu'il me retourne 7500
    End Sub
     
    Sub valid_2()
       MsgBox (NbrLigDon)  ' je souhaiterai qu'il me retourne 'dynamiquement une valeur en fonction de la dernière ligne
    End Sub

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu utilises Option Explicit donc si la variable n'était pas connue dans ta procédure, tu aurais un message d'erreur
    Il se trouve que MsgBox (NbrLigDon) retourne 0.
    Je soupçonne que tu es peut-être en train de lire une feuille nommée Octobre d'un autre classeur qui serait actif.
    Dans la procédure InitialisationVariables() tu initialises les variables objet feuille sans préciser le parent (ThisWorkbook ou autre classeur)

    Ajoute cette instruction MsgBox FeuilleDonnees.Name dans ta procédure pour vérifier si la variable contient une valeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub valid_1()
       Call InitialisationVariables
       MsgBox (NbrLigDon)  ' je souhaiterai qu'il me retourne 7500
       MsgBox FeuilleDonnees.Name
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

Discussions similaires

  1. Problème de portée de variables (VBS)
    Par befast dans le forum Windows
    Réponses: 0
    Dernier message: 18/09/2007, 09h40
  2. [Mail] problème de portée de variables
    Par xclam dans le forum Langage
    Réponses: 2
    Dernier message: 12/04/2007, 09h35
  3. Problème de Portée de Variable
    Par Julien_C++ dans le forum C++
    Réponses: 7
    Dernier message: 18/09/2006, 10h13
  4. [VBA-E] Problème de portée de variable [débutant]
    Par vivelesgnous dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/03/2006, 18h28
  5. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34

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