Microsoft 365 Extraire un texte spécifique contenu dans une cellule (et toutes ses occurrences)

louisvilg

XLDnaute Nouveau
Bonsoir à toutes et tous,

Je vous contacte car après avoir cherché sur le forum, je n'ai malheureusement pas trouvé réponse à mon problème.

J'aimerais pouvoir extraire un texte spécifique contenu dans une cellule ainsi que toutes ces occurrences dans une autre cellule.
Le texte recherché ici est "SAS-" et j'aimerais extraire les 4 chiffres (parfois 5) qui suivent ce pattern.

Lorsqu'il n'y a qu'une seule occurrence, pas de problèmes mais lorsqu'il y en a plusieurs, la combinaison des fonctions STXT et CHERCHE ne me permettent d'extraire seulement que le premier texte trouvé.

Je ne maîtrise pas encore toutes les fonctions d'excel mais il me semble que je peux utiliser les fonctions INDEX et EQUIV mais pour cela, il faut déjà avoir mis en forme le texte non?

Je vous ai mis en exemple le fichier sur lequel je travaille pour vous illustrer le problème.

En espérant que vous puissiez m'aider,
Je vous souhaite une agréable soirée!

Louis
 

Pièces jointes

  • Ex_traca.xlsx
    14.7 KB · Affichages: 15
Solution
Bonsoir Louis,
Un essai en PJ avec une fonction perso. Le nombre de SAS peut être grand sans problème. Avec :
VB:
Function ChercheSas(N$)
Dim i%, Chaine$, tablo
Chaine = ""
tablo = Split(N, "SAS-")
For i = 1 To UBound(tablo)
    If Not IsNumeric(Val(Mid(tablo(i), 5, 1))) Then
        Chaine = Chaine & "SAS-" & Left(tablo(i), 4) & " "
    Else
        Chaine = Chaine & "SAS-" & Left(tablo(i), 5) & " "
    End If
Next i
ChercheSas = Chaine
End Function
La syntaxe est :
Code:
=ChercheSas(D2)

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Louis,
Un essai en PJ avec une fonction perso. Le nombre de SAS peut être grand sans problème. Avec :
VB:
Function ChercheSas(N$)
Dim i%, Chaine$, tablo
Chaine = ""
tablo = Split(N, "SAS-")
For i = 1 To UBound(tablo)
    If Not IsNumeric(Val(Mid(tablo(i), 5, 1))) Then
        Chaine = Chaine & "SAS-" & Left(tablo(i), 4) & " "
    Else
        Chaine = Chaine & "SAS-" & Left(tablo(i), 5) & " "
    End If
Next i
ChercheSas = Chaine
End Function
La syntaxe est :
Code:
=ChercheSas(D2)
 

Pièces jointes

  • Ex_traca.xlsm
    21.8 KB · Affichages: 7

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Puisque Excel 365, une proposition par requête PowerQuery (PQ) .
Il y a des retours à la ligne (line feed) dans vos données, la requête s'appuie sur eux pour séparer les données avant de les regrouper.

Si vos données sont le résultat d'une importation , PQ pourrait se charger de l'importation et la transformation en une seule fois.

Vous trouverez également une proposition de macro largement commentée pour extraire les valeurs (elles sont extraites en colonne i mais vous pourrez changer).
VB:
Sub ExtraireNums()
    '
    ' Variables futurs tableaux
    ' Valeurs = données originales
    '       N = tableau issu du split de la valeur courante
    '       V = tableau de résultats
    Dim Valeurs As Variant, N As Variant, V As Variant
    '
    ' compteur de boucles
    Dim i As Integer, j As Integer
    '
    ' Travailler sur la feuille Sheet1
    With ThisWorkbook.Sheets("Sheet1")
        '
        ' Récupérer les valeurs de la troisièmme colonne de la region de A1
        Valeurs = .Range("A1").CurrentRegion.Columns(3)
        '
        ' Initialiser le tableau de résultat en conséquences
        ReDim V(1 To UBound(Valeurs) - 1, 1 To 1)
        '
        ' Parcourir toutes les données originales
        For i = 2 To UBound(Valeurs)
            '
            ' Spliter la donnée courante par retour à la ligne
            N = Split(Valeurs(i, 1), vbLf)
            '
            ' Parcourir le tableau résultant
            For j = 0 To UBound(N)
                '
                ' Sélectionner que les items qui contiennent SAS-
                ' Et faire les remplacements textuels idoines
                If N(j) Like "*SAS-*" Then V(i - 1, 1) = V(i - 1, 1) & _
                   Replace(Replace(Replace(N(j), "(", ""), ")", "") & ";", "SAS-", "")
            Next
        Next i
        '
        ' Afficher en I2 le tableau de résultats
        .Range("I2").Resize(UBound(V)) = V
    End With
End Sub

Cordialement
 

Pièces jointes

  • Ex_traca.xlsm
    36 KB · Affichages: 6
Dernière édition:

louisvilg

XLDnaute Nouveau
Bonjour sylvanu et Roblochon,

Je vous remercie beaucoup pour vos propositions.
Je pense retenir celle de sylvanu qui se rapproche de ce que je recherche.

Pour donner un peu plus de contexte pour Roblochon, je fais une exportation depuis un logiciel un peu vieillot (exporté sous Excel 2010 me semble t-il) des différentes colonnes que vous avez pu voir dans l'exemple fourni. Je n'ai donc pas la main sur la mise en forme des données et je souhaite garder le préfixe "SAS-" qui ont un sens pour du post traitement suite à l'extraction requise.

Cependant, juste une petite question, n'aurait-il pas été possible de faire cela par une combinaison de formules? C'est juste pour savoir à partir de quel moment il faut savoir s'arrêter avec les formules et passer en macro... 😅

Dans tous les cas, merci à vous deux !
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
C'est juste pour savoir à partir de quel moment il faut savoir s'arrêter avec les formules et passer en macro
C'est surtout un question de feeling et de niveau.
Par formules on peut faire plein de choses ... si on sait le faire. Et là, mes connaissances sont limitées.
Ensuite ça peut devenir compliqué surtout si on peut obtenir moult résultats, le VBA peut alors être plus simple.
 

louisvilg

XLDnaute Nouveau
Bonjour à tous,

Je me permets de rajouter une question au topic.
Suite à l'extraction des données, j'aimerais trouver la correspondance entre les valeurs extraites et la valeur de la cellule adjacente.

Pour reprendre l'exemple précédent, j'ai plusieurs feuilles contenant les valeurs "SAS" qi correspondent aux valeurs "SWAS".
Dans une autre feuille, j'ai la totalité de la liste des "SAS" où j'aimerais pouvoir afficher la valeur des "SWAS" (cellule adjacente).

Pour que ce soit moins obscur, les "SAS" représentent des exigences et les "SW_AS" des sous-exigences (associées à des tests).

J'ai essayé de faire une fonction qui permet de faire ça qui prend pour arguments:
N: la cellule contenant la valeur "SAS"
SWAS_Sheet: le texte correspondant au titre de la feuille dans laquelle je cherche la valeur de la "SAS" pour retourner la valeur correspondante "SWAS"
SWAS_Matrix: la matrice dans laquelle il faut chercher la valeur "SAS"

VB:
Function ChercheSWAS(N As Range, SWAS_Sheet As String, SWAS_Matrix As Range)
'déclaration des variables : , SWAS_Sheet As String
Dim SAS_cell As Range, SWAS_Cell As Range

With ActiveWorkbook.Sheets(SWAS_Sheet)
    With SWAS_Matrix
        SAS_cell = .Find(What:=N.Value, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    End With
End With

SWAS_Cell = SAS_cell.FindNext
ChercheSWAS = SWAS_Cell.Value

End Function

Sauf que je me retrouve avec une erreur #VALEUR.

J'ai également essayé de faire ça avec une fonction RECHERCHEV mais sans succès.

N'étant pas très expérimenté, je ne vous cache pas que je sèche sur comment réussir à trouver la solution.

En PJ, vous trouverez le tableau en guise d'exemple.

Note: dans un soucis de confidentialité, j'ai supprimé toutes les colonnes de texte.
Dans les feuilles "BASE 8.x.y", les colonnes "A" sont le résultat de la fonction "ChercheSas".
Dans la feuille "SAS-16.0", je voudrais retourner la valeur de la colonne "B" des feuilles "BASE 8.x.y" lorsque la valeur "SAS_RADIO_R8-xxxx" est trouvé dans l'une de ces feuilles.

Petit exemple de ce que j'aimerais obtenir:
Code:
Find.Sheet(SAS-16.0).Cell(A1039) => Cell(D1039).Value = "SW_AS_283" (FoundIn.Sheet(BASE 8.1.1))
Find.Sheet(SAS-16.0).Cell(A1046) => Cell(D1046).Value = "SW_AS_282" (FoundIn.Sheet(BASE 8.1.1))
...
Find.Sheet(SAS-16.0).Cell(A1049) => Cell(E1049).Value = "SW_AS_330" (FoundIn.Sheet(BASE 8.1.2))
etc.

Par contre, il est possible qu'il y ait plusieurs "SW_AS_xxx" pour une seule et même "SAS". Je pensais que ça pouvait être assez simple à implémenter mais j'ai l'impression que c'est plus complexe que ce que j'imaginais...

J'espère que mes explications sont claires o_O
 

Pièces jointes

  • SW_AS_TRACEABILITY_Example.xlsm
    202.1 KB · Affichages: 5
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Loius,
Demande de précision :
Dans la colonne des SAS on trouve 4 SAS_RADIO_R8-5359, donc on remonte les 4 SW_xx. Ca, ok.
Mais en ligne 16 on a 5359 ET en colonne B 9 SW_xx sans intitulé en colonne A.
Doit on aussi remonter ces 9 là ?
Ce qui serait plus complexe.
 

louisvilg

XLDnaute Nouveau
Bonjour Loius,
Demande de précision :
Dans la colonne des SAS on trouve 4 SAS_RADIO_R8-5359, donc on remonte les 4 SW_xx. Ca, ok.
Mais en ligne 16 on a 5359 ET en colonne B 9 SW_xx sans intitulé en colonne A.
Doit on aussi remonter ces 9 là ?
Ce qui serait plus complexe.
Bonjour Sylvanu,
Alors si le contenu de la colonne A est vide, on ne remonte rien.
Généralement, s'il n'y a pas de contenu pour une SW_AS donnée, c'est qu'elle a été créé sans y associer une exigence SAS.
Du coup, c'est plutôt arrangeant non? 😁
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re bonjour Louis,
Un essai en PJ.
C'est une mauvaise idée de passer par une fonction car :
1- A chaque cellule on va analyser toute une page, ça va être très très long. Il vaut mieux passer
2- Le calcul complet se relancera à chaque modif de cellule
Il vaut mieux passer par une macro, on profite des arrays d'accès beaucoup plus rapide, et l'update se fait sur demande.
J'ai modifié certains noms de feuille pour que le nom soit exactement le même que les noms présent en ligne 1.
( NB : certaines feuilles sont absentes, je vérifie leur présence avant de les traiter )
A bien vérifier car j'ai vérifié le fonctionnement de la macro mais pas la grande, grande matrice résultat.
 

Pièces jointes

  • SW_AS_TRACEABILITY_Example (1).xlsm
    194.9 KB · Affichages: 4

louisvilg

XLDnaute Nouveau
Re bonjour Louis,
Un essai en PJ.
C'est une mauvaise idée de passer par une fonction car :
1- A chaque cellule on va analyser toute une page, ça va être très très long. Il vaut mieux passer
2- Le calcul complet se relancera à chaque modif de cellule
Il vaut mieux passer par une macro, on profite des arrays d'accès beaucoup plus rapide, et l'update se fait sur demande.
J'ai modifié certains noms de feuille pour que le nom soit exactement le même que les noms présent en ligne 1.
( NB : certaines feuilles sont absentes, je vérifie leur présence avant de les traiter )
A bien vérifier car j'ai vérifié le fonctionnement de la macro mais pas la grande, grande matrice résultat.
Ca marche, merci beaucoup d'avoir pris le temps pour résoudre le problème.
Je comprends mieux pourquoi je n'arrive pas à faire fonctionner ce principe par le biais d'une fonction.
Je continuais à essayer de trouver une solution mais j'ai l'impression que c'est compliqué de faire passer une plage de données en paramètre d'une fonction (en pas à pas, je n'arrive pas à voir la valeur de ce range justement).

Je vais analyser ta proposition, merci encore !
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
L'erreur est de faire une approche par fonction pour les raisons que j'ai indiqué.
Sur mon PC qui est assez rapide ça met quand même 6s.
( Utilisez cette V2 qui est plus rapide, la V1 met 12s. En fait je n'écrit que quand le résultat est non vide, et dans votre fichier la majorité des résultats sont vides, d'où le gain en temps )
 

Pièces jointes

  • SW_AS_TRACEABILITY_Example (2).xlsm
    195.1 KB · Affichages: 5

louisvilg

XLDnaute Nouveau
Bonjour Sylvanu,

Je reviens vers toi tardivement mais je tenais à te remercier pour ton aide, j'ai épluché la macro que tu suggères car la plupart des fonctions m'étaient inconnues... j'ai saisi le principe !

Bref, merci beaucoup pour ton aide !
 

Discussions similaires

Statistiques des forums

Discussions
311 733
Messages
2 082 019
Membres
101 872
dernier inscrit
Colin T