Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1720 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Problème avec "Redim Preserve"

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème avec "Redim Preserve"

n°800197
Dany_63
Posté le 20-07-2004 à 08:33:05  profilanswer
 

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 ?

mood
Publicité
Posté le 20-07-2004 à 08:33:05  profilanswer
 

n°800204
jagstang
Pa Capona ಠ_ಠ
Posté le 20-07-2004 à 08:59:53  profilanswer
 


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?  
n°800215
Dany_63
Posté le 20-07-2004 à 09:17:58  profilanswer
 

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
n°800222
prog1001
Posté le 20-07-2004 à 09:30:40  profilanswer
 

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
n°800231
Dany_63
Posté le 20-07-2004 à 09:37:24  profilanswer
 

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 :-)

n°800233
jagstang
Pa Capona ಠ_ಠ
Posté le 20-07-2004 à 09:38:30  profilanswer
 

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?  
n°800235
prog1001
Posté le 20-07-2004 à 09:41:33  profilanswer
 

a bientot ! :)

n°803761
couitchy
Posté le 22-07-2004 à 22:00:27  profilanswer
 

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

n°889622
ZuL
Posté le 03-11-2004 à 16:45:03  profilanswer
 

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)

n°889631
drasche
Posté le 03-11-2004 à 17:01:12  profilanswer
 

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)
mood
Publicité
Posté le 03-11-2004 à 17:01:12  profilanswer
 

n°890151
ZuL
Posté le 04-11-2004 à 13:19:00  profilanswer
 

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 )

n°890153
drasche
Posté le 04-11-2004 à 13:22:25  profilanswer
 

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)
n°890169
ZuL
Posté le 04-11-2004 à 13:42:40  profilanswer
 

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.

n°890191
Arjuna
Aircraft Ident.: F-MBSD
Posté le 04-11-2004 à 14:01:00  profilanswer
 

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

n°890192
Arjuna
Aircraft Ident.: F-MBSD
Posté le 04-11-2004 à 14:02:18  profilanswer
 

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...

n°890222
ZuL
Posté le 04-11-2004 à 14:36:06  profilanswer
 

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

n°1701598
leo67000
Posté le 13-03-2008 à 11:29:38  profilanswer
 

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
n°1702441
ZuL
Posté le 14-03-2008 à 14:41:29  profilanswer
 

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.

n°1797829
askil2000
Posté le 09-10-2008 à 15:57:57  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Problème avec "Redim Preserve"

 

Sujets relatifs
Gkt2-perl: problème avec les comboboxProblème de pourcentage pour les balises div
probleme datagridProblème de date dans requête imbriquée
[php-mysql] probleme de décryptage de mots de passe [resolu][HTML] problème avec les <button>
[CSS] Problème avec blocsHTML/CSS>>Problème de classe
Problème avec un unlink() ... [Résolu][Juste un "s" en +, trop bete]Problème de récupération Excel avec un recordset ADO
Plus de sujets relatifs à : Problème avec "Redim Preserve"


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR