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

Signaler
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009
-
pjouy
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009
-
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

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
46
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>
Messages postés
55
Date d'inscription
lundi 14 novembre 2005
Statut
Membre
Dernière intervention
23 juin 2008

Salut,

Et un tableau dynamique ?

Genre : Redim Tableau(x)
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009

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...
Messages postés
55
Date d'inscription
lundi 14 novembre 2005
Statut
Membre
Dernière intervention
23 juin 2008

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+
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009

A "redim preserve Tableau(i)", il me fait une erreur "Attendu : Tableau" à l'exécution.
Messages postés
55
Date d'inscription
lundi 14 novembre 2005
Statut
Membre
Dernière intervention
23 juin 2008

As-tu bien mis les parenthèses lors de la déclaration ?

Dim Tableau()
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009

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... ;)
Messages postés
55
Date d'inscription
lundi 14 novembre 2005
Statut
Membre
Dernière intervention
23 juin 2008

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
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009

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
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
46
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>
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009

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 = ""
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
46
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>
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
46
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>
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009

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 ;)
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009

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
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
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>
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009

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
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
46
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>
Messages postés
110
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
18 mai 2009

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