Problème avec "Redim Preserve"

Problème avec "Redim Preserve" - VB/VBA/VBS - Programmation

Marsh Posté le 20-07-2004 à 08:33:05    

Bonjour,  :hello:  
 
Je souhaite inscrire dans un tableau des cellules se trouvant sur une feuille Excel.
Voici l'extrait de mon code :
 
For i = 6 To 6 + Sheets("Database" ).Cells(3, 3).Value
    If CStr(Sheets("Database" ).Cells(i, 6).Value) = Trim(Quoi) Then
        Cpt = Cpt + 1
        ReDim Preserve Tableau(...)
        For j = 7 To 50
        Tableau(Cpt, j - 7) = Trim(Sheets("Database" ).Cells(i, j).Value)
        Tableau(Cpt, 44) = i
        Next j
    End If
Next i
 
je souhaite qu'à chaque ligne trouvé,j'augmente la taille de mon tableau d'une ligne pour ensuite la remplir.
 
Ce tableau doit être de la forme tableau(x lignes, 44 colonnes).
 
Comment écrire cette ligne de afin de créer une ligne dans mon tableau ?

Reply

Marsh Posté le 20-07-2004 à 08:33:05   

Reply

Marsh Posté le 20-07-2004 à 08:59:53    


Redim Preserve tableau(UBound(tableau)+1)
 
bon niveau performance ça doit pas être top. mais bon


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 20-07-2004 à 09:17:58    

Merci JagStang, malheuresement la ligne ne fonctionne pas.
j'ai le défaut "subscript out of range" sur la ligne qui augmente la taille du tableau.
 
Peut être que ça vient d'ailleurs mais je ne trouve pas  :-(
 
Voici ma fonction en entier:
 
Public Function Liste_control(Quoi) 'Quoi étant un numéro de lot id
 
'Foction permettant la recherche des informations selon le numéro de lot
Dim Ligne As Integer
Dim i, j, Cpt As Integer
Dim Tableau() As String
 
Sheets("Database" ).Cells(3, 65).Value = Saisie.Code_cde.Value
Sheets("Database" ).Cells(3, 67).Value = Quoi
 
ReDim Tableau(0, 44)
 
'Sheets("Database" ).Cells(4, 67).Value
Ligne = 1
 
Cpt = -1
For i = 6 To 6 + Sheets("Database" ).Cells(3, 3).Value
    If CStr(Sheets("Database" ).Cells(i, 6).Value) = Trim(Quoi) Then
        Cpt = Cpt + 1
        For j = 7 To 50
            Tableau(Cpt, j - 7) = Trim(Sheets("Database" ).Cells(i, j).Value)
            Tableau(Cpt, 44) = i
        Next j
        ReDim Preserve Tableau(UBound(Tableau) + 1)  
    End If
Next i
 
Saisie.nb_cont_dec.List = Tableau
Erase Tableau
End Function
 


Message édité par Dany_63 le 20-07-2004 à 09:21:09
Reply

Marsh Posté le 20-07-2004 à 09:30:40    

Tiens, un extrait de MSDN qui pourra t'aider :
 
 
L'instruction ReDim permet de dimensionner et de redimensionner un tableau dynamique ayant déjà été déclaré de manière formelle par le biais d'une instruction Private, Public ou Dim suivie de parenthèses vides (sans indices de dimension).
 
Vous pouvez utiliser l'instruction ReDim à plusieurs reprises pour modifier le nombre d'éléments et de dimensions d'un tableau. Cependant, vous ne pouvez changer a posteriori le type d'un tableau à l'aide de l'instruction ReDim, sauf si ce tableau est contenu dans une variable de type Variant. Dans ce cas, le type des éléments est modifiable en utilisant une clause As type, sauf si vous utilisez le mot clé Preserve. Aucun changement de type de données n'est alors possible.
 
Si vous utilisez le mot clé Preserve, vous ne pouvez redimensionner que la dernière dimension du tableau. Vous ne pouvez en aucun cas modifier le nombre de dimensions. Par exemple, si votre tableau n'a qu'une dimension, vous pouvez la modifier puisqu'il s'agit de la dernière et seule dimension. Toutefois, si le tableau compte plusieurs dimensions, seule la taille de la dernière dimension est modifiable si vous souhaitez préserver le contenu du tableau. L'exemple suivant montre comment augmenter la taille de la dernière dimension d'un tableau dynamique sans effacer les données qu'il contient :
 
ReDim X(10, 10, 10)
. . .
ReDim Preserve X(10, 10, 15)
 
De même, le mot clé Preserve ne permet de redimensionner un tableau qu'en modifiant la limite supérieure ; toute modification de la limite inférieure provoque une erreur.
 
Si vous réduisez la taille d'un tableau, les données contenues dans les éléments supprimés sont perdues. Si vous transmettez par référence un tableau à une procédure, ce dernier ne peut être redimensionné au sein de la procédure.
 
Lors de l'initialisation des variables, une variable numérique prend pour valeur initiale 0, une chaîne de longueur variable prend pour valeur initiale une chaîne de longueur nulle ("" ), et une chaîne de longueur fixe est remplie de zéros. Les variables de type Variant ont la valeurEmpty à l'initialisation. Chaque élément d'une variable de type défini par l'utilisateur est initialisé comme s'il s'agissait d'une variable distincte. Une variable qui fait référence à un objet ne peut être utilisée avant d'avoir été associée à un objet existant avec l'instruction Set. Tant qu'elle n'est pas associée à un objet, lavariable objet déclarée a la valeur spéciale Nothing, indiquant qu'elle ne fait référence à aucune instance spécifique d'un objet.
 
Attention   L'instruction ReDim a un effet déclaratif si la variable déclarée n'existe pas auniveau module ou auniveau procédure. Si une autre variable portant le même nom est créée ultérieurement, même avec uneportée plus importante, l'instruction ReDim fait référence à cette dernière et n'engendre pas systématiquement d'erreur de compilation, même si Option Explicit est activé. Pour éviter tout conflit de ce type, l'instruction ReDim ne doit pas être utilisée dans un but déclaratif, mais uniquement pour redimensionner des tableaux.
 
Note   Pour redimensionner un tableau contenu dans une variable de type Variant, il vous faut au préalable déclarer explicitement cette variable.


Message édité par prog1001 le 20-07-2004 à 09:31:28
Reply

Marsh Posté le 20-07-2004 à 09:37:24    

Merci beaucoup.
Mon problème est que je veux augmenter la première dimension. Donc je vais devoir transposer....
 
Nota: C'est la première fois que je viens sur ce forum et je le trouve génial :-)

Reply

Marsh Posté le 20-07-2004 à 09:38:30    

j'avais mal lu le code. oups.
 
Bienvenue à bord Dany :hello:


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 20-07-2004 à 09:41:33    

a bientot ! :)

Reply

Marsh Posté le 22-07-2004 à 22:00:27    

je crois qu'il faut initialiser le tableau par un redim tableau(0) avant de faire des redim preserve dessus...

Reply

Marsh Posté le 03-11-2004 à 16:45:03    

c'est con ce truc.
 
j'ai le meme probleme.
 
généralement quand on doit redimensionner  un tableau on veut lui rajouter des lignes, plus rarement des colones, donc augmenter seulement la derniere dimension est pas logique (on devrait plutot pouvoir augmenter seulement la premiere)

Reply

Marsh Posté le 03-11-2004 à 17:01:12    

Je le trouve parfaitement logique comme il est. C'est une erreur classique d'interprétation: il n'y a ni colonnes, ni lignes. Il n'y a que ce que vous en faites. Et si vous voulez des lignes et des colonnes, il faut noter la colonne, puis la ligne, et ça roule.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 03-11-2004 à 17:01:12   

Reply

Marsh Posté le 04-11-2004 à 13:19:00    

bof non ca reste con.
 
on devrait pouvoir redimensionner les deux sans avoir a se préocuper de quoi que ce soit.
 
ce genre de restriction c'est vraiment une flemme de developpeur (et je sais de quoi je parle :D )

Reply

Marsh Posté le 04-11-2004 à 13:22:25    

bin non, un code qui modifie plusieurs dimensions sur un tableau est un mauvais code :spamafote:


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 04-11-2004 à 13:42:40    

euh la diversité des applications fait que si ca peut etre nécéssaire.
 
je te donne mon exemple (et c'est un truc con par rapport a ce dont on peut avoir besoin).
 
j'ai une liste qui affiche le contenu d'un tableau (toujours le meme).
les données de ce tableau proviennent d'un Ldap/active directory donc nombre de colones variable, nombre de lignes variables.
 
ben j'ai besoin a certains moments de faire mon resize a la main et c'est ben lourd.

Reply

Marsh Posté le 04-11-2004 à 14:01:00    

Euh... LDAP a une structure arborescente, donc commence par ça...

Reply

Marsh Posté le 04-11-2004 à 14:02:18    

Deplus, si t'as pas le droit de redimensionner toutes les dimensions d'un tableau en VB, tu as tout à fait le droit de faire des tableaux de tableaux à une dimension. A ce moment, tu peux redimensionner n'importe quelle dimension sans problème...

Reply

Marsh Posté le 04-11-2004 à 14:36:06    

moué, mais c'est pas pratique apres pour ma fonction de nourissage de liste.
 
bref, c'est quand meme pas terrible comme langage.

Reply

Marsh Posté le 13-03-2008 à 11:29:38    

ZuL a écrit :

bof non ca reste con.
 
on devrait pouvoir redimensionner les deux sans avoir a se préocuper de quoi que ce soit.
 
ce genre de restriction c'est vraiment une flemme de developpeur (et je sais de quoi je parle :D )


 
Ton commentaire montre juste que tu n'y connais pas grand chose :)


---------------
La science c'est comme la confiture moins on en a et plus on l'étale
Reply

Marsh Posté le 14-03-2008 à 14:41:29    

leo67000 a écrit :


 
Ton commentaire montre juste que tu n'y connais pas grand chose :)


 
 
mouarf' le up de la mort.
 
Et non, je reste sur ma position, même longtemps après, le VBA, c'est de la brave merde.

Reply

Marsh Posté le 09-10-2008 à 15:57:57    

Je confirme vb c'est pour ceux qui savent pas développer !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed