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 :

Comment pointer sur une constante déclarée dans un module [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur acousticien
    Inscrit en
    Septembre 2015
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur acousticien
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2015
    Messages : 122
    Points : 74
    Points
    74
    Par défaut Comment pointer sur une constante déclarée dans un module
    Bonjour,

    Je souhaiterais pouvoir comparer 2 séries de constantes, respectivement contenues dans 2 modules différents et dans 2 classeurs différents.

    En fait, lors de l'utilisation de 2 fichiers Excel contenant des programmes en VBA, je souhaiterais vérifier que les constantes (nommées de la même manière) ont les même valeurs dans les 2 fichiers et indiquer à l'utilisateur celles qui sont différentes le cas échéant. Je précise qu'il est nécessaire de déclarer les constantes dans les 2 fichiers puisqu'ils doivent pouvoir travailler séparément.

    L'ensemble des constantes sont des "string" déclarées et initialisées comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Const un_e2l As String = "entre logements"
    Je ne sais pas du tout comment je pourrais avoir accès en vba à ces constantes...

    Merci d'avance pour votre aide !

  2. #2
    Membre émérite Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Points : 2 439
    Points
    2 439
    Par défaut
    Bonjour flav_cm,

    Tout simplement comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
        Debug.? un_e2l
        MsgBox "Ma variable ""un_e2l"" vaut : " & un_e2l
    End Sub
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
        Debug.? MonModule.un_e2l
        MsgBox "Ma variable ""un_e2l"" vaut : " & MonModule.un_e2l
    End Sub

  3. #3
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 112
    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 112
    Points : 9 922
    Points
    9 922
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    une autre piste en manipulant le VBE via une fonction, à adapter si c'est compatible avec ton projet

    j'ai utilisé pour l'exemple :

    - Thisworkbook qui contient la première constante
    - Classeur2 qui contient la seconde constante
    - les constantes portent le même nom
    - elles sont chacunes dans un module portant le même nom "Module1"

    Pour faire rapide, j'ai directement fait la comparaison des deux valeurs de constantes dans ma procédure d'appel.
    Mais il faut au choix :

    - faire un premier test pour voir si le retour de la valeur contient la chaine "ECHEC : ", signifiant qu'il y a eu un problème (module ou constante inexistante)

    - retourner un variant au lieu d'un string dans la fonction : tableau avec en premier élément le nom de la constante ou le message d'échec ... et en second élément un état TRUE ou FALSE pour spécifier si on a récupéré la valeur de la constante ou un message d'echec


    dis moi si cette piste est ce que tu souhaites

    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
    46
      Sub chercheConst()
     
    If Not ValConst(Workbooks("Classeur2"), "un_e2l") = ValConst(ThisWorkbook, "un_e2l") Then
        MsgBox "Les constantes sont différentes"
    Else
        MsgBox "Les constantes sont identiques"
    End If
     
    End Sub
     
     
     
     
    Function ValConst(Classeur As Workbook, NomConstante As String, Optional NomModule As String = "Module1") As String
    ' recherche dans le module "NomModule" du classeur indiqué la ligne de code de déclaration de la Constante
    ' la fonction retournera la valeur de la constante
    Dim LeModule As Object
    Dim i As Long
     
        ' on tente d'instancier le module
        On Error Resume Next
            Set LeModule = Classeur.VBProject.VBComponents(NomModule)
        On Error GoTo 0
     
        ' si ça échoue : message indiquant que le module n'existe pas
        If LeModule Is Nothing Then
            ValConst = "ECHEC : Le Module " & NomModule & " n'existe pas dans le classeur " & Classeur.Name
            Exit Function
        End If
     
        ' au sein du module
        With LeModule.CodeModule
            ' pour chaque ligne de code
            For i = 1 To .CountOfLines
                ' si la ligne est la déclaration de la constante (= le mot clé "Const" suivi d'un espace et du nom de la constante)
                If .Lines(i, 1) Like "*" & "Const " & NomConstante & "*" Then
                    ' on retourne sa valeur et on quitte la procédure
                    ValConst = Split(.Lines(i, 1), """")(UBound(Split(.Lines(i, 1), """")) - 1)
                    Exit Function
                End If
            Next i
        End With
     
        ' si on a pas trouvé : on retourne un message à cet effet
        ValConst = "ECHEC : Constante " & NomConstante & " inexistante dans le classeur " & Classeur.Name & " au sein du module " & NomModule
    End Function

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur acousticien
    Inscrit en
    Septembre 2015
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur acousticien
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2015
    Messages : 122
    Points : 74
    Points
    74
    Par défaut
    Bonjour Antony et merci pour cette réponse rapide !

    Je souhaiterais savoir si il serait possible de pointer plus précisément sur le module d'un classeur en particulier (puisque je veux comparer les constantes de 2 classeurs différents), ma tentative ci-dessous ne fonctionnant pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    OldWb.Activate
    Debug.Print CONSTANTES.un_e2l
    nom = CONSTANTES.un_e2l
     
    CurrentWb.Activate
    Debug.Print CONSTANTES.un_e2l
    MsgBox ("Constante doc1 = " & nom & Chr(10) & "Constante doc2 = " & CONSTANTES.un_e2l)

    EDIT :

    Merci beaucoup joe.levrai pour ce bout de code, je pense que c'est exactement la base qu'il me faut !

  5. #5
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour


    Voici 2 autres methodes:

    'Methode avec Reference

    'Dans Classeur2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Const MyConstant As Integer = 10
    'Outils/Propriete de VBAProject
    'Changer le nom du Projet pour VBAProjectClasseur2


    'Dans Classeur1
    'Avec une reference vers VBAProjectClasseur2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub ttAvecReference()
     MsgBox VBAProjectClasseur2.MyConstant
    End Sub

    'Methode Sans reference

    'Dans Classeur2
    'Dans ThisWorkBook de Classeur2.xlsm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Property Get GetConstant() As Integer
        GetConstant = MyConstant
    End Property
    'Dans Classeur1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub ttSansReference()
     MsgBox Workbooks("Classeur2.xlsm").GetConstant
    End Sub

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

Discussions similaires

  1. Appel de Structure dans une fonction déclarée dans un module
    Par informer dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/07/2015, 17h58
  2. Réponses: 1
    Dernier message: 10/02/2008, 20h13
  3. pointer sur une procédure d'un autre module
    Par jeje22 dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/07/2007, 11h30
  4. Réponses: 3
    Dernier message: 03/05/2007, 11h06
  5. Comment écrire sur une image, dans un cadre ?
    Par Nutrino dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/05/2005, 00h55

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