Extraire n caractères à partir d'un caractère donné.

Nazim

XLDnaute Junior
Bonjour,

dans un programme que je souhaite faire, je rencontre un problème dans l'extraction des données.

Pour le résoudre voici mon idée:

- je dois chercher dans une ligne donné, une séquence de caractère qui commence par "O" ou "N" puis (8chiffres) ensuite "O" ou "N et encore une fois 8 chiffres. et mettre le résultat dans 4 cellules :
[cellule1: O ou N]
[Cellule2:8 chiffres]
[cellule3: O ou N]
[Cellule2:8 chiffres]


:)
 
Dernière modification par un modérateur:

CPk

XLDnaute Impliqué
Re : Extraire n caractères à partir d'un caractère donné.

Macro fonctionnelle sur le fichier présenté ici

Code:
Sub rgxp()
Dim reg As Object
Dim n, nn
Set reg = CreateObject("vbscript.regexp")

reg.Global = True
reg.ignorecase = True
reg.Pattern = "(O20|N20)\d{6}"

For a = 1 To Feuil1.UsedRange.Rows.Count
Set nn = reg.Execute(Feuil1.Cells(a, 1))
For Each n In nn
Feuil1.Cells(a, Columns.Count).End(xlToLeft).Offset(0, 1) = Trim(Right(n, Len(n) - 1))
Next n
Next a
Feuil1.Columns(2).AutoFit

End Sub
 

Pièces jointes

  • Sans titre.jpg
    Sans titre.jpg
    38.8 KB · Affichages: 29
  • Sans titre.jpg
    Sans titre.jpg
    38.8 KB · Affichages: 31

Modeste geedee

XLDnaute Barbatruc
Re : Extraire n caractères à partir d'un caractère donné.

Bonsour® MALLEK
Bonjour Modeste,job7
Merci pour vos réponses mais le problème c'est que c'est pas toujours le meme emplacement (numéro de ligne) c'est vrai que sur l'exemple test la largeur des des données n'est pas fixe...
???
donc votre méthode ne marche pas trop avec tous mes fichiers
Merci
m'étonnerait quand même que la SG change le format de ses fichiers internationaux tout les jours !!!

si tu utilises des structures de fichiers différentes, il sera encore plus compliqué de modifier à chaque fois les formules ...
 

job75

XLDnaute Barbatruc
Re : Extraire n caractères à partir d'un caractère donné.

Re,

le résultat que tu obtiens par la fonction est bon, par contre est ce que c'est possible de m'aider pour l'integrer d'une macro ? je n'arrive pas a faire appel a cette macro pour un autre fichier.

Toutes les explications nécessaires sont dans les posts #5 #6 #7 et les fichiers joints.

Il suffit que vous les lisiez attentivement.

A+
 

CPk

XLDnaute Impliqué
Re : Extraire n caractères à partir d'un caractère donné.

La même que ci-dessus mais avec un format date du résultat

Code:
Sub rgxp()
Dim reg As Object
Dim n, nn
Set reg = CreateObject("vbscript.regexp")

reg.Global = True
reg.ignorecase = True
reg.Pattern = "(O20|N20)\d{6}"

For a = 1 To Feuil1.UsedRange.Rows.Count
Set nn = reg.Execute(Feuil1.Cells(a, 1))
For Each n In nn

Feuil1.Cells(a, Columns.Count).End(xlToLeft).Offset(0, 1) = Mid(n, 8, 2) & "/" & Mid(n, 6, 2) & "/" & Mid(n, 2, 4)

Next n
Next a
Feuil1.Columns(2).AutoFit

End Sub
 

job75

XLDnaute Barbatruc
Re : Extraire n caractères à partir d'un caractère donné.

Bonjour le fil, le forum,

J'ai testé la fonction du post #7 sur 6000 lignes dans le fichier joint.

Chez moi sur Win 8 - Excel 2013 la durée d'exécution est de 2,5 secondes.

Bonne journée.
 

Pièces jointes

  • test 6000 lignes(1).xlsm
    139.8 KB · Affichages: 18

job75

XLDnaute Barbatruc
Re : Extraire n caractères à partir d'un caractère donné.

Re,

Avec la fonction du post #6 c'est quasiment la même durée d'exécution.

Fichier (2).

A+
 

Pièces jointes

  • test 6000 lignes(2).xlsm
    140.4 KB · Affichages: 18

job75

XLDnaute Barbatruc
Re : Extraire n caractères à partir d'un caractère donné.

Re CPk,

Bien sûr le temps de traitement dépend des performances de l'ordi, à chacun de tester.

Le but de l'analyse est de comparer les diverses solutions.

Edit : je viens de tester la macro de votre post #17, sur 6000 lignes elle s'exécute chez moi en 1,6 seconde.

C'est vrai qu'elle ne restitue que 2 colonnes, mais ici les expressions régulières sont bien plus rapides que ce que je pensais.

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Extraire n caractères à partir d'un caractère donné.

Re,

J'ai fini par comprendre la question du temps de traitement des expressions régulières (et de leur intérêt).

Ce qui prend du temps c'est la création de l'objet CreateObject("vbscript.regexp")

Sur ce post :

https://www.excel-downloads.com/threads/recuperer-initiales-majuscules.216929/

l'objet est créé à chaque appel de la fonction qui l'utilise.

Alors qu'au post #17 il est créé une seule fois pour toutes en début de macro.

A+
 

CPk

XLDnaute Impliqué
Re : Extraire n caractères à partir d'un caractère donné.

Bonjour JOB75, merci pour l'analyse. je pense qu'il faut avant de choisir telle ou telle méthode, savoir ce qui correspond le mieux au contexte, et quand bien même une macro prendrai 2,3 voir 5 minutes de traitement, il ne faut pas forcément chercher à le réduire mais plutôt à masquer son temps en faisant autre chose. Mais ce n'est que mon avis de Support Méthode
 

job75

XLDnaute Barbatruc
Re : Extraire n caractères à partir d'un caractère donné.

Re,

La solution de CPk est bien la meilleure.

Je l'ai améliorée en utilisant des tableaux VBA et sur 4 colonnes :

Code:
Sub Remplir_sans_conversion()
Dim t, tablo, rest(), reg As Object, i&, nn, j%, n
t = Timer
Application.ScreenUpdating = False
With [A1].CurrentRegion.Columns(1)
  tablo = .Range(.Cells, .Cells(2)) 'au moins 2 éléments
  ReDim rest(1 To UBound(tablo), 1 To 4)
  Set reg = CreateObject("vbscript.regexp")
  reg.Global = True
  reg.ignorecase = True
  reg.Pattern = "(O20|N20)\d{6}"
  For i = 1 To UBound(tablo)
    Set nn = reg.Execute(tablo(i, 1))
    j = 1
    For Each n In nn
      If j > 3 Then Exit For
      rest(i, j) = Left(n, 1): rest(i, j + 1) = Mid(n, 2, 8)
      j = j + 2
  Next n, i
  With .Columns(2).Resize(, 4)
    .NumberFormat = "General"
    .Value = rest
  End With
End With
MsgBox "Durée " & Format(Timer - t, "0.00 \s") 'facultatif
End Sub
Fichier joint.

Les macros s'exécutent chez moi en 1,1 seconde.

A+
 

Pièces jointes

  • Expressions régulières test 6000 lignes(1).xlsm
    140.7 KB · Affichages: 14
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 361
Messages
2 087 609
Membres
103 606
dernier inscrit
lolo1970