Supprimer ou ajouter dans un array avec facilité

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 389 fois - Téléchargée 17 fois

Contenu du snippet

Ce code montre comment on peut facilement intervenir sur un array d'éléments pour :
- supprimer un élément par son index ou par son contenu, sans bouleverser l'ordre des éléments
- ajouter un élément à un array et lui attribuer un index précis, sans bouleverser l'ordre des autres éléments
- déterminer l'index d'un élément à partir de son contenu

Le tout : sans parcourir en boucle les lignes de l'array traité, ni même le redimensionner (ni redim, ni redim reserve).
On traite aussi facilement qu'on le ferait en traitant une collection.

NOTA : le présent code (inédit à ma connaissance) est libre d'utilisation, à la seule condition de laisser les 3 lignes de commentaire, figurant en tête du module, qui précise qu'il est déposé sur VBFrance.

Source / Exemple :


'===============================dans un module standard(VBA) ou .bas (VB6)===============================

Option Explicit
'===== le présent code, déposé par ucfoutu sur VBFrance, est la seule propriété de VBFrance
'=====VBFrance en autorise les libres copie et utilisation à la seule condition d'y laisser 
'=====insérées les trois présentes lignes commentées
Public Sub supprime_index(ByRef ARRAY_A_TRAITER, INDEX_ou_texte_element_A_SUPPRIMER)
  Dim I As Long, Sucf As String
  If VarType(INDEX_ou_texte_element_A_SUPPRIMER) = 8 Then
    Sucf = INDEX_ou_texte_element_A_SUPPRIMER
    I = ucfI(ARRAY_A_TRAITER, Sucf)
  Else
    I = INDEX_ou_texte_element_A_SUPPRIMER
  End If
  If I >= 0 Then ARRAY_A_TRAITER = ucfS(ARRAY_A_TRAITER, I)
End Sub
Public Sub ajoute_index(ByRef ARRAY_A_TRAITER, VALEUR_A_AJOUTER As String, INDEX_A_ATTRIBUER_A_CETTE_VALEUR As Long)
  ARRAY_A_TRAITER = ucfA(ARRAY_A_TRAITER, VALEUR_A_AJOUTER, INDEX_A_ATTRIBUER_A_CETTE_VALEUR)
End Sub
Public Function retourne_index(ByVal ARRAY_A_TRAITER, CHAINE_CONCERNEE As String) As Long
   retourne_index = ucfI(ARRAY_A_TRAITER, CHAINE_CONCERNEE)
End Function
Private Function ucfS(Aucf, Iucf) As Variant
  Dim Sucf As String
  Aucf(Iucf) = ""
  Sucf = Join(Aucf, Chr(0))
  If Iucf = 0 Then Sucf = Mid(Sucf, 2)
  If Iucf = UBound(Aucf) Then Sucf = Left(Sucf, Len(Sucf) - 1)
  ucfS = Split(Replace(Sucf, Chr(0) & Chr(0), Chr(0)), Chr(0))
End Function

Private Function ucfA(Aucf, qucf As String, Iucf As Long) As Variant
  If Iucf = UBound(Aucf) + 1 Then
     Aucf(Iucf - 1) = Aucf(Iucf - 1) & Chr(0) & Chr(0)
  Else
     Aucf(Iucf) = Chr(0) & Chr(0) & Aucf(Iucf)
  End If
  Aucf = Split(Replace(Join(Aucf, Chr(0)), Chr(0) & Chr(0), Chr(0)), Chr(0))
  Aucf(Iucf) = qucf
  ucfA = Aucf
End Function
Private Function ucfI(Aucf, Cucf As String) As Long
      Dim I As Long, Sucf As String
      Sucf = Chr(0) & Join(Aucf, Chr(0)) & Chr(0)
      I = InStr(Sucf, Chr(0) & Cucf & Chr(0))
      If I = 0 Then ucfI = -1: Exit Function
      Sucf = Mid(Sucf, 1, I)
      ucfI = UBound(Split(Sucf, Chr(0))) - 1
      If ucfI < 0 Then ucfI = -1
End Function

'======================================exemples d'utilisation ==================================
Private Sub CommandButton1_Click()
  'pour supprimer un élément (par son index ou par son contenu)
  Dim toto
  toto = Array("bonjour tout le monde", "salut les potes", "ciao", "voilà", "bye")
  
  supprime_index toto, 2 '_________________
 'ou                                       | les deux fonctionnent
  'supprime_index toto, "ciao" '___________|
 
  For I = 0 To UBound(toto) '___________
    MsgBox toto(I) '                     |====>> preuve
  Next '_________________________________|
End Sub

Private Sub CommandButton2_Click()
  'pour ajouter un élément et lui attribuer un index
  Dim toto
  toto = Array("bonjour tout le monde", "salut les potes", "ciao", "voilà", "bye")
  ajoute_index toto, "Il fait beau", 2
   For I = 0 To UBound(toto) '____________
   MsgBox toto(I) '                       |====>> preuve
  Next '__________________________________|

End Sub

Private Sub CommandButton3_Click()
  'pour déterminer l'index d'un élément dont on connait le contenu
  Dim toto
  Dim resul As Long
  toto = Array("bonjour tout le monde", "salut les potes", "ciao", "voilà", "bye")
  resul = retourne_index(toto, "salut les potes")
  MsgBox resul
End Sub

A voir également

Ajouter un commentaire

Commentaires

ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212 -
A ceux qui seraient intéressés : revenez demain, car je suis en train d'améliorer encore ce petit outil qui va permettre (comme on le peut avec une collection) de supprimer un élément tant par son index ( exemple supprime_index toto, 2) que par sa valeur (exemple : supprime_index toto, "voilà"). Toujours sans boucle.
Thank you verry much
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212 -
J'ai fait des ajouts (dont celui annoncé)
Je crois que c'est maintenant suffisant, mais si vous avez une idée d'ajout utile, parlons-en.
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212 -
Je précise un point, en ce qui concerne la suppression :
Si aucun doute n'est permis par la suppression sur la base d'un index, on peut légitimement se demander ce qui se passerait si la suppression était faite sur la base d'un contenu et que ce contenu apparaissait plusieurs fois dans l'array.
Je n'ai pas voulu traiter ce cas (plusieurs contenus identiques), partant du principe selon lequel, par "vocation", un array est construit sans doublons.
C'est donc le seul premier élément répondant à un critère (contenu) qui est supprimé.

Pour ceux qui, étrangement, auraient construit un array dont le critère contenu choisi concernerait plusieurs éléments et qu'ils voudraient supprimer TOUS ces éléments, la solution est simple et elle est dans la manière d'utiliser alors l'outil. Ainsi (exemple où l'on voudrait supprimer tous les éléments "blabla" éventuellement présents ) :

comb = UBound(toto)
Do
supprime_index toto, "blabla"
If UBound(toto) = comb Then Exit Do
comb = UBound(toto)
Loop
Galactus13
Messages postés
326
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
27 juillet 2019
1 -
je veux bien voir comment tu fais, j'ai bien une idée:
Faire la recherche par le contenu de la variable(x)
Puis utiliser ta fonction "supprime_index", par exemple.
en gros:

For I = 0 To UBound(toto)
If toto(I)= MaVariable then
supprime_index toto, I ' Pour supprimer l'index correspondant
exit for
end if
Next

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.