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!
 

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 305
Messages
2 087 084
Membres
103 459
dernier inscrit
Arnocal