Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[VISUAL BASIC] [GÉNÉRAL] COMMENT REDIMENSIONNER UN TABLEAU EN VB ?


Information sur le tutorial

Catégorie :Tutoriaux Date de création : 11/11/2002 00:00:00 Vu : 16 667 fois

Note :
5,5 / 10 - par 2 personnes
5,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

Tutorial

Cela dépend si oui ou non vous voulez conserver les valeurs dans votre tableau

Dim intMonTableau() as integer

Si oui :

Redim Preserve intMontableau (50) '50 elements en conservant les anciens

Si Non :

Redim intMontableau (50) '50 elements et ecrasement
signaler à un administrateur
Commentaire de us_30 le 24/07/2005 23:04:52

IL est à noter que pour un tableau de plusieurs variables, seul la dernière peut être redimensionnée.

Par exemple :

Si la première déclaration est :
Dim MonTableau(10,10)

On peut redimensionner le tableau et en gardant les données stockés par :
Dim Preserve MonTableau(10,50)

Par contre, on ne peut pas faire :
Dim Preserve MonTableau(50,50)

Amicalement,
Us.

signaler à un administrateur
Commentaire de MaximHom le 31/08/2005 17:26:05

OK, ceci m'amène à une autre question :
Je déclare "Dim Montableau(100)"
A l'utilisation, je n'occupe que 50 cases, que j'enregistre simplement dans un fichier txt.
Au démarrage suivant, je lis mon fichier txt, je retrouve mes 50 données, et je charge 50 cases de mon tableau.
Etc......
Puis un jour, j'ai 99 données, et là, je me dis qu'il serait bon de redimensionner....  Comment je fais ?
Je pourrais prévoir un "If NombreDeDonnees > 98 then "Dim Preserve Montableau(150)" par exemple...
En supposant que je rajoute àlors deux nouvelles entrées, j'aurai alors 101 données, il faudra que mon tableau soit dimensionné correctement avant, sinon, j'aurai une erreur...
Y-a-t-il un autre formule plus simple que la ligne que j'ai écrite ci-dessus ?

Quand vous dites, "PreserveMontableau(150)", est-ce que cela rajoute  150 cases aux 50 déjà existantes, ou est-ce que ça n'en crée en fait que 100 nouvelles ?

Merci.

signaler à un administrateur
Commentaire de us_30 le 31/08/2005 21:33:09

Salut,

Effectivement, on peut préciser...

Si tu as déclaré un tableau pour 50 éléments, donc avec :
Dim MonTableau(50)

Lorsqu'on redimensionne MonTableau en conservant les anciennes valeurs, pour contenir 100 éléments, on utilise la syntaxe :
Dim Preserve MonTableau(100)

Ce dernier, contiendra que 100 éléments en tout. (donc les 50 anciens + 50 nouveaux). Les 50 nouveaux éléments seront bien sur, vides. A noter, qu'on peut également sous dimensionner le tableau. Par exemple, Dim preserve MonTableau(25).

=

Quant à ton petit problème pratique, plusieurs solutions sont possibles. Normalement, c'est pas trés difficile de faire en sorte de m'être jamais gêné.

Par exemple, soit on compte le nombre d'éléments contenus dans ton fichier txt, puis on déclare le tableau en y rajoutant un certains nb d'éléments.
Soit au fur et à mesure de lecture dans le fichier txt, on incrémente l'indice du tableau en préservant les anciennes données. Puis, à chaque nouveau élément à rentrer "manuellement", on peut encore faire pareil. (incrémentation du tableau en préservant les anciens)

Soit, une combinaison des possibilités évoquées ci-dessus.

Amicalement,
Us.

signaler à un administrateur
Commentaire de MaximHom le 31/08/2005 22:50:57

Bonsoir,

Merci, c'est effectivemnet une solution.
Evidement, une fois que mon code est compilé et mon exe terminé, je ne peux plus revenir sur la déclaration.
Il me semble qu'à un moment donné, j'avais essayé de déclarer un tableau dans le style :
Nombre = 50
Dim Montableau(nombre)
mais que ça ne marchait pas. Dommage.

Donc, et si j'ai bien compris, je déclare Montableau(50) à la conception du programme, et ensuite, dans les exécutions futures, si j'ai + de 50 articles, c'est la fonction preserve qui sera utilisée automatiquement, à chaque lancement du logiciel :
ai-je bien tout compris ?

Maintenant, c'est bien joli "Preserve". Mais si je compte mes éléments dans mon fichier txt (au départ de l'application p.e. - dans la Form_Load, j'aurai encore une variable (Nombre = 60 p.e)et dans ce cas pourrais-je mettre :
Dim Preserve Montableau(Nombre)
Là,j'ai bien le sentiment d'être dansle même cas de figure...
Purquoi ça marcherait avec Preserve et pas sans ?..
Bien entendu, je peux toujours mettre un Select Case pour renseigner ma déclaration ( par pas de 10 ou 20 ou 50), mais ça me paraît assez rébarbatif, et un peu longuet...
Finalement, ce n'est pas encore totalement clair dans mon esprit...

Merci pour ces renseignements

signaler à un administrateur
Commentaire de us_30 le 31/08/2005 23:12:17

Bonsoir,

Oui, c'est clair que cela te sembles pas clair... Je pense que la difficulté vient de ton analyse du problème (en quelque sorte)... Tu sembles avoir du mal à imaginer à utiliser une variable qui s'incrémente... j'avoue que c'est tellement évident pour moi, que la difficulté pour saisir où est ton problème... ben... j'ai un peu de mal à mon tour...

Aux solutions déjà cités, on peut encore imaginer une autre possibilité. Tout simplement, en entête du fichier txt, on peut inscrire le nb de données contenu... puis à la lecture, lire cette première donnée pour déclarer le tableau... etc...


Us.

signaler à un administrateur
Commentaire de MaximHom le 01/09/2005 08:45:04

Bonjour !

Désolé,  mais je commence à être vieux, et il est clair qu'on comprend moins bien et moins vite mais ma foi, comme je ne peux pas faire autrement, je vis avec !

Au fond, mon problème est simple, et je vais (re)faire l'essai tout à l'heure :
Peu importe le nombre d'éléments dans le fichier et à mettre dans  le tableau, ce nombre apparaîtra forcément sous forme d'une variable à la lecture du fichier. Ma question est : "Est-ce que je puis déclarer ensuite MonTableau AVEC cette variable ?
En clair, déclarer Montableau(50), c'est facile, par contre, déclarer Montableau(Nombre), avec Nombre qui vaut 50, c'est plus incertain, à ce qui m'avait semblé.
Maintenant, il est possible que  ma variable (Nombre) ait été déclarée sous un mauvais type (Dim Nombre As Integer me semblait pourtant convenable !
Bon, je vais essayer tout à l'heure, je vais voir...

Merci beaucoup pour votre aide

signaler à un administrateur
Commentaire de MaximHom le 01/09/2005 16:06:03

Bonjour d'après-midi,

J'ai fait quelques essais, et j'ai trouvé quelque chose qui fonctionne.
Au cas où cela intéresserait d'autres personnes, voici le code :

Option Explicit
Dim MonTableau() As String 'string ou autre...
'Attention :
'Il ne faut surtout pas renseigner le nombre entre parenthèses !
'ça génèrerait une erreur par la suite
Dim NombreElements As Integer 'Nombre d'éléments dans le fichier
Dim NombreCases As Integer ' Nombre de cases de MonTableau

Private Sub Form_Load()
'On va lire le fichier qui contient les éléments
'et compter combien il y a d'éléments
'Pour l'exemple, on va dire qu'il y a 5 éléments soit :
Dim Var1, Var2, Var3, Var4, Var5 As String
'On va dire :
Var1 = "a"
Var2 = "b"
Var3 = "c"
Var4 = "d"
Var5 = "e"
'Donc :
NombreElements = 5
'On va remplir le tableau, mais en se gardant une marge de sécurité
'Par exemple, 5, donc :
NombreCases = NombreElements + 5 ' donc 10 !
'ensuite on va redéfinir le tableau
ReDim Preserve MonTableau(NombreCases)
'on peut alors remplir le tableau
MonTableau(1) = Var1
MonTableau(2) = Var2
MonTableau(3) = Var3
MonTableau(4) = Var4
MonTableau(5) = Var5
Label2.Caption = NombreCases 'voir ci-dessous
End Sub

Private Sub Text1_Change()
Dim Valeur As Integer
Valeur = Val(Text1.Text)
'Pour l'essai concret, on peut mettre sur la feuille une textbox
'qui servira à entrer le numéro de la case
'ensuite un label(lbel1)qui affichera le contenu de la case
'Pour l'exemple, on peut mettre un second label (lbel2) qui indiquera
'le nombre de cases du tableau,remplies ou non
'Si l'utilisateur entre un nombre > NombreCases,
'il faudra redimensionner le tableau
If Valeur > NombreCases Then
    NombreCases = Valeur + 5 'marge de sécurité
    ReDim Preserve MonTableau(NombreCases)
    Label2.Caption = NombreCases 'la valeur a changé
End If
Label1.Caption = MonTableau(Valeur)

End Sub

Voilà, ça fonctionne comme tel.

Merci à US_30 de m'avoir mis sur la bonne voie !
Bonne journée !

signaler à un administrateur
Commentaire de us_30 le 01/09/2005 22:33:22

Bonsoir,

Okay MaximHom. Pas trop vieux tout de même... -:);

Peut-être un complèment sur la syntaxe qui n'apparait pas dans les quelques lignes du Tuto, suite à ta remarque dans le listing :

=

Dim MonTableau() As String 'string ou autre...
'Attention :
'Il ne faut surtout pas renseigner le nombre entre parenthèses !
'ça génèrerait une erreur par la suite

=

IL y a deux façon de déclarer un Tableau, aussi valable l'une que l'autre. La différence se situe uniquement sur la présentation et l'organisation du code... Voici ces 2 façons commentées dans le code :

=

Sub Premierefacon()

'Déclaration générale pour définir le type
'On dit à VB que MonTableau est un tableau à indice
'ET on dit aussi que MonTableau contiendra une donnée alphanumérique (textes & nombres)
Dim MonTableau() As String

'On dimensionne le nombre d'élément
ReDim MonTableau(50)

'Puis on redimensionne à 100 éléments en gardant les anciennes
ReDim Preserve MonTableau(100)

End Sub

=

Sub Deuxiemefacon()

'Si on veut dimensionner directement 50 éléments
ReDim MonTableau(50) As String

'Puis on redimensionne à 100 éléments en gardant les anciennes
ReDim Preserve MonTableau(100)

End Sub

=

Je pense que la première façon est préférable, car elle permet une relecture d'un ancien code beaucoup plus facilement... Il y a aussi d'autres petites raisons pratiques, mais bon...

En espèrant que ces précisions seront utiles...

Amicalement,
Us.

signaler à un administrateur
Commentaire de MaximHom le 01/09/2005 23:10:15

OK et vu, merci encore !
Fin du sujet-------------------

signaler à un administrateur
Commentaire de blinix123 le 08/04/2006 01:02:42

tableau dynamique... :x

signaler à un administrateur
Commentaire de nord666 le 13/12/2007 16:31:23

Bonjour,

Voici une autre façon:

Array.Resize(montableau, nouvelleDimension)
cette méthode préserve les valeurs mais ne fonctionne que pour un tableau à une dimension.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,094 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.