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

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

  • Exemple XLD.xlsx
    9.2 KB · Affichages: 83
  • Exemple XLD.xlsx
    9.2 KB · Affichages: 92
  • Exemple XLD.xlsx
    9.2 KB · Affichages: 94
Dernière édition:

Victor21

XLDnaute Barbatruc
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:

job75

XLDnaute Barbatruc
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

  • Exemple XLD(1).xls
    45.5 KB · Affichages: 55

job75

XLDnaute Barbatruc
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

  • Exemple XLD(2).xls
    45.5 KB · Affichages: 46

job75

XLDnaute Barbatruc
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

  • Exemple XLD(3).xls
    53.5 KB · Affichages: 60

david84

XLDnaute Barbatruc
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+
 

Poto

XLDnaute Occasionnel
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
 

job75

XLDnaute Barbatruc
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

  • Exemple XLD(4).xls
    55.5 KB · Affichages: 56

david84

XLDnaute Barbatruc
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":eek:).
A+
 

job75

XLDnaute Barbatruc
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 :p un autre peut faire différemment.

A+
 

job75

XLDnaute Barbatruc
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

  • Exemple XLD(5).xls
    55.5 KB · Affichages: 55

david84

XLDnaute Barbatruc
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+
 

Discussions similaires

Réponses
7
Affichages
245
Réponses
10
Affichages
363

Statistiques des forums

Discussions
312 616
Messages
2 090 250
Membres
104 467
dernier inscrit
Sklerijenn59