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 de données associées en tant que constantes publiques


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué Avatar de conconbrr
    Inscrit en
    Février 2006
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 198
    Points : 198
    Points
    198
    Par défaut Déclaration de données associées en tant que constantes publiques
    Bonjour,

    Dans tous mes projets VBA je crée toujours un module de déclaration de constantes, qui me servent entre autre pour donner des noms à mes cellules Excel, et pour avoir des informations sur des tableaux de mes onglets.

    Exemple j'ai un tableau à 3 colonnes dans un onglet, je vais alors déclarer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public const C1_Cel1Tab as string = "Nom de la cellule en haut à gauche du tableau (c'est pour me repérer)"
    Public const DCOL_Col1Tab as long = 0 (Décalage pour accéder à la première colonne, bien entendu je mets des noms explicites sinon ça ne sert à rien ;))
    Public const DCOL_Col2Tab as long = 1
    Public const DCOL_Col3Tab as long = 2
    Public const NBCOL_Tab as long = 2
    ... J'ai encore d'autres infos constantes associées au tableau mais je vais pas rentrer dans les détails
    Cette solution marche très bien et est pratique (je vois tous mes tableaux d'un coup d'oeil, et dans le code je peux accéder à mes colonnes, ou au nombre de colonnes... de manière intuitive. J'aimerais cependant l'améliorer...

    J'ai envisagé la solution de mais d'après ce que j'ai vu on ne peut utiliser que des données numériques, hors j'aimerais aussi stocker des chaînes de caractères voir des tableaux array.

    En fait il me faudrait exactement quelque chose du type Enum mais pour tout les types de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public enum tab1
         c1="première cellule"
         col1=0
         col2=1
         col3=2
         nbcol=2
         centre=array(true,false,true)
    end enum
    Le bout de code ci-dessus serait vraiment l'idéal si seulement il marchait...

    Mercide vos suggestions!

  2. #2
    Membre habitué Avatar de conconbrr
    Inscrit en
    Février 2006
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 198
    Points : 198
    Points
    198
    Par défaut
    En cherchant un peu j'ai trouvé le post de qqun qui avait le même problème que moi. Malheureusement pour moi il programme en VB et du coup qqun lui a proposé la solution suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Structure MySecondGroup 
     
        Const Value1 = "thePath1"
        Const Value2 = "thePath2"
        Const Value3 = "thePath3"
     
    End Structure
    Y-a-t-il un équivalent de l'instruction Structure en VBA?

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Bonjour,

    Tu peux déclare un type de donnée personnalisé avec Type mais cela ne permet pas d'utiliser des constantes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Type Tableau
        Nom As String
        NbColonnes As Long
        NbLignes As Long
    End Type
    Il faut donc initialiser les variables avec les valeurs désirées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub Init()
        Dim MonTableau As Tableau
        With MonTableau
            .NbColonnes = 10
            .NbLignes = 100
            .Nom = "Données"
        End With
    End Sub
    Cordialement,

    Tirex28/

  4. #4
    Membre habitué Avatar de conconbrr
    Inscrit en
    Février 2006
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 198
    Points : 198
    Points
    198
    Par défaut
    Merci de la réponse!

    Malheureusement, cette solution ne me convient pas vraiment pour deux raisons:

    - Avec la création du type personnalisé, je suis obligé de créer une procédure qui va affecter les valeurs à chaque tableau, je perds alors le principe de constantes globales, même si à la limite je peux définir mes tableaux personnalisés en tant que variable publique

    - Le second point qui est le plus important, c'est qu'avec cette solution je ne peux pas avoir des tableaux ayant des nombres de colonnes différents. Il faudrait que je crée un type pour les tableaux à 1 colonne, un pour ceux à 2 colonnes...

    La solution reste valable, mais les deux points ci-dessus en réduisent un peu son efficacité.
    J'ai malheureusement la forte impression qu'il n'existe pas de solution parafaitement adaptée à mon problème, je vais donc devoir bidouiller un truc...

    Je ne mets pas encore le post en "Résolu", j'attends quelques jours pour avoir d'autres propositions!

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Bonjour,

    - Le second point qui est le plus important, c'est qu'avec cette solution je ne peux pas avoir des tableaux ayant des nombres de colonnes différents. Il faudrait que je crée un type pour les tableaux à 1 colonne, un pour ceux à 2 colonnes...
    Rien ne t'empeche de déclarer un tableau de type.

    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
    Public Type Tableau
        Nom As String
        NbColonnes As Long
        NbLignes As Long
    End Type
     
    Public MesTableaux(1 To 2) As Tableau
     
    Sub Init()
        With MesTableaux(1)
            .NbColonnes = 10
            .NbLignes = 100
            .Nom = "Données"
        End With
        With MesTableaux(2)
            .NbColonnes = 20
            .NbLignes = 200
            .Nom = "Rapport"
        End With
    End Sub
     
    Sub test()
        MsgBox MesTableaux(1).NbColonnes
    End Sub
    Cordialement,

    Tirex28/

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

    j'ai du mal à comprendre l'intérêt d'utiliser des variables globales et des enum alors que l'objet Range() est fait pour ça ...
    Qu'est-ce que tu fais que Range() ne sait pas faire ?
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  7. #7
    Membre habitué Avatar de conconbrr
    Inscrit en
    Février 2006
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 198
    Points : 198
    Points
    198
    Par défaut
    Hello,

    j'ai du mal à comprendre l'intérêt d'utiliser des variables globales et des enum alors que l'objet Range() est fait pour ça ...
    Qu'est-ce que tu fais que Range() ne sait pas faire ?
    Je ne vois pas bien le rapport avec les objets range...
    Je vais développer un peu plus mon organisation (on ne sait jamais si ça se trouve je m'organise comme un manche ):

    Imaginons un onglet sur lequel on trouve un tableau comportant trois colonnes, par exemple concernant une liste de points:
    • Colonne d'abscisse X
    • Colonne d'ordonnée Y
    • Colonne de couleurs des points (je dis ça au pif hein c'est pour l'exemple...)


    Ce tableau a bien sûr une ligne d'en-tête X Y couleur.
    L'en-tête X est contenu dans la cellule "A1".

    Je pourrais faire référence à la troisième ligne des ordonnées de mon tableau de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets(1).range("A1").offset(1,3).value
    Cependant je ne trouve ça ni pratique ni pérenne.

    Sur la question de la praticité, je préfère avoir des noms qui veulent dire qqch à la place de "A1" où de la colonne 1, du coup en définissant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public const C1_Pts as string = "A1"
    public const DCOL_YPts as long = 1
    je peux alors écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets(1).range(C1_Pts).offset(DCOL_YPts,3).value
    (Je précise qu'en vrai mes pages ont aussi des noms, et que je donne des noms à mes cellules Excel)

    Pour la pérennité, ma méthode me semble également utile. Imaginons qu'on rajoute une colonne avant celle de la couleur, par exemple le type de points, à ce moment là il me suffira de changer dans mes constantes globales la valeur de DCOL_YPts, et je n'aurais pas à toucher au reste du code...

    Bon c'est un peu dur à expliquer textuellement et j'ai fait très bref mais ça donne une idée de ce que je fais je pense.

    Mon objectif actuel est de synthétiser toutes les informations constantes associées à un tableau de façon plus compacte.
    Ci-dessous un exemple de code issu d'une de mes applis:

    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
    '====> Premières cellules de tableaux
        Public Const ISCc1_DonImp_C1 As String = "ISC_DonImp_C1"
     
    '====> Organisation des tableaux
     
        ' Données d'import
        Public Enum DonImp
            dcolNoms = 0
            dcolNbCar = 1
            dcolNoCol = 2
            dcolNoLig = 3
            ivbNoms = dcolNoms + 1
            ivbNbCar = dcolNbCar + 1
            ivbNoCol = dcolNoCol + 1
            ivbNoLig = dcolNoLig + 1
            NbCol = 4
        End Enum
        Public Const INFOS_DonImp As String = "True,True,False,False"
    J'aimerais utiliser une instruction du type Enum, mais qui marche aussi pour les string, et encore mieux pour des tableaux array, ce qui me premettrait d'écrire plus intuitivement mon code (et qu'il soit également plus clair), et dans l'idéal j'aimerais transmettre toutes les infos associées à un tableau à une sous-procédure de manière simple.

    Pour Tirex28:

    Mon problème n'est pas de déclarer plusieurs tableaux, mais que je vais avoir des tableaux ayant un nombre de données associées différentes. Exemple:

    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
    Public Type Tableau1
        Nom As String
        Col1 As Long
        NbCol As Long
    End Type
    Public Type Tableau2
        Nom As String
        Col1 As Long
        Col2 as Long
        NbCol As Long
    End Type
     
    Sub Init()
        With MesTableaux1
            .NbCol = 1
            .dcolCol1 = 0
            .Nom = "Données"
        End With
        With MesTableaux2
            .NbCol = 2
            .dcolCol1 = 0
            .dcolCol2 = 1
            .Nom = "Rapport"
        End With
    End Sub
    J'espère avoir été plus clair...?

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

    et comme ça ?

    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
    Public Type type_Tableau
         c1 As String
         cols() As Long
         nbcol As Long
         centre() As Boolean
    End Type
     
    Sub bidule()
     
    Dim monObjet As type_Tableau
     
    With monObjet
        .c1 = "A1"
        ReDim .cols(5)
        .nbcol = 5
        ReDim .centre(3)
            .centre(1) = False
            .centre(2) = True
            .centre(3) = False
    End With
     
    End Sub
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  9. #9
    Membre habitué Avatar de conconbrr
    Inscrit en
    Février 2006
    Messages
    198
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 198
    Points : 198
    Points
    198
    Par défaut
    Hello cafeine,

    Ca pourrait être qqch qui approche de la solution (je vais y réfléchir). Le seul souci (je sais j'en demande beaucoup ), c'est que j'aurais aimé que les variables de colonnes aient à chaque fois des noms différents et pas toujours le même nom générique du type col(1), col(2)...

    Ca permettrait quand on écrit le code d'avoir des propositions de colonnes compréhensibles (je sais que je veux me référer à la colonne des ordonnées, mais je ne connaîs pas forcément le numéro de la colonne), et à la relecture de comprendre plus intuitivement à la colonne à laquelle on se réfère.

    Je crois que je rêve un peu là mais bon on sait jamais

    Pour conclure je crois que j'ai fini par identifier exactement mes besoins (grâce à vos réactions!):
    • Je veux définir des propriétés associées à des tableaux Excel sous forme de constantes globales
    • Ces propriétés devraient être groupées de manière "compacte", de manière à être transférés intégralement à une sous-procédure en une seule variable (cette variable "globale" serait donné par exemple à une sous-procédure valable pour tous les tableaux Excel, qui grâce aux infos qu'elle contient pourrait traiter le bon tableau avec les bonnes données...)


    Merci beaucoup de vos propositions, n'hésiter pas à continuer, ça me fait progresser

  10. #10
    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
    ok, tant mieux si nous avons pu t'aider, quand je lis ton post je me dis que tu devrais regarder du côté des classes.
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



Discussions similaires

  1. Réponses: 0
    Dernier message: 05/03/2009, 19h23
  2. Active Directory en tant que base de données
    Par azad_892000 dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 16/10/2007, 18h08
  3. Réponses: 2
    Dernier message: 05/02/2007, 11h12
  4. [FTP] Définir une variable en tant que constante
    Par Anduriel dans le forum Langage
    Réponses: 2
    Dernier message: 15/01/2006, 11h39

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