Extraction de plusieur valeur numérique dans une chaine
Bonjour/ Bonsoir à tous et toutes,
J'ai cherché sur le net et ici et dans ma tête avant de poster ici.
Donc,
Travail : Dans une chaine de caractères contenant du texte et des valeurs numériques extraire les valeurs et les placer dans les bonnes colonnes.
exemple de chaine :
Aliments en préparation:497 Petites Pommes Jaunes, 21 Pommes Jaunes, 5 310 Jaunes d'Etoile, 124 427 913 Petites Pommes, 71 152 532 Pommes, 3 308 427 Cerises d'étoiles, 15 298 434 Pommes d'étoiles, 76 620 475 Tagadas, 1 Tagada d'étoile, 17 736 090 Bananes, 26 974 412 Bananes d'étoiles.
Difficultés :
- Il n'y a plusieurs valeurs numériques
- Les nombres sont plus ou moins grand
- Les produits rencontrés ne sont pas toujours les même
- Le VBA ne peut absolument pas être utilisé
Infos diverses : (attrape couillon)
- les produits et la quantité est séparé par une virgule sauf en dernier ou un point finit la phrase <-solutionné par tulipe_3
- si une quantité de 1 alors le produit ne prend pas de "s" (EX: 1 Banane; 10 Bananes) <-solutionné par eriiic
- Plusieurs cellules ou feuilles peuvent servir pour obtenir le résultat du moment que la valeur est bien au bon endroit ^^
- tous les noms des produits rencontrés : Petites Pommes Jaunes ; Pommes Jaunes ; Jaunes d'Etoiles ; Petites Pommes ; Pommes Cerises ; Cerises d'étoiles ; Abricots ; Abricots d'étoiles ; Pommes d'étoiles ; Tagadas ; Tagadas d'étoiles ; Bananes ; Bananes d'étoiles
Un fichier en pièce jointe comprenant un exemple souhaité et diverse recette pour tester la solution
Si vous ne trouvez pas, ce n'est pas grave
Merci d'avoir lu
Edit 1
Bonjour,
Un début de solution qui utilise une fonction personnalisée (VBA) et une contrainte pour la chaîne de caractères (virgules).
Tu ne voulais pas de VBA (de macros, je pense
Voir fichier joint.
A te lire.
Cdlt
Option Explicit
Public Function SansTexte(c)
Dim obj As Object
Dim chaine As String
'Supprime texte dans cellule
Application.Volatile
Set obj = CreateObject("vbscript.regexp")
obj.Global = True
obj.Pattern = "[a-zA-Zé:'\s+]+"
chaine = c.Value
chaine = obj.Replace(c, "")
SansTexte = Split(chaine, ",")
End Function
Bonjour,
Effectivement la solution VBA n'est pas possible pour résoudre le problème. C'est pour ca que je l'ai marqué avant que certain ne se lance et perde du temps dans une solution non applicable dans mon cas.
En tout cas merci d'avoir jeté un œil et rechercher une solution.
Personnellement j'ai cherché des solutions avec les formules que j'utilise couramment mais Excel regorgeant de formule inconnue pour ma part j'avais espoir que cette réalisation soit en faite d'une facilité pour certain.
Ma solution consiste à éliminer au fur et à mesure les caractères qui sont devant les chiffres et de rechercher l'emplacement dans la chaine du produit qui est derrière et d'extraire alors la valeur numérique pour ensuite éliminer tout ce beau monde et passer au produit suivant en gérant les éventuelles erreurs.
Mais certain produit étant assez identique dans le nom (genre Cerise, et Cerise d'Etoile), je ne sais pas pourquoi Excel but et place aux mauvais endroit la valeur numérique. Les formules étant imbriqués pour limiter le nombre de colonnes utilisés le dépannage est assez comment dirais je.... chiant!
Lors de ma recherche, avant d'imbriquer les formules, pour le même exemple la distinction se fait.
Sur ceux je ne vais pas vous faire perdre plus de temps là dedans.
Résolu
bonjour
pour ma part;j'etats parvenu a supprimer touts les espaces ainsi que la ponctuation ;mon idée etait d'extraire la partie numerique en amont d'une majuscule (a reperer avec exact ) mais je cale car je ne vais pas plus loin que l'equiv de la 2eme majuscule ;sinon cela devrait etere jouable
pour mettre au point il faut refaire une phrase plus courte avec tout ce qui se rencontre ;ainsi dans l'assistant fonction on voit directement ou il faut taper pour modifier ; si ça marche pour du court ;bingo pour le long
ton exercice est plus que sportif
cordialement
Y a quand même des chercheurs?!!
Oui c'est un gros challenge !!!
Transformer les virgules en point est très intéressants, ca permet de chercher que des points chose présente de sur quand il y a qu'un seul produit à contrario de la virgule.
Y a peu j'ai cherché à remplacer les noms des produits par un caractère spécial (ù,¤,#,|,£,....) histoire de ne pas se retrouver avec des doublons confusionnels et permettant alors de chercher une chose unique. Mais je n'ai pas trouvé une formule qui permet de traiter cela assez rapidement, plusieurs remplacement simultanément. Il faut alors un remplacement par produits ->14 produits->nécessites 14 cellules
Bon je laisse ce topic en résolu ou on le garde ouvert jusqu'à épuisement des possibilités?
Bonjour Tulipe_3,
Peux-tu regarder le fichier que j'ai joint précédemment et me donner ton avis sur la solution proposée.
(pas téléchargé encore au moment ou j'écris ce message
Toute idée d'amélioration est intéressante
L'utilisation des RegExp pour les opérations sur les chaînes de caractère permet une simplification des formules (avec une grosse difficulté d'écrire le "pattern", mais...)
A te lire
Cdlt
Bonjour à tous,
Ca n'est possible par formule que si tu mets, dans la recette, les Pommes Jaunes avant les Petites Pommes Jaunes.
Dit autrement : une chaine incluse dans une autre doit être devant.
Avec 2 feuilles intermédiaires.
Il fallait faire un compromis entre longueur mini de la chaine 'Aliments en préparation' et le nombre maxi récupérable.
J'ai choisi :
longueur mini de la chaine : 16 car.
nombre maxi récupérable : 999 999 999 999 999
Sinon tu adaptes la formule en Feuil2!B6
en Feuil1 :
B6: =Feuil3!B6
à recopier en bas et à droite
en Feuil2 :
A1: =SUBSTITUE(SUBSTITUE(Feuil1!A1;"s";"");":";",")
à recopier ligne 1 et colonne A
B6: =SUBSTITUE(SI(ESTERREUR(CHERCHE(B$1;$A6));"";STXT($A6;CHERCHE(B$1;$A6)-20;20));" ";"")
à recopier vers le bas et vers la droite
en Feuil3 :
B6: =DROITE(Feuil2!B6;EQUIV(",";STXT(Feuil2!B6;NBCAR(Feuil2!B6)-LIGNE($1:$255);1);0))*1
formule matricielle à valider avec Shift+Ctrl+Entrée
à recopier en bas et à droite
eric
Bonjour,
C'est une solution,
Malheureusement ce n'est pas moi qui décide de l’ordre des ingrédients dans la recette et j'aurais obligatoirement toujours l'ordre suivant :
Petites Pommes Jaunes ; Pommes Jaunes ; Jaunes d'Etoiles ; Petites Pommes ; Pommes Cerises ; Cerises d'étoiles ; Abricots ; Abricots d'étoiles ; Pommes d'étoiles ; Tagadas ; Tagadas d'étoiles ; Bananes ; Bananes d'étoiles
Sinon j'en conviens que c'est "plus facile" et je crois alors que j'aurais plus de cheveux sur le caillou
(j'ai rajouté cette contrainte dans le premier post)
Par contres chose inintéressante tu as enlevé tout les "S" à la fin des produits pour traiter les cas unitaire à l'identique que les cas nombreux
re jean eric
rassure toi j'avais jeté un oeil interessé ; j'ai experimenté le fait d'utliser l'obj.pattern dans une formule comme critere rien que pour voir
un peu comme 9^9 ou "z*z" mais cela ne donne rien ;meme pas les premices d'un debut apparement positif
j'avais vu une fois ce genre de syntaxe car il en existe plein ; je crois que ce n'est qu'utilisable que dans un code vb ;d'ailleur la simple presence de [ ] dans une formule (hors texte) est letale
bonne contination
cordialement
Re,
Malheureusement ce n'est pas moi qui décide de l’ordre des ingrédients
donc vba, pas le choix
Par contres chose inintéressante tu as enlevé tout les "S" à la fin des produits pour traiter les cas unitaire à l'identique que les cas nombreux
mais ceci change aussi certain noms de produit donc attention si on recherche le produit
Non, tous les s, pas seulement ceux de fin. Il ne faut pas rêver non plus.
Si tu as 2 produits cerise et cerie il y aura pb c'est clair.
Une raison de plus pour passer en vba. Mais tu ne peux pas...
eric
Coucou,
Donc suite à vos lectures et votre angle d'attaque ainsi que quelque technique qu'il me manquait, j'ai réussis à obtenir mon souhait
en pièce jointe le fichier joint si votre curiosité vous pousse.
Le VBA n'a pas été utilisé et l'ordre respecté
Merci à vous pour votre participation, ca m'a permis de changer mon fusil d'épaule et d'attaquer cela sous un autre angle
Crdt
Bonsoir,
heuuu, pourquoi pas.
Mais tu te vois modifier ou ajouter un produit ?
Enfin, si tu n'as pas le choix...
eric
Les produits ne bougerons pas, après une modif c'est pas si compliqué, la formule est à étirer ca mange pas de pain mais une chose est sur c'est que cela est bien réalisable sans passer par la VBA ^^