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 :

[VBA-E] Utilisation dynamique de variables [Trucs & Astuces]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 30
    Points : 20
    Points
    20
    Par défaut [VBA-E] Utilisation dynamique de variables
    Bonjour,

    Je cherche à faire une fonction générique qui en fonction de l'élément passé en paramètre, effectue un certain traitement avec certaine variable.

    Je voudrai donc par exemple lire le contenu de la varialble MaVariable1 en passant le 12 en paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim MaVariable1 as String
    MaVariable1 = "TOTO"
    Dim i as Integer
    i =1
    MsgBox "MaVariable" & i
    Je voudrai que ca affiche "TOTO"

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Points : 733
    Points
    733
    Par défaut
    Solu 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Variables() as Variant
     
    Variables(1) = "TOTO"
    Variables(2) = 21
     
    Msgbox Variables(1) 'Affichera toto
    Solu 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    AfficheVariable("toto") 'Affichera toto
     
    Sub AfficheVariable(Variable as variant)
    Msgbox Variable 
    End Sub
    N'oubliez pas de mettre le

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    Mhhh .. je me suis peut être mal expliqué. En fait je veux faire un traitement générique, passé un paramètre, qui composera le nom de ma variable, et je voudrais ensuite manipuler ma variable. Par 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
    Dim lib_Exemple1_toto = "toto"
    Dim lib_Exemple1_titi = "titi"
    Dim lib_Exemple2_toto = "toto2"
    Dim lib_Exemple2_titi = "titi2"
     
    public sub traitementGenerique(element as String)
     
       msgBox "lib_" & element & "_toto"
       msgBox "lib_" & element & "_titi"
     
    end  sub
     
    call traitementGenerique("Exemple1") ==> affiche "toto" puis "titi"
    call traitementGenerique("Exemple2") ==> affiche "toto2" puis "titi2"
    Je veux manipuler mes variables en passant leur nom en chaine de caractère et non passer par des tableaux.

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Points : 733
    Points
    733
    Par défaut
    J'ai beaucoup cherché sur le net et je ne trouve rien... J'ai essayé en chipottant avec des fonction permettant de donner le type de variable pour voir si il n'y avait pas moyen de connaitre le 'type' d'une variable et faire une boucle qui les affiche toutes par exemple mais je n'y suis pas arrivé une démarche jmfmienne sans doutes lui comprendra lol mais rien a faire... Il aura peu etre une solution mais je n'y arrive pas...

    j'ai trouvé ca : CallByName mais ca ne s'applique pas aux variables...

    Si tu trouve ca m'interesse comme ca au moins je resterai pas idiot
    N'oubliez pas de mettre le

  5. #5
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Attendons donc... attendons... (je connais la réponse depuis plus de 8 ans)...
    Z'êtes curieux, hein ? (elle est la plus simple du monde, pourtant)

  6. #6
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Il s'agit du principe du dictionnaire. On accède à un élément à l'aide d'un clé et non d'un index. Mais ce principe utilise une 'sorte' de tableau comme une Collection :

    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
    Public CollectionDeVariables As New Collection
     
    Public Sub main()
     
        While CollectionDeVariables.Count > 0
            CollectionDeVariables.Remove 1
        Wend
     
        CollectionDeVariables.Add "toto", "lib_Exemple1_toto"
        CollectionDeVariables.Add "titi", "lib_Exemple1_titi"
        CollectionDeVariables.Add "toto2", "lib_Exemple2_toto"
        CollectionDeVariables.Add "titi2", "lib_Exemple2_titi"
     
        traitementGenerique "Exemple1"
        traitementGenerique "Exemple2"
    End Sub
     
    Public Sub traitementGenerique(element As String)
       MsgBox CollectionDeVariables("lib_" & element & "_toto")
       MsgBox CollectionDeVariables("lib_" & element & "_titi")
    End Sub

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    ok ok merci.

    Je pensais plutôt à quelque genre du genre {"MaVarialble"+i}, un peu comme en windev ou php.... mais ca tombe ce n'est pas aussi facile que ca en VB, et qu'on doit passé par le principe de dictionnaire comme l'a expliqué CatBull

    Enfin, bon je vais faire avec ^^

    Je laisse le post ouvert au cas ou d'autre connaisse la solution optimale

  8. #8
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Citation Envoyé par jmfmarques
    Z'êtes curieux, hein ? (elle est la plus simple du monde, pourtant)
    Non, tu nous fait juste perdre notre temps
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  9. #9
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Citation Envoyé par zlavock
    ok ok merci.

    Je pensais plutôt à quelque genre du genre {"MaVarialble"+i}, un peu comme en windev ou php.... mais ca tombe ce n'est pas aussi facile que ca en VB, et qu'on doit passé par le principe de dictionnaire comme l'a expliqué CatBull

    Enfin, bon je vais faire avec ^^

    Je laisse le post ouvert au cas ou d'autre connaisse la solution optimale
    D'un point de vu performance cette solution est plus optimale que celle de {"MaVarialble"+i}. Car avec cette solution tu gères une variable (la collection) alors qu'avec {"MaVarialble"+i} tu dois gérer N variables.

    De plus essaies de mettre en place {"MaVarialble"+i} pour 100 000 éléments tu vas avoir un sacré paquet de variables à déclarer

  10. #10
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Points : 733
    Points
    733
    Par défaut
    Je veux bien la connaitre jmfmarques...
    N'oubliez pas de mettre le

  11. #11
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Non Thierry, je ne fais pas perdre du temps !
    J'ai dit : "je connais la réponse", pas la solution !
    Car la réponse est tout simplement : il n'y a pas de solution, il ne peut y avoir que des subterfuges ....
    Edit :
    Le dernier subterfuge du genre que j'ai mis en oeuvre faisait, si je me rappelle bien, appel à On... GoSub...

    avec, en entrée, une variable du type :
    nomvar1/nomvar2/nomvar3 etc...
    pour déterminer le rang (par rapport au séparateur, du string nomvarx et renvoyer vers un

    sub1 :
    titi = var1 : return
    sub2:
    titi = var2 : return
    .
    .
    .

    sub n:
    titi = varn : return


    et.... utiliser titi comme variable...
    Je me rappelle que c'était là le subterfuge le plus rapide (chrono en mains)...
    Voila !

  12. #12
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    J'en ai une autre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim lib_Exemple1_toto
    Dim lib_Exemple2_toto
    Dim expr As String
     
     
        Set sc = CreateObject("ScriptControl")
        sc.Language = "vbscript"
        sc.ExecuteStatement ("lib_Exemple1_toto = ""toto""")
        sc.ExecuteStatement ("lib_Exemple2_toto = ""toto2""")
     
        For i = 1 To 2
            expr = "lib_Exemple" & i & "_toto"
            Debug.Print sc.Eval(expr)
        Next
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  13. #13
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Pourquoi VB6 uniquement?

    Marche parfaitement en VBA Excel 97...
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  14. #14
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Citation Envoyé par AlainTech
    Pourquoi VB6 uniquement?

    Marche parfaitement en VBA Excel 97...
    Parce que pas testé en VBA (piqué vite fait dans un de mes prog)

    mais comme tu m'y forces, alors je dis :

    Marche aussi parfaitement en VBA Excel 2003

    Je retire le VB6 ...
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  15. #15
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Marche également sans problème sous VB5 et Win 2000

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    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
    Sub ParamètreEnvoyer()
    Collection_Remplir "Et alors ? ", "C'est ", "quoi ", "ton problème ?", 5
    End Sub
     
    Sub Collection_Remplir(Paramètre1, paramètre2, paramètre3, Paramètre4, paramètre5)
     Dim MaColect  As New Collection
        ' Rempli la collection
        MaColect.Add Paramètre1, "Un"
        MaColect.Add paramètre2, "Deux"
        MaColect.Add paramètre3, "trois"
        MaColect.Add Paramètre4, "Quatre"
        MaColect.Add paramètre5, "Cinq"
        'Affichage
        Debug.Print MaColect("Un") & MaColect("Deux") & MaColect("trois") & MaColect("Quatre")
        MsgBox MaColect("Un") & MaColect("Deux") & MaColect("trois") & MaColect("Quatre") & " " & MaColect("Cinq")
        'ou
        MsgBox MaColect(1) & MaColect(2) & MaColect(3) & MaColect(4) & " " & MaColect(5)
     
    End Sub
    Un truc comme ça te conviendrait-il ? Juste une alternative

    A+

Discussions similaires

  1. [VBA-E] - Utilisation d'une variable avec la propriete offset
    Par ekynoxx dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/05/2007, 18h31
  2. [VBA]comment utiliser des Variables avec Underscore ( _ )
    Par Oceliane dans le forum VBA Access
    Réponses: 4
    Dernier message: 12/04/2007, 17h02
  3. [VBA-E]Utiliser une variable dans une formule
    Par bossu dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 04/06/2006, 15h25
  4. [VBA-E] Utiliser le range dans un tab croisé dynamique
    Par GoLDoZ dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/03/2006, 16h12
  5. [VBA] excel croisé dynamique et plage de données variables
    Par totoche dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 04/01/2006, 18h14

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