begin process at 2008 08 22 05:49:45
1 229 779 membres
50 nouveaux aujourd'hui
14 267 membres club

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 : 13 342 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

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Boutique

Boutique de goodies CodeS-SourceS