Extraction d’un motif à partir d’un texte (Microsoft Excel)
Tom a une feuille de calcul qui contient environ 20 000 cellules pleines de données textuelles. À partir de ces cellules, il doit extraire un modèle de texte spécifique. Le modèle est – # où chaque # est un chiffre. Ce modèle n’apparaît pas à un endroit défini dans chaque cellule. Tom se demande s’il existe un moyen d’extraire les informations souhaitées.
Il existe plusieurs façons d’aborder ce problème, et la solution adaptée à vos besoins dépendra des caractéristiques des données avec lesquelles vous travaillez. Si vous savez que le seul endroit dans vos données où vous aurez un tiret est dans votre modèle, vous pouvez alors supprimer la présence du tiret en utilisant une formule telle que la suivante:
=MID(A1,FIND("-",A1)-2,8)
Cela trouve le tiret, puis saisit les huit caractères commençant deux caractères à gauche du tiret. Cela ne fonctionnera évidemment pas s’il y a des tirets à d’autres endroits dans le texte ou s’il est possible d’avoir des « modèles » qui incluent des non-chiffres (comme 12-34B32) et que vous voulez que ceux-ci soient exclus. Dans ce cas, vous aurez besoin d’une formule beaucoup plus complexe:
=IF(ISERROR(INT(MID(A1, FIND("-", A1, 1)-2, 2)) & INT(MID( A1, FIND("-", A1, 1)+1, 5))), "", MID(A1, FIND("-", A1)-2, 8))
Cela inclut un composant de vérification des erreurs qui détecte si les caractères juste avant le tiret et juste après le tiret contiennent autre chose que des chiffres. S’ils le font, rien n’est retourné.
La seule chose que ces approches de formule ne font pas est de gérer les situations où il peut y avoir plus d’une occurrence du modèle dans la même cellule. Dans ce cas, une macro est la meilleure approche. Ce qui suit va extraire les modèles valides et les placer dans une nouvelle feuille de calcul appelée «Résultats».
Sub ExtractPattern() On Error Resume Next Set SourceSheet = ActiveSheet Set TargetSheet = ActiveWorkbook.Sheets("Results") If Err = 0 Then Worksheets("Results").Delete End If Worksheets.Add ActiveSheet.Name = "Results" Set TargetSheet = ActiveSheet Cells(1, 1).Value = "Found Codes" Cells(1, 1).Font.Bold = True iTargetRow = 2 SourceSheet.Select Selection.SpecialCells(xlCellTypeLastCell).Select Range(Selection, Cells(1)).Select For Each c In Selection.Cells If c.Value Like "##-#####" Then sRaw = c.Value iPos = InStr(sRaw, "-") Do While iPos > 0 If iPos < 3 Then sRaw = " " & sRaw iPos = iPos + 2 End If sTemp = Mid(sRaw, iPos - 2, 8) sRaw = Mid(sRaw, iPos + 6, Len(sRaw)) If sTemp Like "##-#####" Then TargetSheet.Cells(iTargetRow, 1) = sTemp iTargetRow = iTargetRow + 1 Else sRaw = Mid(sTemp, 4, 5) & sRaw End If iPos = InStr(sRaw, "-") Loop End If Next c End Sub
Notez que la macro utilise la fonction Like à deux endroits. La première instance détermine si le modèle se produit n’importe où dans la cellule et la seconde instance est utilisée pour déterminer si les caractères extraits correspondent exactement au modèle souhaité.
_Note: _
Si vous souhaitez savoir comment utiliser les macros décrites sur cette page (ou sur toute autre page des sites ExcelTips), j’ai préparé une page spéciale qui comprend des informations utiles.
lien: / excelribbon-ExcelTipsMacros [Cliquez ici pour ouvrir cette page spéciale dans un nouvel onglet de navigateur]
.
ExcelTips est votre source pour une formation Microsoft Excel rentable.
Cette astuce (7348) s’applique à Microsoft Excel 97, 2000, 2002 et 2003. Vous pouvez trouver une version de cette astuce pour l’interface ruban d’Excel (Excel 2007 et versions ultérieures) ici:
link: / excelribbon-Extracting_a_Pattern_from_within_Text [Extraction d’un motif à partir du texte]
.