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 !

SUPPRIMER UN ÉLÉMENT D'UN TABLEAU


Information sur la source

Catégorie :Divers Classé sous : supprimer, élément, tableau, ubound, lbound Niveau : Débutant Date de création : 03/05/2000 Vu : 17 378

Note :
6,8 / 10 - par 5 personnes
6,80 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Description

Lorsque vous créez des tableaux dynamiques en VB, vous serez peut-être ammenés à avoir besoin de supprimer un élement qui ne se trouve pas forcément être le dernier. Je ne sais pas comment créér une fonction adéquate (les passages de tableaux dans les fonctions marchent mal en VB) mais le code d'une telle suppression est suffisament court pour être écrit à chaque emploi. On constate deux cas : les tableaux de variables et les tableaux d'objets (aussi appelés les tableaux de pointeurs).
 

Source

  • 'Xsupp représente l'index de la case à supprimer
  • 'Tabl représente le tableau qui contient la case à supprimer
  • 'Cas des tableaux de variables
  • For X = Xsupp + 1 To Ubound(Tabl)
  • Tabl(X - 1) = Tabl(X)
  • Next
  • Redim Preserve Tabl(Ubound(Tabl) - 1)
  • 'Cas des tableaux de pointeurs
  • For X = Xsupp + 1 To Ubound(Tabl)
  • Set Tabl(X - 1) = Tabl(X)
  • Next
  • Redim Preserve Tabl(Ubound(Tabl) - 1)
'Xsupp représente l'index de la case à supprimer
'Tabl représente le tableau qui contient la case à supprimer

'Cas des tableaux de variables

For X = Xsupp + 1 To Ubound(Tabl)
 Tabl(X - 1) = Tabl(X)
Next

Redim Preserve Tabl(Ubound(Tabl) - 1)

'Cas des tableaux de pointeurs

For X = Xsupp + 1 To Ubound(Tabl)
 Set Tabl(X - 1) = Tabl(X)
Next

Redim Preserve Tabl(Ubound(Tabl) - 1)

Conclusion

Faites cepandant attention, l'utilisation de cet algorithme décale d'un cran vers la gauche tous les éléments du tableau situé après l'élément supprimé.
 

Commentaires et avis

signaler à un administrateur
Commentaire de Worst le 23/04/2006 20:04:04

Bonjour,

   Je voulais juste dire que je ne suis pas tout à fait d'accord avec la solution proposée. Cette méthode nécessite 2 parcours du tableau.

En effet, la méthode 'Redim Preserve' crée un nouveau tableau et recopie dedans les éléments de l'ancien. En aucun cas il agrandit le tableau existant...

Tiré de MSDN :
http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/vblr7/html/vastmredim.asp
"Si vous incluez le mot clé Preserve, Visual Basic copie les éléments à partir du tableau existant dans le nouveau tableau."


Je pense qu'il est donc plus efficace de recréer un nouveau tableau en écrivant dedans juste les éléments qui nous intéressent.

signaler à un administrateur
Commentaire de sanyohan13 le 08/06/2006 11:48:35

salut
je débute et je voudrais savoir comment faire pour écrire seulement "1234567890ABCDEF" et que les autres caractères ne s'écrivent pas m^me si on appuie dessus...
merci

signaler à un administrateur
Commentaire de floppeur le 07/05/2007 12:24:51

Bonjour,

Je trouve que même si la source de simboy n'est pas optimiser (comme dit Worst), elle fait appel a une structure de donnée orienté objet que je trouve très intéressante. Comme par exemple pour la gestion d'un panier de produits...

Alors Merci bien..

Sanyohan13: Tu es dans la mauvais rubrique, mais pour ton probléme block avec maxlength...

signaler à un administrateur
Commentaire de peug le 16/11/2007 12:14:53

Worst, je suis un peu d'accord mais dans ton idée il faut bien renvoyé le tableau sans l'item. Comment vois-tu la chose ?

zieut ca :
    Dim i As Integer
    Dim k As Integer
    
    'Creation du tableau temporaire
    Dim tbTemp() As String 'doit être idem que tb :(
    ReDim tbTemp(UBound(Tabl))
    
    For i = 0 To UBound(Tabl)
        If i <> item Then
            'on copie dans le nouveau tableau sauf l'item a effacer
            tbTemp(k) = Tabl(i)
            k = k + 1
        End If
    Next
    
    'on refait le tableau de base
    ReDim Tabl(UBound(tbTemp))
    For i = 0 To UBound(tbTemp)
        Tabl(i) = tbTemp(i)
    Next

signaler à un administrateur
Commentaire de peug le 16/11/2007 12:18:36

Oups... et donc je code de Simboy n'est pas si mauvais que ça. Mais je peux me tromper..

signaler à un administrateur
Commentaire de Worst le 16/11/2007 18:00:24

Je voyais le truc tout simple : créer un 2ème tableau avec directement la bonne taille (max - 1), et mettre dedans les valeurs au fur et à mesure. Mais effectivement, à la fin faut le remettre dans le 1er tableau, et là on est comme des flans.

Y'a bien l'option "on crée une fonction qui retourne le nouveau tableau", mais là ça doit être VB qui crée une copie du tableau avant de le retourner...

Public Function array_remove(ByRef t() As String, ByVal val As String)

    Dim max As Integer          ' Taille de l'ancien tableau
    max = UBound(t)

    Dim cur_val As String       ' Valeur lue dans l'ancien tableau
    Dim ind_anc As Integer      ' Indice de déplacement dans l'ancien tableau
    Dim ind_nouv As Integer     ' Indice de déplacement dans le nouveau tableau
    
    Dim nouv_tab() As String ' Nouveau tableau
    ReDim Preserve nouv_tab(max - 1)
    
    ind_nouv = 0
    For ind_anc = 0 To max
        cur_val = t(ind_anc)
        If cur_val <> val Then
            nouv_tab(ind_nouv) = cur_val
            ind_nouv = ind_nouv + 1
        End If
    Next ind_anc
    
    array_remove = nouv_tab

End Function



'''''''' Exemple ''''''''

Dim t(10) As String
For i = 0 To 10
    t(i) = i
Next i

nouv_t = array_remove(t, 5)

Dim val As Variant
For Each val In nouv_t
    Debug.Print val
Next


Donc, finalement je suis d'accord, y'a 2 parcours. J'ai dit des bêtises. Au temps pour moi.
Par contre, juste : pourquoi tu mets plein de UBound() dans tes boucles for() ? Ca serait pas plus efficace de récupérer la taille une première fois avant d'entrer dans la boucle, plutôt que de le recalculer à chaque fois ??

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

matrice de corrélation [ par adlecodeur ] Bonjour &#224; tous,est-ce que qq1 pourrait m'aider: je cherche &#224; calculer &#224; partir d'une matrice n*p(p&lt;n), une matrice de corr&#233;lati comment supprimer un élément d'un tableau non trié en langage c [ par miya88 ] salut tout le mondeje voudrai avoir le programme en langage C ou l'algorithme de suppression d'un élément contenu dans un tableau non trié,merci d'ava VB.Net Remplir un Tableau à partir d'élément sélectionnés dans un ListBox [ par MagDix ] Bonjour Comment est-il possible de récupérer les éléments sélectionnés dans un ListBox et les mettres dans un tableau ??? Premiere question...Comm HELPPP!!! supprimer un élément selectionné dans une listview [ par midomaroc ] bonjours a tous !!! <a href= MATRICE [ par mimosa803 ] Salut tout le monde,j'ai un petit code dont je n'ai pas compris quelques chose,j'espere que vous m'aider,le voila:dim tabmoy() as doubleRedim tabmoy ( vb6, supprimer un élément dans un fichier .dat [ par mstarsup5 ] Bonjour,C'est encore un problème avec les fichier binaires (.dat ici), j'aimerais savoir s'il existe une commande pour effacer un élément du fichier.P matrice de corrélation [ par adlecodeur ] Bonjour &#224; tous,est-ce que qq1 pourrait m'aider: je cherche &#224; calculer &#224; partir d'une matrice n*p(p&lt;n), une matrice de corr&#233;lati Taille d'un tableau [ par Lilian ] Salut,J'ai dim tMonTableau()Ensuite je le remplis en faisant des redim preserve.Ensuite j'ai besoin de connaître sa taille alors je fais UBound(tMonTa Ajout élément tableau excel avec VB [ par cloe ] Hello, J'ai un big problème je voudrais pouvoir ajouter des éléments dans un tableau excel à partir de VB.Car j'ai essayer avec :Dim xlapp As excel.A Création d'un tableau dynamique [ par tweetynl ] J'aimerais savoir si c'est possible de cr&#233;er un tableau sans lui mentionner le nombre d'&#233;l&#233;ment qu'il y aura. Car je dois passer dans u


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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,546 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é.