Résolu par Vgendron - Fonction (ou sub) qui remplacerait "texte..._Nb" par "texte..._0Nb"

zebanx

XLDnaute Accro
Bonjour à tous,

Il y a toujours quelques fichiers qui contiennent dans une colonne des valeurs ayant une forme de sérialisation de type "référence_1", "reference_2" , "reference_15"...
Cela pose des problèmes de classement quand on la référence est identique, le système classant par exemple "reference_2" après "reference_19".
-> Si la cellule contenait "reference_01"... il n'y aurait pas de problème.

L'un ou l'une d'entre vous aurait-elle SVP développée une macro ou une fonction qui permette de SUBSTITUER pour une valeur de cellule choisie la valeur "_Nb" par "_0Nb" et dans l'affirmative, pourriez-vous me communiquer svp ce code (non retrouvé sur des recherches internet) ?

S'il y a une formule, ce serait même idéal (en considérant que "_Nb" sont les derniers caractères mais que la reference dans "reference_Nb" est de longueur variable et pourrait contenir elle-même des caractères spéciaux dont "_").

Vous en remerciant par avance, bon apm
zebanx
 
Dernière édition:

chris

XLDnaute Barbatruc
Bonjour

Il suffit d'utiliser GAUCHE soit en précisant 10 caractère si c'est toujours reference_ soit en imbriquant CHERCHE pour trouver le _ puis TEXTE pour formater la suite obtenu avec STXT
Code:
=GAUCHE(A2;10)&TEXTE(STXT(A2;11;10)*1;"00")

Eventuellement imbriquer dans un contrôle d'erreur si ta colonne n'est pas homogène...
 

zebanx

XLDnaute Accro
Bonjour Chris,

Ta méthode (gauche + texte "00") est très utile et je t'en remercie.

Le nombre de caractères avant le dernier "_" et la répétition possible du "_" avant ce dernier "_" me posait par contre des difficultés par rapport à ce que tu indiquais.

En reprenant les exemples historisés communiqués sur le forum, la "bidouille" en partant de tes indications donne une formule qui permet de bosser.

Après, il faut un copie-valeur et on peut trier dans le bon ordre.

Il y a surement moyen de simplifier mais bon...ça correspond à ce que je cherchais à obtenir comme résultat.:p

Si quelqu'un a cependant un code VBA ou une fonction, je reste preneur.


++
zebanx
 

Pièces jointes

  • remplacer _x par _0x en vba.xls
    59 KB · Affichages: 17
Dernière édition:

zebanx

XLDnaute Accro
Bonjour Vgendron

Pas mal et merci !
En repartant de ton code, on peut faire aussi un extraire_gauche sur le premier "_", c'est utile.
-----
Function extract_left1(target As Range)
Dim t As Variant
Application.Volatile
t = Split(target, "_")
nb = LBound(t)
extract_left1 = Format(t(nb), "00")
End Function
----

Mais serait-il STP possible de faire une extraction gauche sur la dernière occurence "_" retrouvée (qui me permettrait de compiler les deux fonctions : extraire gauche 2 + numéro ) sachant que le nombre de "_" peut être aléatoire ?

Te remerciant par avance pour tes indications, bonne journée
zebanx.
 

vgendron

XLDnaute Barbatruc
pas bien compris la question

dans le cas où il y a plusieurs "_" et le numéro à la fin, tu voudrais pouvoir récupérer le numéro (ma fonction proposée ) ET l'ensemble des éléments avant le numéro: correct?
dans ce cas..
il "suffit" de supprimer le dernier élément du tableau issu du split (élément qui contient le numéro)
et de reconstituer le tableau réduit avec la fonction Join
VB:
Function avantNum(target As Range)
Dim t As Variant
Application.Volatile
t = Split(target, "_")
nb = UBound(t)
ReDim Preserve t(nb - 1)

avantNum = Join(t, "_")
End Function
 

zebanx

XLDnaute Accro
C'est exactement ce que j'attendais Vgendron et je t'en remercie !

On arrive bien à une fonction qui permet de partir d'une liste avec " reference_1" et d'obtenir le résultat souhaité d'un coup !
;)
exemple (avec 3"_" et longueur partie gauche avant dernier "_" non définie) : definition_valeur_retenue_1 deviendra definition_valeur_retenue_01

Sur les 2000 lignes à traiter afin d'obtenir un tri correct des lignes envoyées qui terminent par _x au lieu de _0x, ça va être super rapide grâce à toi !

Bonne soirée
++
----
Function extract_01(target As Range)
Dim t As Variant
Application.Volatile
t = Split(target, "_")
nb = UBound(t)
extract_01 = Format(t(nb), "00")
ReDim Preserve t(nb - 1)
extract_01 = Join(t, "_") + "_" + extract_01
End Function
 
Dernière édition:

Discussions similaires

Réponses
16
Affichages
476

Statistiques des forums

Discussions
312 206
Messages
2 086 203
Membres
103 157
dernier inscrit
youma