Suppressions dans une chaine de caractères - VB/VBA/VBS - Programmation
Marsh Posté le 18-10-2013 à 11:44:02
fabien888 a écrit : Bonjour, Merci infiniment par avance. |
Pour chaque chaine :
1) Découpe la chaine dans un tableau grâce à Split()
2) Parcours le tableau et enregistre dans une collection les prénoms, avec le prénom en clé de collection (pour ne pas l'enregistrer 2 fois)
3) Une fois le parcours du tableau fini, parcoures la collection et tu construis la chaine finale
En moins de 10 lignes c'est fait
Marsh Posté le 18-10-2013 à 15:41:17
Bonjour,
Merci beaucoup pour le process Agressive Perfector, mais quelqu'un peut-il me donner un bout de code correspondant?
Bon week-end à tout le monde, et encore merci d'avance.
Fabien
Marsh Posté le 18-10-2013 à 16:16:30
fabien888 a écrit : Bonjour, |
Rapidos en Vb.net (ça doit être à peu près pareil en vba) :
Code :
|
Bon week end (c'est bien parce que c'est vendredi car c'est rare que je donne du code tout cuit sur un forum )
Marsh Posté le 18-10-2013 à 16:23:44
En VBA par une autre méthode :
Code :
|
C'est bien parce qu'il a déjà donné un code tout fait...
Marsh Posté le 18-10-2013 à 18:01:50
Bonjour, bonjour,
en VBA j'hésite entre deux manières : via l'object Dictionary, un peu comme une collection
ou via la fonction EQUIV de la feuille de calcul.
Voici un exemple avec cette dernière (Match en VBA) :
Code :
|
C'est dommage d'utiliser Split et ne pas penser à Join en retour …
Marsh Posté le 18-10-2013 à 19:59:29
J'aimais bien l'idée de MaybeEijOrNot avec la fonction Filter mais je trouvais dommage que l'ordre d'origine du texte soit chamboulé …
Voici l'optimisation d'utilisation de cette fonction tout en conservant l'ordre :
Code :
|
Seulement cinq lignes de code pour torcher la fonction sans doublon, je ne ferais pas plus court !
Le bon week-end !
Marsh Posté le 19-10-2013 à 13:30:24
En même temps mon code était faux, j'avais remarqué que ça changeait d'ordre, du coup j'étais entrain de corriger puis je me suis dit que ce n'était pas important, du coup je suis resté entre 2 idées.
Correction :
Code :
|
Et en effet autant utiliser la méthode Join si on y pense.
En fin de compte ton code est un peu plus court mais tu triches sur le IIf car autrement ça donne juste une ligne de moins car je ne peux pas passer par une boucle for car il ne réinterpréterai pas la condition de fin (taille du tableau qu'on fait varier à l'intérieur de la boucle) après chaque tour de boucle.
Marsh Posté le 20-10-2013 à 13:01:17
MaybeEijOrNot a écrit : […] mais tu triches sur le IIf car autrement ça donne juste une ligne de moins car je ne peux pas passer par une boucle for car il ne réinterpréterai pas la condition de fin (taille du tableau qu'on fait varier à l'intérieur de la boucle) après chaque tour de boucle. |
Je ne te comprends pas du tout !
La fonction IIf sert juste à insérer le séparateur à partir du deuxième élément de la liste filtrée …
Une boucle For … Next n'est utile que lorsqu'on connaît un nombre déterminé d'éléments à traiter à l'avance
comme dans le cas de ma première proposition.
Dans ma deuxième, la plus efficace, toute la beauté réside dans le fait de ne pas savoir de combien d'éléments sera constituée
la liste finale et dans la réduction automatique du nombre d'éléments de la liste source au fur et à mesure du filtrage;
aucune triche, juste de la logique appliquée à la particularité d'une fonction …
Marsh Posté le 20-10-2013 à 14:06:54
Non mais le IIf te permet d'économiser des lignes par rapport à If classic, c'est tout :
Code :
|
Tu es à 9 lignes normalement sans ce IIf, moi aussi je veux bien avoir un WWhile et passer à 4 lignes.
Marsh Posté le 20-10-2013 à 16:00:08
Bon, c'est une fonction qui a le mérite d'exister !
Et sans, je n'aurais besoin que d'une seule ligne supplémentaire, soit par l'utilisation d'une variable intermédiaire :
Code :
|
… soit avec un simple If :
Code :
|
Bref, quel que soit l'écriture à 5 ou 6 lignes de code,
l'auto-réduction de la liste source grâce à la fonction Filter s'avère simple & efficace !
Marsh Posté le 21-10-2013 à 15:15:34
Parmi mes deux propositions, telles quelles, la première est la meilleure !
Car la fonction Filter est piégeuse, elle agit comme un filtre Contient !
Pour preuve :
Code :
|
La fonction SansDoublon utilisant Filter élimine Jean-Marie !
En fait comme Marie le précède dans la liste, Jean-Marie contenant bien Marie …
L'astuce consiste alors à conserver le séparateur devant chaque élément de la liste source durant le filtrage :
Code :
|
Cette fois c'est la bonne ! Et non, raté ‼
Marsh Posté le 22-10-2013 à 12:25:06
En fait même problème avec Marie & Marie-Pierre ou encore Jean & Jean-Marie !
Il faut donc borner de chaque côté …
J'ai commencé à le faire avec l'espace mais alors "Jean - Marie" serait de nouveau éliminé si Jean ou Marie le précède !
Allez, la der de der !
Code :
|
Moins simple mais toujours efficace !
Un bon p'tit cas d'école, je comprends mieux maintenant pourquoi je pense moins à utiliser Filter !
Comme quoi souvent la première idée …
Marsh Posté le 18-10-2013 à 07:34:58
Bonjour,
j'ai un problème à résoudre sous VBA: j'ai des chaînes de caractères avec plusieurs prénoms séparés par des "/", exemple:
"Emanuel/Nathan/Victorien/Emanuel/Julien/Patrice/Patrice"
Je souhaiterai supprimer les prénoms en doubles, cela donnerai donc:
"Emanuel/Nathan/Victorien/Julien/Patrice"
Avez-vous une idée d'un code permettant cela? Sachant qu'il y a une centaines de prénoms différents.
Je recherche surtout un exemple de code qui fonctionne.
Merci infiniment par avance.
Fabien
Message édité par fabien888 le 18-10-2013 à 07:35:34