Extraction dans une chaine de caractere

biloute91

XLDnaute Occasionnel
Bonjour le forum,

j'ai une diffciulté concernant une extraction d'une donnée numerique dans une chaine de caractère alphanumerique.Je souhaite extraire un numero à 6 chiffres commençant par 5 et se situant de manière aleatoire dans la chaine de caractère.
J'ai environ 6000 lignes et l'objectif est de voir si ce numéro se repète plusieurs fois.
Merci par avance de votre aide
 

biloute91

XLDnaute Occasionnel
Re : Extraction dans une chaine de caractere

Pour etre plus precis, il s'agit d'echange de mail dont l'objet est repris systematiquement avec cette référence numerique accompagné d'un texte aplha.
L'objectif est de pouvoir comptabiliser le nombre d'echange de mail dont l'objet contient cette réfénce numerique.
Je joins un exemple d'objet dans le fichier.

Merci
 

Pièces jointes

  • objet.xls
    13.5 KB · Affichages: 66
  • objet.xls
    13.5 KB · Affichages: 65
  • objet.xls
    13.5 KB · Affichages: 71

matt916

XLDnaute Nouveau
Re : Extraction dans une chaine de caractere

Bonjour à tous les deux,

En attendant le fichier demandé par PierreJean, j'ai écrit ça pour un besoin similaire il y a peu :

ATTENTION : sélectionner la colonne à analyser avant de commencer !!!!

Dim Facture As String
Dim x As Long
Dim NumFacture As String
Sub NumeroFacture()

'indiquez dans une cellule le numéro de facture inscrit dans le libellé
Application.ReferenceStyle = xlR1C1

ColonneResultat = InputBox("numéro de colonne pour afficher le résultat (N°)")

For Each Cell In Selection
If UCase(Cell.Text) Like "*5*" Then 'on recherche le premier "5" du libellé
Facture = Cell.Value
x = InStr(UCase(Facture), "5") 'Position du premier 5 trouvé
NumFacture = Mid(Facture, x, 6)
'Right(Facture, Len(Facture) - x - 1)
Cell.Offset(0, 1).Value = NumFacture
End If
Next
Application.ReferenceStyle = xlA1

End Sub

A+
Matt
 
Dernière édition:

matt916

XLDnaute Nouveau
Re : Extraction dans une chaine de caractere

Bonjour PierreJean,

Juste une petite question :
Dans ton fichier, la boucle "For p=1 to 4..." permet de vérifier que l'on a bien affaire à un chiffre, n'est-ce pas ?

Je trouve cette boucle plus compliquée mais également plus rigoureuse que la mienne ;-)

a+
Matt
 

SubEndSub

XLDnaute Occasionnel
Re : Extraction dans une chaine de caractere

Bonjour chez vous



En partant du fichier de biloute91

Une autre façon de faire

Code:
Sub macro()
Dim c As Range
Dim RegEx As Object
Set RegEx = CreateObject("vbscript.regexp")
With RegEx
    For Each c In Range("A1", Range("B" & Rows.Count).End(xlUp))
        .Pattern = "(5)[0-9]{5}"
        .Global = True
        If .test(c.Value) Then
            c.Offset(, -1).Value = CDbl(.Execute(c.Value)(0))
        End If
    Next c
End With
Set RegEx = Nothing
End Sub

Une fois les chiffres extraits, on peut utiliser le filtre automatique (ou élaboré) pour voir s'il y a des doublons.
 

Pyrof

XLDnaute Occasionnel
Re : Extraction dans une chaine de caractere

Bonjour,

voici le code de SubEndSub modifié pour afficher les nombres d'occurence des référence en colonne 4 e 5

Code:
Sub test()
For n = 2 To Range("B65536").End(xlUp).Row
 For m = 1 To Len(Range("B" & n))
   If Mid(Range("B" & n), m, 1) = 5 Then
     For p = 1 To 4
       If IsNumeric(Mid(Range("B" & n), m + p, 1)) Then
         t = t + 1
       End If
     Next p
     If t = 4 Then
       t = 0
       Range("C" & n) = Mid(Range("B" & n), m, 5)
       Exit For
      
     End If
   End If
 Next m
Next n
End Sub

Sub macro()
Dim c As Range
Dim RegEx As Object
Set RegEx = CreateObject("vbscript.regexp")
Set doublon = CreateObject("scripting.dictionary")

With RegEx
    For Each c In Range("B1", Range("B" & Rows.Count).End(xlUp))
        .Pattern = "(5)[0-9]{5}"
        .Global = True
        tmp = ""
        If .test(c.Value) Then
            tmp = CDbl(.Execute(c.Value)(0))
            cle = "Cle_" & tmp
            If doublon.exists(cle) = False Then
                doublon(cle) = 1
            Else
                doublon(cle) = doublon(cle) + 1
            End If
            Cells(c.Row, 3).Value = CDbl(.Execute(c.Value)(0))
        End If
    Next c
End With
Set RegEx = Nothing
'-------------------------------------------------
' ecriture du nombre d'appel
'-------------------------------------------------
l = 1
col = 4
For Each cle In doublon
    Cells(l, col) = Mid(cle, 5)
    Cells(l, col + 1) = doublon(cle)
    l = l + 1
Next
    
End Sub
 

biloute91

XLDnaute Occasionnel
Re : Extraction dans une chaine de caractere

Bonjour à tous,

j'ai essayé l'ensemble de vos méthodes et je vous remercie tous de l'intérêt que vous avez porté à ce post.
Pierrejean, le numero isolé ne comporte que 5 chiffres alors qu'il est composé de 6 chiffres.Juste pour essayer de comprendre où cela intervient-il dans ton code ?

Le code de SubEndSub complété de celui de Pyrof me permet egalement d'obtenir les occurences.

Encore merci et bonne journée:)
 

pierrejean

XLDnaute Barbatruc
Re : Extraction dans une chaine de caractere

Re

@ Matt
Oui cette boucle permet de verifier que les caracteres suivants le 5 sont bien des chiffres

@biloute
Une erreur !
C'est ici que la longueur du texte est determinée
Range("C" & n) = Mid(Range("B" & n), m, 6)
 

Pièces jointes

  • objet.zip
    10.1 KB · Affichages: 35
  • objet.zip
    10.1 KB · Affichages: 35
  • objet.zip
    10.1 KB · Affichages: 36
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 211
Messages
2 107 328
Membres
109 804
dernier inscrit
Dramac