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 une constante depuis des cellules [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 81
    Points : 68
    Points
    68
    Par défaut Créer une constante depuis des cellules
    Bonjour à tous,
    Mon nouveau problème du moment est le suivant:
    Afin de rendre ma macro paramétrable sans pour autant rentrer dans le code, je souhaite créer des constantes à partir de cellules.
    Exemple:
    J'ai ma feuille Excel avec les cellules suivantes:
    A1: NomConstante1 B1: ValeurConstante1
    A2: NomConstante2 B2: ValeurConstante2
    etc...
    • Est-il possible de créer une constante qui a pour nom "NomConstante1" et valeur "ValeurConstante1", et ainsi de suite?
    • Deuxième possibilité, est il possible de renommer le nom d'une constante? Je prévoierai alors des noms génériques (ex: "NomGenerique1" et je renommerai cette constante en "NomConstante1")

    Merci d'avance!

  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 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 629
    Points : 34 334
    Points
    34 334
    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 :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

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

    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
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut MiXinG
    Afin de rendre ma macro paramétrable sans pour autant rentrer dans le code, je souhaite créer des constantes à partir de cellules.
    Chez moi, une constante qui change... est une variable, mais ce n'est qu'une habitude .
    Est-il possible de créer une constante qui a pour nom "NomConstante1" et valeur "ValeurConstante1", et ainsi de suite?
    Pas sûr de comprendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim NomConstante1
    NomConstante1 = sheets("Feuil1").[A1]
    Tu peux aussi nommer la cellule A1, NomConstante1 et faire référence à Range("NomConstante1")
    Deuxième possibilité, est il possible de renommer le nom d'une constante? Je prévoierai alors des noms génériques (ex: "NomGenerique1" et je renommerai cette constante en "NomConstante1")
    Euh... t'as pas d'autre méthode pour te faire des noeuds aux boyaux de la tête ? Pourquoi ne pas créer une deuxième variable, faisont référence à la même cellule ?
    A+

  4. #4
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 81
    Points : 68
    Points
    68
    Par défaut
    Bonjour!
    Merci pour vos réponses je vais aller regarder les liens que tu m'as mis jpcheck.

    Gorfael:
    Bon d'accord je suis loin d'être un expert en VBA mais quand même...

    Le faire dans le code c'est facile, moi ce que je souhaiterais c'est en gros écrire du code dans une macro en utilisant le contenu de cellules et à partir de la macro elle-même.

    Exemple:
    Si ma cellule A1 a pour valeur "NomConstante", est il possible de créer une constante (à partir d'une macro) dont le nom serait "NomConstante", en utilisant la référence à la cellule A1, de manière automatique?

    Je sais que ça ne fonctionne mais l'algorithme ressemblerait à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Entier i = 1
    Tant que (range (A&i) <> "")
         Public Const Range(A&i).Value As String = range(B&i).Value
    Fin Tant que
    Celà me permettrait de déclarer mes constantes depuis une feuille Excel. Ce n'est pas obligé que ce soit des constantes ça peut être des variables ().
    Voilà j'espère que c'est plus clair.

  5. #5
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    public const ...
    n'accepte pas cette syntaxe variabilisée.

    je te préconise :

    • nommer tes cellules (plus facile d'y référer par la suite)
    • utiliser le code gorfael


    et enfin

    • il reste la solution tordue de faire écrire un module de code par VBA, mais dans quel intérêt ?

    tu trouveras tout ici
    http://silkyroad.developpez.com/VBA/VisualBasicEditor/
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  6. #6
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 81
    Points : 68
    Points
    68
    Par défaut
    Merci, je vais aller voir ça.

    Pour la syntaxe variabilisée c'est justement la question, est ce qu'il existe un moyen de faire un équivalent à cette syntaxe?

    Nommer les cellules est une possibilité effectivement, je vais étudier cette possibilité

    La méthode de gorfael ne peut être appliquée parce que le but est d'éviter que l'utilisateur aille dans le code de la macro. D'où l'automatisation du codage à partir de cellules.

    La solution tordue me plait pas mal , je vais aller voir ça

    L'intérêt est de faire qu'un utilisateur du fichier n'ait pas besoin d'aller dans le code, créer des variables ou des constantes etc...
    Il a juste à remplir deux colonnes et la génération du code est automatique. Ça peut être assez utile dans le cas où les utilisateurs n'ont pas d'expérience en programmation.

    Tu vois ce que je veux dire?

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut MiXinG et le forum
    Je reste très sceptique : faire écrire du code de manière automatique demande la construction d'un algorythme plus qu'élaboré. Et espérer que des personnes n'ayant aucune notion de programmation crée un algorythme en ayant des limites inférieures aux capacités de VBA .

    Mais même avec des lunettes, je ne vois pas du tout ton but. Mais c'est pas grave, l'important, c'est que toi tu le voies.
    A+

  8. #8
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 81
    Points : 68
    Points
    68
    Par défaut
    C'est vrai que c'est ambitieux mais pourquoi pas

    Et espérer que des personnes n'ayant aucune notion de programmation crée un algorythme en ayant des limites inférieures aux capacités de VBA
    J'ai pas compris ce que tu as voulu dire

  9. #9
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 81
    Points : 68
    Points
    68
    Par défaut
    Bonjour à tous,
    Je pose au cas ou ça aiderait quelqu'un.

    Le code ci dessous suppose:
    • Que la case "Déclaration des variables obligatoire" (Outils/Options , dans VBA) ne soit pas cochée
    • Que la feuille Excel de déclaration des variables respecte la disposition du fichier joint

    Première procédure : "InitialiserConstantes"
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    '*************************************************************************
    '
    '   Méthode: InitialiserConstantes
    '   Résultat : Aucun.
    '   Description: Permet d'initialiser les collections de constantes. Attention:
    '                Pour que cela fonctionne il faut que
    '                                       En A1 on ait la valeur du nombre de constantes précédemment initialisé (mettre à 0 si c'est la première utilisation)
    '                                       Dans la colonne C on ait le type des constantes ("Integer" ou "String" ou "Single")
    '
    '       Argument(s):
    '    nomFeuille (String) = Nom de la feuille dans laquelle se trouvent les données
    '    langage (String) = Langage des constantes ("FR" ou "EN")
    '*************************************************************************
    Public Sub InitialiserConstantes(nomFeuille As String, Optional Langage As String = "FR")
     
    Dim derniereLigne As Integer, i As Integer, Nom As String, typeConstante  As String
    Set Constantes_Nom = New Collection
    Set Constantes_Valeur = New Collection
    Set Constantes_Type = New Collection
     
    Worksheets(nomFeuille).Activate
    derniereLigne = Range("A65536").End(xlUp).Row
    For i = 2 To derniereLigne Step 1
        If ((Range("A" & i).Value = "") Or (Range("B" & i).Value = "") Or (Range("C" & i).Value = "") Or (Range("D" & i).Value = "")) Then
            MsgBox ("Le nom, la valeur ou le type d'une constante est vide. Veuillez remplir la case correspondante (Ligne: " & i & " ).")
            Exit Sub
        Else
    '    On Error GoTo TypeNonCorrect
        typeConstante = Range("D" & i).Value
            Select Case Langage
                Case "FR"
                    Select Case typeConstante
                            Case "Integer"
                        Constantes_Valeur.Add (CInt(Range("B" & i).Value))
                            Case "Single"
                        Constantes_Valeur.Add (CSng(CStr(Range("B" & i).Value)))
                            Case Else
                        Constantes_Valeur.Add (CStr(Range("B" & i).Value))
                    End Select
                Case "EN"
                    Select Case typeConstante
                            Case "Integer"
                        Constantes_Valeur.Add (CInt(Range("C" & i).Value))
                            Case "Single"
                        Constantes_Valeur.Add (CSng(CStr(Range("C" & i).Value)))
                            Case Else
                        Constantes_Valeur.Add (CStr(Range("C" & i).Value))
                    End Select
            End Select
            Constantes_Nom.Add (Range("A" & i).Value)
            Constantes_Type.Add (Range("D" & i).Value)
        End If
    Next
    Call AjouterCode(nomFeuille)
    Worksheets("Pilote_Reporting_OWB").Activate
    Exit Sub
     
    TypeNonCorrect:
        Select Case typeConstante
     
            Case "Integer"
            MsgBox ("La valeur d'une constante ne correspond pas à un Entier. Veuillez corriger la case correspondante ( B" & i & " ).")
            Exit Sub
            Case "Single"
            MsgBox ("La valeur d'une constante ne correspond pas à un Single. Veuillez corriger la case correspondante ( B" & i & " ).")
            Exit Sub
            Case "String"
            MsgBox ("Une erreur est apparue, veuillez vérifier les constantes." & i - 1)
            Exit Sub
        End Select
    End Sub
    Seconde procédure: "EcrireCode"
    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
    '*************************************************************************
    '
    '   Méthode: AjouterCode
    '   Résultat : Aucun.
    '   Description: Permet d'ajouter le code au module souhaité. Cela nécessite une initialisation des collections
    '
    '       Argument(s):
    '    nomModule (String) = Nom du module dans lequel insérer le code(nécessite que la première ligne du code soit "Option Explicit")
    '*************************************************************************
    Sub AjouterCode(Optional nomModule As String = "Constantes")
     
        Dim LignesDeCode As String, i As Integer, typeConstante As String
        LignesDeCode = ""
     
        For i = 1 To Constantes_Nom.Count Step 1
            typeConstante = Constantes_Type(i)
     
            Select Case typeConstante
     
                Case "Integer"
                    LignesDeCode = LignesDeCode & "Public Const " & Constantes_Nom(i) & " As Integer = " & Constantes_Valeur(i) & vbCrLf
     
                Case "Single"
                    LignesDeCode = LignesDeCode & "Public Const " & Constantes_Nom(i) & " As Single = " & Constantes_Valeur(i) & vbCrLf
     
                Case "String"
                    LignesDeCode = LignesDeCode & "Public Const " & Constantes_Nom(i) & " As String = " & """" & Constantes_Valeur(i) & """ " & vbCrLf
     
            End Select
        Next i
     
     
    With ThisWorkbook.VBProject.VBComponents(nomModule).CodeModule
        .DeleteLines 2, Range("A" & 1).Value
        .InsertLines 2, LignesDeCode
        .DeleteLines Constantes_Nom.Count + 2
    End With
     
    Worksheets("Constantes").Activate
    Range("A" & 1).Value = Constantes_Nom.Count
     
    End Sub
    Même si ça parait tordu, c'est très utile. Je m'en sers notamment pour gérer la langue des constantes, et que d'autres utilisateurs modifient simplement les constantes sans aller mettre le nez dans le code!
    Images attachées Images attachées  

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

Discussions similaires

  1. Créer une wxBitmap depuis des données
    Par atm0sfe4r dans le forum wxWidgets
    Réponses: 11
    Dernier message: 09/04/2009, 09h36
  2. [PHP-JS] Comment créer une boucle avec des headers
    Par djinnwatcher dans le forum Langage
    Réponses: 10
    Dernier message: 17/07/2006, 15h48
  3. Créer une liste avec des noms de fichiers
    Par Jeffboj dans le forum Access
    Réponses: 5
    Dernier message: 12/05/2006, 05h48
  4. [CVS] Créer une branche depuis Eclipse
    Par leminipouce dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/01/2006, 10h59
  5. Créer une vue avec des requêtes UNION ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/04/2005, 12h37

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