Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

[Excel 2007/2010] Extraction de valeur dans un fichier CSV

  • Initiateur de la discussion Initiateur de la discussion Poto
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Poto

XLDnaute Occasionnel
Salut à tous,

je viens devant vous afin de "profiter" de votre excelliant savoir 😉

Dans l'exemple ci-joint, j'essaye désespérément d'extraire les données de la colonne B, ligne par ligne afin de récupérer les valeurs de part et d'autre du mot "COM" ....

en d autre terme, pour la 1ere ligne du fichier exemple, j aimerai réussir a extraire et a copier dans la colonne C la valeur a gauche de COM (429.50 sans le E) et copier dans la colonne D la valeur se trouvant a la droite de COM (3.28 toujours sans le E) et ceux pour toutes les lignes du fichier .... a savoir que je pourrais me retrouver avec plus de 300 lignes à "traiter" ...

toute aide/idée/direction a suivre ... est la bienvenue 😉


Cordialement

Poto



PS : je suis sincerement désolé, je viens de me rendre compte que j'ai poster ce thread dans le moauvais forum .... un modérateur accepterait il de deplacer ce thread dans le forum Excel siouplai 🙂

merci d'avance
 

Pièces jointes

Dernière édition:
Re : [Excel 2007/2010] Extraction de valeur dans un fichier CSV

Bonjour.

Personne n'est à l'abri d'une erreur 🙂
La longueur du champ col B étant fixe, vous pouvez utiliser stxt(), ou si vous préferez la conversion de données, quitte à supprimer les colonnes inutiles.

En C :
Code:
=STXT(B1;32;6)*1
En D :
Code:
=STXT(B1;49;4)*1
Le *1 pour transformer le texte en nombre, si votre séparateur décimal est la virgule.
 
Dernière édition:
Re : [Excel 2007/2010] Extraction de valeur dans un fichier CSV

Bonjour Poto, salut Patrick 🙂

Si la longueur du champ colonne B n'est pas fixe, ou pour le plaisir du VBA :

Code:
Sub Extraire()
  Dim tablo1, tablo2#(), i&, t$, p%, j%, k%
  tablo1 = Range("B1:B2", [B65536].End(xlUp))
  ReDim tablo2(1 To UBound(tablo1), 1 To 2)
  For i = 1 To UBound(tablo1)
    t = Replace(tablo1(i, 1), ",", ".")
    p = InStr(t, "COM")
    For j = p - 1 To 1 Step -1
      If Mid(t, j, 1) Like "#" Then Exit For
    Next
    For k = j - 1 To 1 Step -1
      If Mid(t, k) Like " #*" Then Exit For
    Next
    tablo2(i, 1) = Val(Mid(t, k))
    tablo2(i, 2) = Val(Mid(t, p + 3))
  Next
  [C:D].ClearContents 'RAZ
  [C1:D1].Resize(UBound(tablo1)) = tablo2
End Sub
Fichier joint.

A+
 

Pièces jointes

Re : [Excel 2007/2010] Extraction de valeur dans un fichier CSV

Re,

Si des cellules sont vides ou si "COM" n'existe ps, il faut 2 tests à la fin :

Code:
Sub Extraire()
  Dim tablo1, tablo2(), i&, t$, p%, j%, k%
  tablo1 = Range("B1:B2", [B65536].End(xlUp))
  ReDim tablo2(1 To UBound(tablo1), 1 To 2)
  For i = 1 To UBound(tablo1)
    t = Replace(tablo1(i, 1), ",", ".")
    p = InStr(t, "COM")
    For j = p - 1 To 1 Step -1
      If Mid(t, j, 1) Like "#" Then Exit For
    Next
    For k = j - 1 To 1 Step -1
      If Mid(t, k) Like " #*" Then Exit For
    Next
    If k > 0 Then tablo2(i, 1) = Val(Mid(t, k))
    If p Then tablo2(i, 2) = Val(Mid(t, p + 3))
  Next
  [C:D].ClearContents 'RAZ
  [C1:D1].Resize(UBound(tablo1)) = tablo2
End Sub
Fichier (2).

A+
 

Pièces jointes

Re : [Excel 2007/2010] Extraction de valeur dans un fichier CSV

Re,

S'il y a toujours au moins 2 espaces devant les valeurs à extraire :

Code:
Sub Extraire()
  Dim tablo1, tablo2(), i&, t$, p%, j%
  tablo1 = Range("B1:B2", [B65536].End(xlUp))
  ReDim tablo2(1 To UBound(tablo1), 1 To 2)
  For i = 1 To UBound(tablo1)
    t = Replace(tablo1(i, 1), ",", ".")
    p = InStr(t, "COM")
    j = InStr(t, "  ")
    If j And IIf(p, j < p, True) Then tablo2(i, 1) = Val(Mid(t, j))
    j = InStrRev(t, "  ")
    If j > p And p Then tablo2(i, 2) = Val(Mid(t, j))
  Next
  [C:D].ClearContents 'RAZ
  [C1:D1].Resize(UBound(tablo1)) = tablo2
End Sub
Même sans "COM" ou avec une seule valeur ça fonctionne.

Fichier (3).

A+
 

Pièces jointes

Re : [Excel 2007/2010] Extraction de valeur dans un fichier CSV

Bonsoir le fil,
2 fonctions personnalisées à tester :
Code:
Function ValG(chaine As String) As String
Dim oRegExp As Object, Matches As Object
Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
    .Pattern = "(.*BRUT\s*)(\d+,\d+)(\s*E\s*-\s*(COM)?.*)"
    If .test(chaine) = True Then chaine = .Replace(chaine, "$2") & " €" Else: chaine = ""
End With
ValG = chaine
End Function

Function ValD(chaine As String) As String
Dim oRegExp As Object, Matches As Object
Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
    .Pattern = "(.*COM\s*)(\d+,\d+)(.*)"
    If .test(chaine) = True Then chaine = .Replace(chaine, "$2") & " €" Else: chaine = ""
End With
ValD = chaine
End Function
A+
 
Re : [Excel 2007/2010] Extraction de valeur dans un fichier CSV

Salut le forum, salut le fil, salut Patrick, Job et David

je tenais sincèrement a vous remercier pour votre aide, surtout si rapide 🙂
moi qui penser qu'une simple macro ferait l affaire, j’étais bien loin de la réalité

je vais tenter les solutions de Job et David (merci bcp quoi qu il en soit Patrick, mais j'ai besoin d'une solution en vba)

ne voulant pas juste faire du copier/coller sans comprendre, accepteriez vous de commenter vos exemples histoire que je me couche moins bete ce soir 🙂 😉

encore merci de votre aide

Poto
 
Re : [Excel 2007/2010] Extraction de valeur dans un fichier CSV

Bonjour Poto, Patrick, David,

Une solution plus générale mais plus lourde.

Elle recherche tout nombre <> 0 suivi d'un "E", les espaces étant ignorés (car supprimés).

J'ai aussi ajouté des titres aux colonnes :

Code:
Sub Extraire()
  Dim tablo1, tablo2(), i&, t, j%, v#
  tablo1 = Range("B1:B2", [B65536].End(xlUp))
  ReDim tablo2(1 To UBound(tablo1) - 1, 1 To 2)
  For i = 1 To UBound(tablo2)
    t = Replace(tablo1(i + 1, 1), " ", "")
    t = Replace(t, ",", ".")
    For Each t In Split(t, "E")
      For j = Len(t) To 1 Step -1
       If Val(Mid(t, j) & 1) = 0 Then Exit For
      Next
      v = Val(Mid(t, j + 1))
      If v Then
        If InStr(t, "COM") Then
          tablo2(i, 2) = v: Exit For
        ElseIf tablo2(i, 1) = "" Then
          tablo2(i, 1) = v
        End If
      End If
    Next
  Next
  Range("C2:D" & Rows.Count).ClearContents 'RAZ
  [C2:D2].Resize(UBound(tablo2)) = tablo2
End Sub
Fichier (4).

A+
 

Pièces jointes

Re : [Excel 2007/2010] Extraction de valeur dans un fichier CSV

Re Gérard,
Je ne comprends pas trop l'exemple situé en B15
10,35 E - 215,40 E
Le résultat ramène uniquement 10,35 € : c'est quoi l'idée ?
A partir du moment où rien n'indique si c'est une remise ou une COM, pourquoi 215,40 E ne serait pas pris dans la colonne COM alors que 10,35 € est ramené dans la colonne REMISE (et à la limite pourquoi pas l'inverse d'ailleurs mais bon on peut considérer que lorsqu'il y a une valeur numérique présente sans indication de remise ou de COM, c'est obligatoirement une Remise, et que lorsqu'il en existe 2, la 1ère valeur numérique est obligatoirement une remise et la 2ème une COM quand rien ne l'indique) ?
Je sens qu'il y a une bonne idée derrière cela mais je crois que je ne l'ai pas saisie (et donc je ne peux pas développer une expression rationnelle si je n'ai pas les "règles du jeu"😱).
A+
 
Re : [Excel 2007/2010] Extraction de valeur dans un fichier CSV

Re David,

Comme mon code l'indique, l'inscription en colonne D (COM) n'a lieu que si le nombre est précédé d'un "COM".

Notre ami a bien insisté sur ce "COM".

Le programmeur fait ce qu'il veut 😛 un autre peut faire différemment.

A+
 
Re : [Excel 2007/2010] Extraction de valeur dans un fichier CSV

Re,

Pour illustrer ce que je viens de dire au post #10 voyez le fichier (5) :

Code:
Sub Extraire()
  Dim tablo1, tablo2(), i&, t$, s, j%, k%, v#
  tablo1 = Range("B1:B2", [B65536].End(xlUp))
  ReDim tablo2(1 To UBound(tablo1) - 1, 1 To 2)
  For i = 1 To UBound(tablo2)
    t = Replace(tablo1(i + 1, 1), " ", "")
    t = Replace(t, ",", ".")
    s = Split(t, "E")
    For j = 0 To UBound(s) - 1
      t = s(j)
      For k = Len(t) To 1 Step -1
       If Val(Mid(t, k) & 1) = 0 Then Exit For
      Next
      v = Val(Mid(t, k + 1))
      If v Then
        If tablo2(i, 1) = "" Then
          tablo2(i, 1) = v
        Else
          tablo2(i, 2) = v: Exit For
        End If
      End If
    Next
  Next
  Range("C2:D" & Rows.Count).ClearContents 'RAZ
  [C2:D2].Resize(UBound(tablo2)) = tablo2
End Sub
Les 2 premères valeurs suivies d'un "E" sont inscrites en colonnes C et D.

Noter que ce sont des nombres négatifs si le signe - les précède. Normal non ?

Bonne fin de soirée et A+
 

Pièces jointes

Re : [Excel 2007/2010] Extraction de valeur dans un fichier CSV

Re Gérard,
Comme mon code l'indique, l'inscription en colonne D (COM) n'a lieu que si le nombre est précédé d'un "COM".

Notre ami a bien insisté sur ce "COM".
Oui effectivement. Je crois que j'ai compris ton idée.
Ci-joint les fonctions prenant en compte cette possibilité :
Code:
Function ValG(chaine As String) As String
Dim oRegExp As Object
Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
    .Pattern = "(REMISE CB \d+ BRUT\s+|^)(\d+,\d+)(\s*E(URO)?\s*-.+)"
    If .test(chaine) = True Then ValG = .Replace(chaine, "$2") & " €"
End With
End Function

Function ValD(chaine As String) As String
Dim oRegExp As Object
Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
    .Pattern = "((?:.*|^)COM(?:MISSION)?\s*)(\d+,\d+)(.*)"
    If .test(chaine) = True Then ValD = .Replace(chaine, "$2") & " €"
End With
End Function
A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
40
Affichages
3 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…