Créer une variable avec nom dynamique

Résolu
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009 - 23 juin 2006 à 12:17
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

19 réponses

jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
23 juin 2006 à 14:20
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>
3
cs_molo molo Messages postés 55 Date d'inscription lundi 14 novembre 2005 Statut Membre Dernière intervention 23 juin 2008
23 juin 2006 à 12:30
Salut,

Et un tableau dynamique ?

Genre : Redim Tableau(x)
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
23 juin 2006 à 12:36
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...
0
cs_molo molo Messages postés 55 Date d'inscription lundi 14 novembre 2005 Statut Membre Dernière intervention 23 juin 2008
23 juin 2006 à 12:42
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+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

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

Dim Tableau()
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
23 juin 2006 à 13:10
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... ;)
0
cs_molo molo Messages postés 55 Date d'inscription lundi 14 novembre 2005 Statut Membre Dernière intervention 23 juin 2008
23 juin 2006 à 13:19
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
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
23 juin 2006 à 13:30
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
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
23 juin 2006 à 13:37
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>
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
23 juin 2006 à 13:44
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 = ""
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
23 juin 2006 à 13:53
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>
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
23 juin 2006 à 13:58
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>
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
23 juin 2006 à 14:07
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 ;)
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
23 juin 2006 à 14:41
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
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
23 juin 2006 à 14:46
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>
0
pjouy Messages postés 110 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 18 mai 2009
23 juin 2006 à 14:59
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
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
23 juin 2006 à 15:22
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>
0
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
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
0
Rejoignez-nous