Extraction de caractères dans une chaîne variable.

Eric Dé

XLDnaute Occasionnel
Bonjour,

Je souhaiterais extraire et ordonner des données variables à l'intérieur d'une chaîne de caractères.
Il s'agit de mettre dans des cellules différentes les données suivantes :

Le paysle nombre d'envoisle poidsle montant

Les données :

- Un exemple de chaîne de caractères (contenue dans une seule cellule) :

xyzxyzxyzxyzxy SOUS-TOT PAR PAYS D'ORIGINE ENVOIS POIDS GERMANY 112 2109,271 9051,80 xyzxyzxyzxyzxyzxyz SOUS-TOT PAR PAYS D'ORIGINE ENVOIS POIDS SPAIN 1 21,760 62,55 yzxyzxyzxyzxyzyx SOUS-TOT PAR PAYS D'ORIGINE ENVOIS POIDS HUNGARY 1 3,000 55,33 xyzxyzxyz

Le point commun pour le repérage des caractères à extraire est donc le "SOUS-TOT PAR..."
Suivent un espace, le pays, un espace, le nombre d'envois, un espace, le poids avec trois chiffres après la virgule, un espace et le montant avec deux chiffres après la virgule.

Le résultat souhaité :

PaysNombre d'envoisPoidsMontant
GERMANY1122109,2719501,80
SPAIN121,76062,55
HUNGARY13,00055,33


Auriez-vous une solution dans vos tiroirs ?

Merci d’avance pour vos contributions.

Cordialement.
Eric
 

Eric Dé

XLDnaute Occasionnel
Bonjour Roblochon,

Je n'en ai pas mis. Seule la chaîne de caractères sert de point de départ à la réflexion.

xyzxyzxyzxyzxy SOUS-TOT PAR PAYS D'ORIGINE ENVOIS POIDS GERMANY 112 2109,271 9051,80 xyzxyzxyzxyzxyzxyz SOUS-TOT PAR PAYS D'ORIGINE ENVOIS POIDS SPAIN 1 21,760 62,55 yzxyzxyzxyzxyzyx SOUS-TOT PAR PAYS D'ORIGINE ENVOIS POIDS HUNGARY 1 3,000 55,33 xyzxyzxyz


Merci.
Eric
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Eric Dé,

Une fonction personnalisée écrite en VBA qui s'écrit:
VB:
Function Element(x As Range, n As Long, q As Long)
x est la cellule contenant la chaine à examiner (dans l'exemple, c'est la cellule B4)
n indique quel envoi sera analyser (si n=1 alors on examine le 1er envoi, si n=2 alors on examine le 2ème envoi, etc.)
q indique quel élément du nème envoi on retourne (si q=1 alors on retourne le pays, si q=2 alors on retourne le nombre d'envois, etc.)

pour incrémenter n suivant les lignes, on utilise la fonction LIGNES($1:1)
pour incrémenter q suivant les colonnes, on utilise la fonction COLONNES($A:A)

On arrive à la formule suivante en B7 à copier vers la droite et vers le bas jusqu'à obtenir des lignes vides:
Code:
=element($B$4;LIGNES($1:1);COLONNES($A:A))

Le code de la fonction dans module1:
VB:
Function Element(x As Range, n As Long, q As Long)
Dim Nlig&, i&, y$, elem

  Element = vbNullString
  Nlig = (Len(x) - Len(Replace(x, "ENVOIS POIDS", ""))) / Len("ENVOIS POIDS")
  If n >= 1 And n <= Nlig And q >= 1 And q <= 4 Then
    y = Replace(x, "ENVOIS POIDS", "", , n - 1): y = Application.Trim(y)
    i = InStr(1, y, " ENVOIS POIDS ", vbTextCompare) + Len(" ENVOIS POIDS ")
    y = Mid(y, i): elem = Split(y)
    i = 0: y = ""
    Do While Not IsNumeric(elem(i)) And i <= UBound(elem)
      y = y & " " & elem(i): i = i + 1
    Loop
    If q = 1 Then
      Element = Application.Trim(y)
    Else
      If i + q - 2 <= UBound(elem) Then Element = CDbl(elem(i + q - 2))
    End If
  End If
End Function

nota 1: chaque envoi est repéré par la chaine de caractères "ENVOIS POIDS"
nota 2: la fonction accepte des noms de pays composés de plusieurs mots séparés par des espaces tel que "Great Britain"
 

Pièces jointes

  • Eric Dé- Extraction chaîne- v1.xlsm
    21 KB · Affichages: 14
Dernière édition:

Eric Dé

XLDnaute Occasionnel
Bonjour MaPomme,

Merci beaucoup pour ta proposition. C'est déjà un grand pas vers la solution définitive.

Je souhaiterais rajouter une option, si tu le permets :
Les données que j'ai à extraire sont sur plusieurs lignes (jusqu'à une centaine).

Est-ce que ta formule pourrait s'adapter à une recherche multiligne ?
J'ai mis un exemple sur 6 lignes. L'idée serait donc de mettre à la suite l'ensemble des données trouvées.
!! Attention : il est possible qu'il y ait des lignes dans lesquelles il n'y ait rien à extraire (par exemple en ligne 7).
Dans ce cas, ça ne doit pas générer de lignes vides.
Et ainsi la prochaine ligne dans laquelle il y aurait des données à extraire prendrait la suite des données précédemment trouvées.

En espérant avoir été clair dans me demande, je te remercie par avance pour ton étude.

Cordialement,
Eric
 

laurent950

XLDnaute Accro
Bonjour Eric Dé, Roblochon, mapomme, Victor21,
Il y a une solution pour les extractions suite a votre premier poste en passant pas des Regex.
je joints le fichier excel (avec les liens internet pour les explications dans la constitution des chaines d'extractions a construire)

se servir des conversions pour le passage de texte vers nombre :
liens : http://www.gaboly.com/VBA/ConversionType.html

cordialement
Laurent
 

Pièces jointes

  • ExtractionChaineDeCaractairesRegex.xlsm
    25.2 KB · Affichages: 4
Dernière édition:

Eric Dé

XLDnaute Occasionnel
Bonjour MaPomme,

Une fois de plus, excellent travail !!! Merci !

J'ai cependant un cas bloquant. Les données de la cellule B2 ne sont pas extraites ! Serait-ce le fait qu'il y ait des étoiles ou des tirets qui pose problème ?

Merci d'avance.

Cordialement,
Eric
 

Pièces jointes

  • Eric Dé- Extraction chaîne- v3 (multilignes).xlsm
    23.9 KB · Affichages: 4

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 925
Membres
101 841
dernier inscrit
ferid87