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"
 

Fichiers joints

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 Impliqué
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
 

Fichiers joints

Dernière édition:

Eric Dé

XLDnaute Occasionnel
RE,

Cette fois, je crois qu'on y est ! (enfin, que TU y es ;-)
Un grand merci à toi et au temps que tu as bien voulu me consacrer.

Bonne continuation.
Eric
 

Eric Dé

XLDnaute Occasionnel
Bonjour Laurent,

Grand merci également pour ta contribution et pour le code commenté ! ;-))

Bonne journée,
Eric
 

Discussions similaires


Haut Bas