begin process at 2012 02 16 04:39:26
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Tutoriaux

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

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


 Information sur le tutoriel

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Commentaires

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.

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.

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.

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

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.

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

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 !

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.

Commentaire de MaximHom le 01/09/2005 23:10:15

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

Commentaire de blinix123 le 08/04/2006 01:02:42

tableau dynamique... :x

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

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,420 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales