Problème avec "Redim Preserve" - VB/VBA/VBS - Programmation
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
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
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.
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 :-)
Marsh Posté le 20-07-2004 à 09:38:30
j'avais mal lu le code. oups.
Bienvenue à bord Dany
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...
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)
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.
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 )
Marsh Posté le 04-11-2004 à 13:22:25
bin non, un code qui modifie plusieurs dimensions sur un tableau est un mauvais code
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.
Marsh Posté le 04-11-2004 à 14:01:00
Euh... LDAP a une structure arborescente, donc commence par ça...
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...
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.
Marsh Posté le 13-03-2008 à 11:29:38
ZuL a écrit : bof non ca reste con. |
Ton commentaire montre juste que tu n'y connais pas grand chose
Marsh Posté le 14-03-2008 à 14:41:29
leo67000 a écrit : |
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.
Marsh Posté le 09-10-2008 à 15:57:57
Je confirme vb c'est pour ceux qui savent pas développer !
Marsh Posté le 20-07-2004 à 08:33:05
Bonjour,
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 ?