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 :

Variable Dynamique en VBA pour Débutant


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Variable Dynamique en VBA pour Débutant
    Bonjour a tous
    Et tout d'abord merci a cette communauté pour l'aide apportée

    Voici mon soucis, je connais un peu la prog en php et je sais qu'il est possible dans ce langage de créer des variables dynamiques, dont le nom change en fonction d'une valeur incrementée par exemple.
    Aprés des recherches infructueuses sur google et sur votre forum (j'ai vu des choses qui semblait proche de mon pb...mais je ne l'ai ai pas vraiment compris ) je ne vois que cette bouteille a la mer a vous lancer.

    Je cherche a faire qq chose sur VBA dans ce genre...Mais marche pO

    Je voudrait faire des "rechercher/remplacer" dans une feuille excel de facon dynamique (par l'intermediaire d'un "while" ou d'un "for") en fonction de la valeur incrémentée :

    Ci dessous un exemple de ce que je cherche a faire et qui (je le sais) ne marche pas:



    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
    Dim Titre1, Titre2, Titre3 As String
    Dim Newtitre1, Newtitre2, Newtitre3 As String
    Dim i As Integer
    
    Titre1 = "COL1"
    Titre2 = "COL2"
    Titre3 = "COL3"
    
    Newtitre1 = "NEWCOL1"
    Newtitre2 = "NEWCOL2"
    Newtitre3 = "NEWCOL3"
    
    For i = 1 To 3
        Cells.Find(What:="Titre" & i, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=False).Activate
        ActiveCell.Replace What:="Titre" & i, Replacement:="Newtitre" & i, LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
    Next i
    donc plus simplement je souhaite savoir comment faire pour que mon "Titre" & 1 soit considéré comme ma variable Titre1 et donc considéré comme COLS1

    Facile non !!

    J'espere etre assez clair dans mon explication.Merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 95
    Points : 99
    Points
    99
    Par défaut
    Salut,

    j'ai eu le même genre de problème il y a peu et j'ai utilisé une méthode efficace (bien que pas très jolie en programmation).

    Tu crées 2 tableaux de string à 3 cases: Titre et newtitre. Et tu remplis les cases avec les valeurs. Ensuite, tu accèdes au contenu des cases grâce à ta boucle.

    A tester...
    S'il n'y a pas de solution c'est qu'il n'y pas de problème (proverbe shadok)

  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 utiliser un tableau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Dim Titres()
     
        Titres = Array("Col1", "Col2", "Col3")
        'L'index du 1er element est egal à 0
     
        For i = 1 To 3
            Cells.Find(What:=Titres(i - 1), After:=ActiveCell, LookIn:=xlFormulas, LookAt _
                :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
                False, SearchFormat:=False).Activate
        Next
    Cordialement,

    Tirex28/

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Hello a tous.

    Merci pour ces deux réponses je test ca asap et je vous dis

    Par contre si qq connait une méthode pour l'utilisation de "variable dynamique" je suis preneur"...

    Merci d'avance a tous.

    TchO

  5. #5
    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
    Un petit coup d'oeil à la méthode Evaluate...
    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!

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

    Comprend pas..
    Un petit coup d'oeil à la méthode Evaluate...
    Ca marche pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub evaluation()
        Dim Titre1 As String, i As Integer
        Titre1 = "COL1"
        i = 1
        MsgBox Evaluate("Titre" & CStr(i))
    End Sub
    Cordialement,

    Tirex28/

  7. #7
    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
    Regarde , tu as tout en détail.
    Tu peux aussi te créer tes variables de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Collection_Créer()
     Dim MaCollect  As New Collection
        ' Rempli la collection
        MaCollect.Add "Et alors ? ", "Un"
        MaCollect.Add "C'est ", "Deux"
        MaCollect.Add "quoi ", "trois"
        MaCollect.Add "ton problème ?", "Quatre"
        'Affichage
        MsgBox MaCollect("Un") & MaCollect("Deux") & MaCollect("trois") & MaCollect("Quatre")
    End Sub
    En remplaçant "Un", "Deux", etc., par le nom que tu souhaites leurs donner, tu as autant de variables que tu veux. Pour les utiliser, tu mets simplement MaCollect(LeNom)

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Bonjour à tous,

    Le systéme de l'array fonctionne bien.....

    Par contre comme demandé au dessus, je reste preneur pour une leçon sur la variable dynamique.
    Donc je ne met pas résolu tout de suite ... j'attend 2 jours et aprés je clot mon post.

    Encore merci à tous.

    TchO

  9. #9
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Dim MaCollect As New Collection
    ' Rempli la collection
    MaCollect.Add "Et alors ? ", "Un"
    MaCollect.Add "C'est ", "Deux"
    MaCollect.Add "quoi ", "trois"
    MaCollect.Add "ton problème ?", "Quatre"
    'Affichage
    Juste une question concernant le Collection, est un genre de array car je vois que tu met dans les MaCollect.Add, un genre d'index "un", "deux", ...

    Je sais je pourrais me renseigner en cherchant partout sur le net la définition du collection...Mais c'est tellement mieux de demander a des pro comme vous ( )


    Merci d'avance.

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


    En remplaçant "Un", "Deux", etc., par le nom que tu souhaites leurs donner, tu as autant de variables que tu veux.
    Tableaux ou collection c'est le meme combat. Mais ca ne permet pas au programme de reconnaitre une chaine de caractere comme étant une variable et par voie de conséquence de retourner une valeur associée à cette chaine de caractère.

    La méthode Evaluate est, je crois, limité à la conversion de chaine type "A1" en réference vers la cellule A1. Et si elle peut faire ce que demande hevy75 dans son post initial je serais curieux de voir comment.

    Cordialement,

    Tirex28/

  11. #11
    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
    Citation Envoyé par hevy75 Voir le message
    Juste une question concernant le Collection, est un genre de array car je vois que tu met dans les MaCollect.Add, un genre d'index "un", "deux", ...
    Oui, dans l'exemple que je te donne, il est possible de donner à cet index le nom que tu veux. Par contre, tu es contraint d'utiliser la collection.
    Citation Envoyé par tirex28
    Tableaux ou collection c'est le meme combat. Mais ca ne permet pas au programme de reconnaitre une chaine de caractere comme étant une variable et par voie de conséquence de retourner une valeur associée à cette chaine de caractère.
    Pas tout à fait : L'avantage incontestable d'une collection par rapport à un tableau est que l'index "nommé" est tout de même plus parlant qu'un N°
    Si je te dis MaVal = Tableau(125), si tu n'as pas le tableau sous les yeux, t'es marron... Par contre, si tu fais MaVal = MaCollect("CoucouCémoi") j'espère que tu sais à quoi correspond "CoucouCémoi"

    Edit
    Tu veux un exemple qui montre que tu peux utiliser le nom comme variable ?
    Je reprends mon exemple précédent. Teste ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        LeMot = "un"
        MsgBox MaCollect(LeMot)
    A+

  12. #12
    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
    Re,

    Ce que je voulais dire c'est que tableaux ou collection ne sont que des facons biaisés de créer des "variables dynamiques". Chaque methode présente des avantages et des inconvénients.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       MaCollect.Add "Et alors ? ", "Un"
     
        LeMot = "un"
     
        MsgBox MaCollect(LeMot)
    Dans ton exemple, la chaine "un" est la valeur de la clé utilisé pour identifier un objet dans une collection. La clé elle-meme est une propriété d'un élément de la collection au même titre que son index. Tu utilise ensuite une variable (LeMot) pour stocker la valeur de cette propriété, et enfin pour accéder à l'élément correspondant.

    Essaye maintenant de faire reconnaitre la variable LeMot par une operation de concaténation telle que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Msgbox MaCollect("Le" & "Mot")
    Ca m'etonnerait que tu obtienne "Et alors ?"

    Pour faire une analogie avec un tableau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim x As long
    Tableau(x)=1
    n'est pas equivalent à

    et pourtant Chr(120) renvoie bien x, mais ce x n'est qu'une chaine de caractere, pas une variable.

    Ma conclusion est qu'une variable ne peut pas etre construite et interprétée dans le code, on ne peut l'utiliser que tel qu'on l'a défini au moment de la déclaration.

    Et c'est ce qui m'a fait réagir au post d'Alain.

    Sommes nous d'accord?

    Cordialement,

    Tirex28/

  13. #13
    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
    Citation Envoyé par tirex28
    Essaye maintenant de faire reconnaitre la variable LeMot par une operation de concaténation telle que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Msgbox MaCollect("Le" & "Mot")
    1 - Ca m'etonnerait que tu obtiennes "Et alors ?"

    Pour faire une analogie avec un tableau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim x As long
    Tableau(x)=1
    2 - n'est pas equivalent à

    et pourtant Chr(120) renvoie bien x, mais ce x n'est qu'une chaine de caractere, pas une variable.
    On ne peut pas créer de variable dynamique avec VBA. Donc, on indique à hevy75 une manière permettant d'utiliser une collection pour pallier à cette lacune.
    On offre une solution. hevy75 en fera ce qu'il voudra. Mais peut-être cela résoudra-t-il son problème (?!?)

    Par contre, je souhaiterais tout de même répondre à tes deux exemples.

    1 - On ne peut pas faire ce que tu fais mais on peut parfaitement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LeMot = "u" & "n"
    MsgBox MaCollect(LeMot)
    2 - Ton "x" est une chaîne de caractères pas un numéro or pour pouvoir être relus les tableaux ont besoin d'un index correspondant à celui utilisé pour les renseigner.
    En outre tu reparts dans les tableaux pas dans les collections parce qu'avec les collections, rien ne devrait t'empêcher de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaCollect.Add "Et alors ? ", chr(120)
    puis d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Msgbox MaCollect(chr(120))
    D'où l'intérêt de la collection

  14. #14
    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
    Bonsoir,

    On ne peut pas faire ce que tu fais mais on peut parfaitement faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LeMot = "u" & "n"
    MsgBox MaCollect(LeMot)
    Et on peut egalement faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x=1+2
    Msgbox Tableau(x)
    Concatener des chaines pour obtenir une cle ou additionner des chiffres pour obtenir un index c'est a peu pres le meme processus. Je ne suis ni pro-tableau ni anti-collection, les deux approches permettent à l'exécution de stocker un nombre de valeur indéterminé à la conception. Savoir si l'une est meilleur que l'autre est un autre débat qu'il convient de trancher en fonction du contexte, des objectifs et accessoirement des préférences de chacun.

    Tirex> Ma conclusion est qu'une variable ne peut pas etre construite et interprétée dans le code
    Ouskelnor> On ne peut pas créer de variable dynamique avec VBA.
    Nous sommes donc d'accord.

    Au plaisir de te lire,

    Tirex28/

  15. #15
    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
    Citation Envoyé par ousk'
    L'avantage incontestable d'une collection par rapport à un tableau est que l'index "nommé" est tout de même plus parlant qu'un N°
    ... en cas de besoin et dans la mesure où tu as absolument besoin de créer une variable dynamique.

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

Discussions similaires

  1. [XL-2010] Langage vba pour débutant ?
    Par willoweiss dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/10/2012, 10h12
  2. Cours VBA pour débutant
    Par tariqfcb dans le forum Général VBA
    Réponses: 1
    Dernier message: 17/07/2008, 12h47
  3. Menu dynamique en VBA pour Access 2003
    Par petitbison dans le forum VBA Access
    Réponses: 4
    Dernier message: 25/04/2008, 14h22
  4. Masquer des items pour une variable d'un tableau croisé dynamique en VBA
    Par Pietro_L dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/10/2007, 16h35
  5. [VBA-A] VBA pour débutant
    Par a2line dans le forum VBA Access
    Réponses: 2
    Dernier message: 22/05/2006, 14h51

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