Créer une variable avec nom dynamique [Résolu]

Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009
- - Dernière réponse : pjouy
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009
- 23 juin 2006 à 21:29
Bonjour,

Je voudrais créer une variable qui aurait un nombre dynamique, par exemple :
Colonne1, Colonne2, Colonne3, etc.
Je pense qu'il faut utiliser quelque chose comme Colonne(i), mais je n'ai aucune idée de la manière dont je peux coder ça. De plus, je ne sais pas quoi taper comme mot de recherche.

Merci beaucoup pour votre aide.
Pascal
Afficher la suite 

19 réponses

Meilleure réponse
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
44
3
Merci
Salut,

Essaie ceci pour voir si cela t'aide un peu

Dim i As Integer 
Dim Colonne() As String 
Dim ColonneSurUneLigne() As String 

ReDim Colonne(0) 
i =  1 
Do While Not  EOF (1) 
    Line Input #1, Texte             'Récupere la ligne dans texte
    ColonneSurUneLigne  = Split(Texte, ";")   'Split de la ligne avec ; comme délimiteur

    For i =   LBound (ColonneSurUneLigne) To UBound(ColonneSurUneLigne) 
        ReDim Preserve Colonne(UBound(Colonne) + 1)    
        'rempli Colonne avec les colonnes trouvees sur le ligne
        Colonne(UBound(Colonne))  = ColonneSurUneLigne(i) 
    Next 

Loop 

For i = 1 To UBound(Colonne) 
    Call MsgBox(Colonne(i)) 
Next 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 110 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jrivet
Messages postés
55
Date d'inscription
lundi 14 novembre 2005
Statut
Membre
Dernière intervention
23 juin 2008
0
Merci
Salut,

Et un tableau dynamique ?

Genre : Redim Tableau(x)
Commenter la réponse de cs_molo molo
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009
0
Merci
Salut,

Je ne sais pas l'utiliser non plus.
J'avais dans l'idée de faire ça, mais ça ne marche pas (erreur) :
i = i + 1
Colonne(i)= bla bla...
Commenter la réponse de pjouy
Messages postés
55
Date d'inscription
lundi 14 novembre 2005
Statut
Membre
Dernière intervention
23 juin 2008
0
Merci
Tu peux faire comme ça,

Dim Tableau() as string (selon ton type de données)

i = i + 1
redim preserve Tableau(i)
Tableau(i) = "bla bla"

Et après tu boucle sur ton Tableau, par exemple

for i = 1 to ubound(Tableau)
   msgbox tableau(i)   
next i

puis quand tu as terminé de t'en servir

erase tableau pour effacer de la mémoire,

voili, voilou
A+
Commenter la réponse de cs_molo molo
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009
0
Merci
A "redim preserve Tableau(i)", il me fait une erreur "Attendu : Tableau" à l'exécution.
Commenter la réponse de pjouy
Messages postés
55
Date d'inscription
lundi 14 novembre 2005
Statut
Membre
Dernière intervention
23 juin 2008
0
Merci
As-tu bien mis les parenthèses lors de la déclaration ?

Dim Tableau()
Commenter la réponse de cs_molo molo
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009
0
Merci
Oups, j'ai corrigé.
Et comme une erreur n'arrive jamais seule, toujours à l'exécution, il me fait une erreur "Argument ou appel de procédure incorrect" sur la ligne "Tableau(i) = Mid(Texte, ...)"

Désolé, je suis vraiment un nb... ;)
Commenter la réponse de pjouy
Messages postés
55
Date d'inscription
lundi 14 novembre 2005
Statut
Membre
Dernière intervention
23 juin 2008
0
Merci
Là c'est ton MID qui plante

A vérifier avec l'aide VB, tu surlignes MID et F1, c'est bien expliqué avec exemple.

voili, voilou
Commenter la réponse de cs_molo molo
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009
0
Merci
En effet. J'ai corrigé mais j'ai encore une erreur (je suis maudit !)
Toujours sur la ligne Tableau(i) = ... , il me dit que l'indice est en dehors de la plage.

Merci pour ta patience
Commenter la réponse de pjouy
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
44
0
Merci
Salut,

Sinon pour ne pas te soucier du i lors du redimensionement du tableau fais ceci:

ReDim Preserve Tableau(UBound(Tableau) + 1) 
Tableau(UBound(Tableau)) = "bla bla" 

For i = LBound(Tableau)To UBound(Tableau) 
   MsgBox Tableau(i) 
Next i 

 

<small> Coloration syntaxique automatique [AFCK]</small>
       

Sinon donne le code que tu as actuellement pour que nous pouissions bien voir ou tu en est exactement

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
Commenter la réponse de jrivet
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009
0
Merci
Je crois qu'en effet, il sera plus simple pour vous que je vous montre le code complet. Pardon si c'est simple, mais c'est de mon niveau ;) Ce sont des données que je prends à partir d'un fichier texte.

    Do While Not EOF(1)
        Line Input #1, Texte
        longueur = Len(Texte)                            'Calcul de la longueur de la ligne
        DernierCar = InStrRev(Texte, ";")
        curseur = 1                                           'Initialisation du curseur au 1er caractère
        i = 1
        ReDim Preserve Colonne(i)
        While curseur <= longueur                    'Boucle : tant qu'on arrive pas à la fin du texte
        entree = (InStr(curseur, Texte, ";"))         If curseur DernierCar + 1 Then TexteTraite TexteTraite & "/" & Right(Texte, longueur - DernierCar): GoTo Suite
        ColonneDetachee = Mid(Texte, curseur, entree - curseur)
        TexteTraite = TexteTraite & "/" & ColonneDetachee    
        curseur = Val(entree) + 1                      'Définition de la nouvelle position du curseur : au caractère + 1 (pour éviter qu'il ne repère à nouveau ce caractère)
        Colonne(i) = ColonneDetachee
        i = i + 1
        Wend
Suite:
    MsgBox Colonne1 & "/" & Colonne2 & "/" & Colonne3
   TexteTraite = ""
Commenter la réponse de pjouy
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
44
0
Merci
Salut,

Je n'est pas regarder plus loin deja:

A chaque passage dans la boucle tu réinitialise i a 1 (i = 1) donc deja tu ecrit tout le temps dans le premier élément du tableau.

Ensuite avant la boucle:

Essaie un

Redim Colonne(1)
i = 1
Do While Not EOF
.....
Wend

Est ce que cela change qque chose?

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
Commenter la réponse de jrivet
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
44
0
Merci
Re,

Qu est ce qu 'il y a exactement dans ton fichiers txt et quel est le resultat que tu veux obtenir??

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
Commenter la réponse de jrivet
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009
0
Merci
Alors, si je remets i = 1, c'est pour recommencer une série de colonnes.
Mon fichier texte contient des données dans ce format :
123;ABC;531;ZFDV;UFGH; ...
En gros des caractères séparés par des points-virgules ; qui provient d'une exportation de tableau.
Ce que je veux faire, c'est lire chaque ligne, délimiter les données qu'il y a entre chaque point-virgule, mettre les données d'une ligne en mémoire pour ensuite les envoyer à un processus de calcul (qui est déjà fait). Donc, j'ai déjà réussi à isoler les données, ce que je voudrais c'est créer des variables dynamiquement (d'où le Colonne(i) ) pour ensuite faire un truc du genre
Call Calcul (Colonne1, Colonne4)
où Calcul est un PrivateSub fonctionnant déjà, avec des paramètres : Calcul (Paramètre1 As String, Paramètre2 As String)

Voili voilà, j'espère que j'ai pu me faire comprendre ;)
Commenter la réponse de pjouy
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009
0
Merci
En fait, pour mon code, il fallait faire une légère modification :

Do While Not EOF(1)
    Line Input #1, Texte             'Récupere la ligne dans texte
    ColonneSurUneLigne = Split(Texte, ";")   'Split de la ligne avec ; comme délimiteur
ReDim Colonne(0)
i = 1
    For i = LBound(ColonneSurUneLigne) To UBound(ColonneSurUneLigne)
        ReDim Preserve Colonne(UBound(Colonne) + 1)
        'rempli Colonne avec les colonnes trouvees sur le ligne
        Colonne(UBound(Colonne)) = ColonneSurUneLigne(i)
    Next
    DoEvents
    Call CalculStats(Colonne(2), Colonne(4), Colonne(10), CloturationMemeJour, Colonne(10))
Erase Colonne
    Loop
End If

Merci beaucoup, j'ai beaucoup appris grace à toi aujourd'hui !!
Pascal
Commenter la réponse de pjouy
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
44
0
Merci
Re,

De rien.

Vu que tu appelle CalculStats a chaque passage dans la boucle et que tu fais un Erase Colonne , tu n'a pas besoin de ColonneSurUneLigne.

Donc cela donne

Do While Not EOF(1) 
    Line Input #1, Texte              'Récupere la ligne dans texte
    Colonne = Split(Texte, ";")    'Split de la ligne avec ; comme délimiteur
    DoEvents 
    Call CalculStats(Colonne(2), Colonne(4), Colonne(10), CloturationMemeJour, Colonne(10)) 
    Erase Colonne 
Loop 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       

Normalement cela devrait marche pareil

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
Commenter la réponse de jrivet
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009
0
Merci
Re,

J'essaierai ça plus tard, je dois m'en aller. On est très loin du code que j'essayais de faire (avec les connaissances que j'avais...)

Peux-tu m'expliquer LBound et UBound avec un tableau, stp ?

Merci encore,
Pascal
Commenter la réponse de pjouy
Messages postés
7401
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
44
0
Merci
Salut,

MSDN Dit:
LBound: Renvoie une valeur de type
<object id= "alink_4" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object> [javascript:alink_4.Click() Long] contenant le plus petit indice disponible pour la dimension indiquée d'un
<object id ="alink_5" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_5.Click() tableau].
UBound: Renvoie une valeur de type
<object id="alink_4" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_4.Click() Long] contenant le plus grand indice disponible pour la dimension indiquée d'un
<object id="alink_5" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_5.Click() tableau].

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
Commenter la réponse de jrivet
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009
0
Merci
Bah non, ça ne marche pas pareil : je ne retrouve pas les mêmes données.
Ne t'en fais pas, j'utilise ta première version du code qui marche très bien.

Merci beaucoup, encore une fois
Pascal
Commenter la réponse de pjouy