Chercher des valeurs numériques dans une cellule avec un libellé

Bonjour,

Je me permets de lancer une question, peut être facile pour certaines, dont je n'ai pas pu trouver de réponse .

En effet, dans mon tableau, j'ai plusieurs lignes (+ de 3000) dans la colonne A remplis des libelles du genre :

CAT XXX 55D1.31ct TT-950

DOG XXX 0.05ct VVS2F 27D1.45ct TT-950

J'ai besoin de remplir une colonne à côté avec le nombre que apparaît avant la 'D' et avec le numéro de deux décimales qui apparaît devant 'ct'.

Ex :

Colonne A : CAT XXX 55D1.31ct TT-950

Colonne B : 55

Colonne C : 0.31

Pour ajouter une autre difficulté, dans deuxième cas j'ai l'ensemble 'ct' écrit deux fois et j'ai besoin du deuxième.

Ex :

Colonne A : DOG XXX 0.05ct VVS2F 27D1.45ct TT-950

Colonne B : 27

Colonne C : 1.45

Est ce quelqu’un connait une formule qui puisse chercher les valeurs dont j'ai besoin dans les cellules automatiquement?

D'avance, un énorme grand merci de votre aide.

Bien à vous,

Inés

Bonjour,

Ton problème n'est pas simple car visiblement tous les nombres compris dans ta chaîne de caractère n'ont pas d'intérêt pour toi, d'autant plus que l'emplacement des nombres d'intérêt varie...

Cependant, si tu connais un peu VBA, il existe la fonction Val("TaChaineDeCaractères") qui permet de ressortir les chiffres contenus dans une chaine.

Bonjour,

il faut utiliser les expressions régulières (et travailler un poil les neurones pour les établir !!)

je me suis fait une fonction générique

Function ChercheChaine(chaine, pattern)
  Set obj = CreateObject("vbscript.regexp")
  obj.pattern = pattern
  Set a = obj.Execute(chaine)
  If a.Count > 0 Then ChercheChaine = a(0) Else ChercheChaine = ""
End Function

reste à bien comprendre quelle est la logique d'extraction ... comment ces 2 nombres sont repérables, par quoi ? un espace avant ? un D après ? un point ?

Voici le décodage

12decodage.xlsm (14.33 Ko)

Bonjour Inés, le forum,

je te propose ce fichier Excel :

11exo-ialvarezde.xlsm (14.41 Ko)

Ctrl d ➯ travail effectué !

Alt F11 pour voir le code VBA, puis revenir sur Excel

si besoin, tu peux demander une adaptation.

merci de me dire si ça te convient.

dhany

Salut ialvarezde,

ma contribution à ton travail!

Ici, sans connaître ton fichier de données, j'imagine et je tiens compte d'une éventuelle absence des particularités recherchées, D ou ct, voire d'une position inversée par rapport aux maigres lignes que tu nous montres.

  • ct ? Parfois avant, parfois après D ?
  • le nombre avec décimales : de 0 à... 10, 100... ? Pas la même chose à programmer...
  • le nombre qui précède D : toujours < 100 ?

Un double-clic démarre la macro qui devra être adaptée si tu as une ligne de titres.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tData
Cancel = True
'
Columns("B:C").ClearContents
tData = Range("A1:C" & Range("A" & Rows.Count).End(xlUp).Row).Value
'
For x = 1 To UBound(tData, 1)
    sData = tData(x, 1)
    For y = InStrRev(sData, "ct") - 1 To 1 Step -1
        If Not IsNumeric(Mid(sData, y, 1)) And Mid(sData, y, 1) <> "." Then Exit For
        tData(x, 3) = Mid(sData, y, 1) & tData(x, 3)
    Next
    For y = 1 To Len(sData)
        If (Asc(Mid(sData, y, 1)) > 47 And Asc(Mid(sData, y, 1)) < 58) And Mid(sData, y + 1, 1) = "D" And InStrRev(Left(sData, y), Chr(32)) + 1 > 1 Then _
                tData(x, 2) = Mid(sData, InStrRev(Left(sData, y), Chr(32)) + 1, y - (InStrRev(Left(sData, y), Chr(32)))) & tData(x, 2): Exit For
    Next
Next
Range("A1").Resize(UBound(tData, 1), 3) = tData
Columns("A:C").AutoFit
'
End Sub

A+

1instrddd.xlsm (15.83 Ko)

Merci beaucoup!

Merci Dhany!

Je n'ai pas pu utiliser ton fichier parce que j'ais les macros bloqués par mon entreprise.. Mais j'ai quand mémé pu résolue le problème!

Merci encore

Voici le décodage

C'est fat merci!

@Inés

merci pour ton retour d'infos ; bonne continuation !

dhany

ajout : je mets quand même ici mon code VBA, pour ceux qui sont intéressés par une solution avec macro :

Option Explicit

Sub Essai()
  Dim dlig&, lig&, chn$, p1%, p2%
  dlig = Cells(Rows.Count, 1).End(xlUp).Row
  Range("B1:C" & dlig).ClearContents
  Application.ScreenUpdating = 0
  For lig = 1 To dlig
    With Cells(lig, 1)
      chn = .Value
      If chn <> "" Then
        p2 = InStr(.Value, "D")
        If p2 > 0 Then
          p1 = InStrRev(chn, " ", p2)
          .Offset(, 1) = Mid$(chn, p1 + 1, p2 - p1 - 1)
          p1 = InStrRev(chn, "ct ")
          If p1 > 0 Then
            .Offset(, 2) = Mid$(chn, p2 + 1, p1 - p2 - 1)
          End If
        End If
      End If
    End With
  Next lig
End Sub

le résultat est bien celui attendu :

screen

dhany

Bonjour,

@ dhany,

As-tu vu le résultat pour :

DOG XXX 0.05ct VVS2F 27D1.45ct TT-950

Cdlt.

et un p'tit coup d'expression régulière c'est bien plus pratique

https://forum.excel-pratique.com/viewtopic.php?p=674811#p674811

@Steelson : c'est pas régulier !

@Jean-Eric

tu a écrit :

@ dhany,

As-tu vu le résultat pour :

DOG XXX 0.05ct VVS2F 27D1.45ct TT-950

je vais regarder ça ; en attendant, si tu lisais ces 2 posts :

https://forum.excel-pratique.com/viewtopic.php?p=675820#p675820

https://forum.excel-pratique.com/viewtopic.php?p=675980#p675980

tu comprendras qu'pour moi, l'exo saaku n'est pas réglé !

dhany

@Jean-Eric

* as-tu lu mes 2 posts sur l'exo saaku ? (j'ai mis les 2 liens dans mon post précédent)

* pour cet exo, t'as bien raison : j'avais pas vu ce bug ! c'est corrigé dans mon fichier ci-dessous

(j'ai seulement remplacé InStr par InStrRev pour une recherche de la lettre "D" à partir de la fin).


voici la nouvelle version du fichier :

avec le nouveau code VBA (seule la ligne avec "D" a été modifiée) :

Option Explicit

Sub Essai()
  Dim dlig&, lig&, chn$, p1%, p2%
  dlig = Cells(Rows.Count, 1).End(xlUp).Row
  Range("B1:C" & dlig).ClearContents
  Application.ScreenUpdating = 0
  For lig = 1 To dlig
    With Cells(lig, 1)
      chn = .Value
      If chn <> "" Then
        p2 = InStrRev(.Value, "D")
        If p2 > 0 Then
          p1 = InStrRev(chn, " ", p2)
          .Offset(, 1) = Mid$(chn, p1 + 1, p2 - p1 - 1)
          p1 = InStrRev(chn, "ct ")
          If p1 > 0 Then
            .Offset(, 2) = Mid$(chn, p2 + 1, p1 - p2 - 1)
          End If
        End If
      End If
    End With
  Next lig
End Sub

d'où ces résultats :

screen

dhany

mais moi j'avais bon ! enfin je crois je vais vérifier

C'est tout bon !

capture d ecran 100

(j'ai seulement remplacé InStr par InStrRev pour une recherche de la lettre "D" à partir de la fin).

et s'il y avait aussi un "autre" D après les 27D1.45ct ?

@Steelson

tu a écrit :

et s'il y avait aussi un "autre" D après les 27D1.45ct ?

screen

d'après les données prises dans les posts du demandeur, c'est pas le cas.

cette fois, moi aussi, j'ai tout bon ! (enfin, je crois)

dhany

Rechercher des sujets similaires à "chercher valeurs numeriques libelle"