XL 2019 Recopier nombres avec condition dans une suite alpha-numérique.

Thomas97

XLDnaute Nouveau
Bonjour,

Je cherche à extraire un litrage qui est indiqué sous la forme " 45L", "2X5L" ou encore "3,4L" dans des suites alpha-numériques de longueurs différentes et n'apparaissant pas toujours à la fin du texte: "Boite 25L -JKLI67" par exemple.

Le but étant de remplir une colonne "litrage" avec uniquement le litrage des produits afin de pouvoir utiliser plus facilement cette donnée.

Je pensais donc à une formule qui lorsqu'elle trouve la lettre "L" majuscule extrait les 3 caractères précédent si il y a des chiffres.

Ce genre de formule est bien au dessus de mes capacités, et après de nombreux tutos excel j'en appel à votre bon coeur ^^. Le vrai fichier faisant 45000 lignes, le faire à la main me parait difficile.

Il y a certaines dénominations bien gratinés tel que "Lot de 7 boites hermétiques (3x1.1L + 2x0.9L + 2.1 + 3.2L)"

J'ai mis un exemple en pièce jointe,

Même sans réponse précise, je voudrai savoir si c'est techniquement réalisable ou non,

Merci d'avance,
 

Pièces jointes

  • Litrage exemple.xlsx
    9.3 KB · Affichages: 9

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Thomas97 et bienvenue sur XLD :),
Bonjour @Kruger$$ et bienvenue sur XLD :),

Voici une solution par macro. Je ne vois pas de solution par formule.
La fonction s'appelle VQ. On l'utilise comme une formule ordinaire dans une cellule: =VQ(A2).
Cette fonction semble fonctionner pour les cas de l'exemple fourni. Savoir si elle fonctionne pour d'autres cas est à vérifier au coup par coup.

Le code est dans module1:
VB:
Function VQ(x$) As String
Dim j&, y$, r$, c$, s$

   x = Application.Trim(Replace(x, " L", "L"))
   For j = Len(x) To 2 Step -1
      If Mid(x, j, 2) Like "#L" Then
         y = Left(x, j + 1): Exit For
      End If
   Next j
   If y = "" Then Exit Function
   y = Chr(255) & y
 
   y = Application.Trim(y)
   For j = Len(y) To 1 Step -1
      c = Mid(y, j, 1): s = Mid(y, j - 1, 1)
      If InStr(1, "0123456789 x.+L,", c, vbBinaryCompare) = 0 Then Exit For
      r = c & r
      If InStr(1, "0123456789 x.+L,", s, vbBinaryCompare) = 0 Then Exit For
   Next j
   VQ = Trim(r)
End Function
 

Pièces jointes

  • Thomas97- Extraction string- v1.xlsm
    18.1 KB · Affichages: 6

Thomas97

XLDnaute Nouveau
Bonjour @Thomas97 et bienvenue sur XLD :),
Bonjour @Kruger$$ et bienvenue sur XLD :),

Voici une solution par macro. Je ne vois pas de solution par formule.
La fonction s'appelle VQ. On l'utilise comme une formule ordinaire dans une cellule: =VQ(A2).
Cette fonction semble fonctionner pour les cas de l'exemple fourni. Savoir si elle fonctionne pour d'autres cas est à vérifier au coup par coup.

Le code est dans module1:
VB:
Function VQ(x$) As String
Dim j&, y$, r$, c$, s$

   x = Application.Trim(Replace(x, " L", "L"))
   For j = Len(x) To 2 Step -1
      If Mid(x, j, 2) Like "#L" Then
         y = Left(x, j + 1): Exit For
      End If
   Next j
   If y = "" Then Exit Function
   y = Chr(255) & y

   y = Application.Trim(y)
   For j = Len(y) To 1 Step -1
      c = Mid(y, j, 1): s = Mid(y, j - 1, 1)
      If InStr(1, "0123456789 x.+L,", c, vbBinaryCompare) = 0 Then Exit For
      r = c & r
      If InStr(1, "0123456789 x.+L,", s, vbBinaryCompare) = 0 Then Exit For
   Next j
   VQ = Trim(r)
End Function

Merci beaucoup, je test ça de suite :)
 

Thomas97

XLDnaute Nouveau
Bonjour @Thomas97 et bienvenue sur XLD :),
Bonjour @Kruger$$ et bienvenue sur XLD :),

Voici une solution par macro. Je ne vois pas de solution par formule.
La fonction s'appelle VQ. On l'utilise comme une formule ordinaire dans une cellule: =VQ(A2).
Cette fonction semble fonctionner pour les cas de l'exemple fourni. Savoir si elle fonctionne pour d'autres cas est à vérifier au coup par coup.

Le code est dans module1:
VB:
Function VQ(x$) As String
Dim j&, y$, r$, c$, s$

   x = Application.Trim(Replace(x, " L", "L"))
   For j = Len(x) To 2 Step -1
      If Mid(x, j, 2) Like "#L" Then
         y = Left(x, j + 1): Exit For
      End If
   Next j
   If y = "" Then Exit Function
   y = Chr(255) & y

   y = Application.Trim(y)
   For j = Len(y) To 1 Step -1
      c = Mid(y, j, 1): s = Mid(y, j - 1, 1)
      If InStr(1, "0123456789 x.+L,", c, vbBinaryCompare) = 0 Then Exit For
      r = c & r
      If InStr(1, "0123456789 x.+L,", s, vbBinaryCompare) = 0 Then Exit For
   Next j
   VQ = Trim(r)
End Function
Ca marche parfaitement, je vais continuer de m'intéresser aux macro, au vu de leur utilité, merci beaucoup en tout cas!
 

Statistiques des forums

Discussions
314 841
Messages
2 113 481
Membres
111 877
dernier inscrit
thierry@1965