Extraire plusieurs chaines de caractères d'une colonne
Bonjour,
J'ai un programme avec une boucle qui parcourt une colonne j'arrive a extraire seulement la première chaine mais je n'arrive pas a récupérer la deuxième chaine de caractère qui est entre parenthèses.
Et c'est pour cela que j'ai mis la ligne "DeuxiemeCh = ExtraireChaineDelimitee(ChaineOriginale2, LimiteGauche2, LimiteDroite2)" en commentaire pour l'instant.
Le but étant de lire (extraire) les données entre les parenthèses, exemple cellule O1: (Z123_AA.E4) … (Z12_CESJ12AA.19) je voudrais récupérer Z123_AA.E4 et Z12_CESJ12AA.19 et ensuite a la place de "MsgBox PremiereCh" dans le code je voudrais chercher ces chaine de caractères (Z123_AA.E4 et Z12_CESJ12AA.19) sur la feuille 2 colonnes E et mettre en couleur rouge la cellule
Merci d'avance
Voici le fichier excel et mon code la première partie étant une fonction et le corps principal est après :
Public Function ExtraireChaineDelimitee(ChaineSource As String, Optional LimiteAvant As String = "", Optional LimiteApres As String = "")
Dim ExtraitPositionDebut As Variant
On Error GoTo FunctionErreur
If InStr(1, ChaineSource, LimiteAvant) = 0 Then
ExtraireChaineDelimitee = CVErr(xlErrNA)
Exit Function
Else
ExtraitPositionDebut = InStr(1, ChaineSource, LimiteAvant) + Len(LimiteAvant)
End If
If LimiteApres = "" Then
ExtraitPositionFin = Len(ChaineSource)
Else
ExtraitPositionFin = InStr(1, ChaineSource, LimiteApres) - 1
End If
ExtraireChaineDelimitee = Mid(ChaineSource, ExtraitPositionDebut, ExtraitPositionFin - ExtraitPositionDebut + 1)
Exit Function
FunctionErreur:
ExtraireChaineDelimitee = CVErr(xlErrNA)
'ExtraireChaineDelimitee = ""
End Function
Sub ExempleExtractionDeChaine()
Application.ScreenUpdating = False
'On Error GoTo ExempleErreur
Dim ChaineOriginale1 As String
Dim ChaineOriginale2 As String
Dim LimiteGauche As String
Dim LimiteDroite As String
Dim LimiteGauche2 As String
Dim LimiteDroite2 As String
Dim Var As String
Dim Col_tests As String
Dim PremiereCh As String
Dim DeuxiemeCh As String
Set FL1 = Worksheets("Feuil1")
NoCol = 15
derniereLigne = 10
'Limite 1ere chaine
LimiteGauche = "("
LimiteDroite = ")"
'Limite 2e chaine
LimiteGauche2 = "... ("
LimiteDroite2 = ")"
'boucle qui parcourt la colonne
For NoLig = 1 To derniereLigne
Worksheets("Feuil1").Select
Var = FL1.Cells(NoLig, NoCol)
Col_tests = FL1.Cells(NoLig, NoCol).Offset(, -3).Value
If Col_tests <> "" Then
ChaineOriginale1 = Var
ChaineOriginale2 = Var
PremiereCh = ExtraireChaineDelimitee(ChaineOriginale1, LimiteGauche, LimiteDroite)
' DeuxiemeCh = ExtraireChaineDelimitee(ChaineOriginale2, LimiteGauche2, LimiteDroite2)
MsgBox PremiereCh
' MsgBox DeuxiemeCh
End If
' Exit Sub
'ExempleErreur:
' MsgBox "Une erreur est survenue..."
Next
Set FL1 = Nothing
Application.ScreenUpdating = True
End Sub
Bonjour,
Utilise les expressions régulières
Sub test()
For i = 2 To 5
For j = 1 To 5
Cells(i, j + 1) = extraction(Cells(i, 1).Value, Cells(1, j + 1).Value, Cells(1, 1).Value)
Next
Next
End Sub
Function extraction(source As String, indice As Integer, code As String)
extraction = ""
On Error Resume Next
Set obj = CreateObject("vbscript.regexp")
obj.Pattern = code
obj.Global = True
Set res = obj.Execute(source)
extraction = res(indice - 1)
End Functionavec
\(([A-Z1-9_.])+\)
Bonjour. Proposition pour les 4 lignes proposées
Sub Macro1()
Dim i As Integer, tablo() As String
For i = 1 To 4
tablo = Split(Cells(i, 15), "(")
tablo(1) = Left(tablo(1), Len(tablo(1)) - 4)
Cells(i, 12) = tablo(1)
tablo(2) = Left(tablo(2), Len(tablo(2)) - 1)
Cells(i, 13) = tablo(2)
Next i
End SubMerci pour votre réactivité, enfaite c'est plus compliqué que ca car la chaine que je souhaite extraire peut varier en taille exemple "Z12_CESJ12AA.19" peut être aussi "Z12_CESJ12AA.9" c'est pour cela que je souhaite utiliser ce qui est entre les parenthèses et non en comptant le nombre de caractère en partant de la gauche.
Et erreur de copier coller dans la feuille 2 je n'ai pas de parenthèses c'est pour ca que je veux extraire uniquement ce qu'il ya dedans , exemple : Z123_AA.E4
c'est pour cela que je souhaite utiliser ce qui est entre les parenthèses et non en comptant le nombre de caractère en partant de la gauche
donc ma solution en expression régulière fonctionne
sinon, dans le même esprit qu'optimix, voici une fonction utilisant split
Sub test()
For i = 2 To 5
tbl = Split(Cells(i, 1), "(")
For j = 1 To UBound(tbl)
Cells(i, j + 1) = Split(tbl(j), ")")(0)
Next
Next
End Sub
la chaine que je souhaite extraire peut varier en tailleJe pense que tu as dû lire le code un peu en diagonale, car les chaînes peuvent être de longueurs variables. C'est la fonction Left(Len()) qu'il faut regarder et non pas la fonction Left(). Le principal est que tu aies une solution.
Merci à vous deux, avec split en effet sa marche très bien
Bonne journée