XL 2021 Extraire valeur entre caractère par VBA

Rabeto

XLDnaute Occasionnel
Bonjour,

J'aimerai svp extraire la valeur entre 2 caractères par VBA (premier caractère / et second -)

Valeur à extraire en rouge entre (/ et -)= /XXX/YYY/JJ-MM-AAA-QQ-RR-VALEUR-VILLE-PRIX

Voici le code à adapter selon les besoins : .Cells(i + 3, 12).Value = Split(Split(tbl1(i), "/")(3), "-")(-6)

Merci pour votre aide,
 
Solution
Bonjour à tous ,


Si V est la valeur à traiter alors l'expression suivante extrait la chaine entre le dernier "/" et le cinquième "-" :
VB:
= Mid(Left(V, InStr(Replace(V, "-", "^", , 4), "-") - 1), InStrRev(V, "/") + 1)

Phil69970

XLDnaute Barbatruc
Bonjour @Rabeto

Je te propose :
20240604_115841.gif

VB:
Sub Extraction()
MaValeur = [A1] 'A adapter bien sur
MsgBox Left(Split(MaValeur, "/")(UBound(Split(MaValeur, "/"))), 15)
End Sub
 

patricktoulon

XLDnaute Barbatruc
Merci Phil69970 et mapomme

Que signifie la valeur 4 dans la réponse de mapomme svp ?
est ce la position de la dernière valeur à extraire venant de la fin ?
c'est assez simple comme raisonnement
il fait un replace en mémoire des "-" sauf qu'il le fait sur la 4 premiers seulement

le instr est fait dans un anonyme
il est facile ensuite de repérer le premier "\" en partant de la droite " et le 5eme "-" puisqu'il est tout seul
 

AtTheOne

XLDnaute Accro
Supporter XLD
Bonjour à toutes et à tous
une petite fonction ...
VB:
Function ExtrairePartie(valeur As Variant) As String

     Dim txt As String
     txt = valeur
     ExtrairePartie = ""
     nbSlash = Len(txt) - Len(Replace(txt, "/", ""))
     nbMoins = Len(txt) - Len(Replace(txt, "-", ""))
     If nbSlash <> 3 Or nbMoins <> 7 Then Exit Function
     ExtrairePartie = Split(Split(WorksheetFunction.Substitute(txt, "-", "¤", 5), "/")(3), "¤")(0)
    
End Function

Exemple en pièce jointe
 

Pièces jointes

  • Extraire valeur entre caractère par VBA.xlsm
    14.8 KB · Affichages: 1

patricktoulon

XLDnaute Barbatruc
re
Perso je pense que @mapomme a donné une solution précise
et me semble t il la plus économique et simple a comprendre

alors oui si vous voulez transformons en fonction mais pas la peine de faire de l'UAG
VB:
Function PartOfchain(v, FirstChar$, charplit$, IndexTableChar)
PartOfchain = Mid(Left(v, InStr(Replace(v, charplit, "^", , IndexTableChar), charplit) - 1), InStrRev(v, FirstChar) + 1)
End Function
la formule
=PartOfchain(A1;"/";"-";4)
pas la peine d'en rajouter les argument sont suffisamment explicites
comme ca on a pas besoins de savoirs combien mesure les chaines
entres les charsplit (en l'occurrence ici les "-")
 

jurassic pork

XLDnaute Nouveau
En utilisant les expressions régulières :
VB:
Sub Capture_JP()
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
regex.pattern = "/(\w+-\w+-\w+-\w+-\w+)-" '
On Error GoTo Erreur
        Set matches = regex.Execute([A1])
        Debug.Print matches(0).submatches(0)
Exit Sub
Erreur:
  Debug.Print "Rien"
End Sub
Le motif (pattern) permet de "capturer" ce qui est entre parenthèses sachant que \w+ signifie 1 ou plus caractères alphanumériques
 

patricktoulon

XLDnaute Barbatruc
bonsoir @AtTheOne
tu es loin d'être ignorant 🤣
UAG =usine à gaz ou si tu préfère une lionelyte aigue 🤣🤣🤣

plus sérieusement je dis usine à gaz (sans méchanceté) par ce que 3 split (me semble til)
ca fait beaucoup pour une petite chaine
je suis d'accords avec toi sur le besoins de gestion d'erreur
perso je ne l'ai pas fait tout simplement par ce que là encore on peut laisser excel faire en englobant la formule dans un SIERREUR(.......)
peut être effectivement un on error resume next tout cours au cas ou
sinon après tout les chemins mènent à Rome tout dépend des basket que l'on porte
les ampoules ça fait mal 🤣
 

AtTheOne

XLDnaute Accro
Supporter XLD
Re
3 split (me semble ti
Hé non ! 2 et la fonction Excel SUBSTITUTE. et sans gestion d'erreur ça peut se résumer à
VB:
ExtrairePartie = Split(Split(WorksheetFunction.Substitute(txt, "-", "¤", 5), "/")(3), "¤")(0)
Pas trop loin de
VB:
PartOfchain = Mid(Left(v, InStr(Replace(v, charplit, "^", , IndexTableChar), charplit) - 1), InStrRev(v, FirstChar) + 1)
;)
Mais c'est moins adaptable que ta proposition avec ses 4 paramètres ...

1717526247267.png


En parlant UAG des nouvelles de @Usine à gaz ?
A bientôt
 

Discussions similaires

Statistiques des forums

Discussions
312 922
Messages
2 093 644
Membres
105 775
dernier inscrit
assen