Supprimer ou ajouter dans un array avec facilité

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 606 fois - Téléchargée 20 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
mimiZanzan Messages postés 301 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 17 décembre 2017
25 juin 2013 à 16:47
Salut UCFOUTU,

Merci de ton commentaire. Je ne pensais pas que les experts de Microsoft étaient aussi légers: ils ont quand même fait de grandes choses, mais en effet il y a des fois où ils ne se foulent pas trop...!
En tout cas, tu as raison: ton code met en avant l'utilisation du caractère chr(0),ce qui est rarement montré. J'ai eu l'occasion de le découvrir dans un de mes programmes.
Bon courage (et inspiration) pour de nouveaux codes.

Cdt
cs_Danette Messages postés 54 Date d'inscription mardi 23 juillet 2002 Statut Membre Dernière intervention 16 septembre 2008
25 juin 2013 à 08:15
Oui mais non, tu as raison.. j'ai confondu. Je parlais plutôt d'une base de données et pas d'un array..
Ta source fonctionne bien et mon commentaire n'a rien a voir avec ta source (Il était tard...)
Salutation et sorry..
Dany
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
25 juin 2013 à 07:15
Bonjour, DANETTE,
Je ne comprends pas ta remarque, surtout la partie concernant l'ajout d'un "champ" supplémentaire. Je vois vraiment mal où tu pourrais l'insérer dans un array.
cs_Danette Messages postés 54 Date d'inscription mardi 23 juillet 2002 Statut Membre Dernière intervention 16 septembre 2008
25 juin 2013 à 02:15
Il est toujours délicat de supprimer un élément soit dans un array soit dans une BD. Délicat dans le sens ou si l'on supprime un record par erreur on ne peux plus le récupérer. C'est pour ça que personnellement je préfère mettre un champ supplémentaire de type boolean yes/no pour mentionner que cet enregistrement est supprimé et plus visible mais par contre il y a toujours la possibilité de le récuperer.
Cette remarque ne concerne pas spécialement ton code (ton application) mais plutôt pour tous les codes dont on manipule les données stockées que ce soit dans un BD ou un array (surtout les suppressions).
MFG; Dany
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 212
24 juin 2013 à 23:23
Bonjour, MIMIZANZAN,
Je crois que tu as compris (et t'en félicite) le but de cette demo.
Il n'est pas tant d'aboutir à un résultat plus rapide (encore que, dans certains cas ... oui) que de montrer ce qu'est, dans un array, le caractère nul de terminaison et comment l'utiliser.
Et tu as raison : le split et le join sont gourmands. Et pour ne rien te cacher, ils fonts tous deux appels, eux, au boucles que je "n'utilisais pas" ( pas directement, comme tu le vois, mais très surement et insidieusement via VB). Ces deux fonctions (split et Join), sont en fait des "bébelles" que Microsoft a ajoutés à VB5 pour justifier la mise sur le marché de VB6. Sans toutefois vraiment se "fouler"...
Et tu sais quoi ? Cette petite demo a pour but caché (il nous faut être aussi insidieux que Microsoft, de temps à autre) de démontrer que certaines fonctions ne sont que des leurres à bon marché. Cette demo n'est que le premier pas vers un "aboutissement" inattendu. ( comment dit-on ? Ah oui : LOL)
Amitiés.

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.