Extraction d'informations dans une chaine de caractère

mike14

XLDnaute Nouveau
Bonjour,

Je viens sur ce forum car j'ai besoin d'aide pour extraire des données contenues dans une case.

J'ai une case remplie de la sorte :

1 chat 3 lapin 5 chat 2 chat 4 voiture 2 chat

D'une chaine de caractère de ce genre j'aimerai extraire la somme de tous les nombres situés devant la chaine "chat", le résultat souhaité est : 1+5+2+2=10

le top serait de faire cela avec des formules

Merci d'avance pour votre aide

Edit : oui ça fait bien 10 et pas 8 merci
 
Dernière édition:

Softmama

XLDnaute Accro
Re : Extraction d'informations dans une chaine de caractère

bonjour,

oui cela fait 10.
Je t'ai proposé un début de solution qui vaut ce qu'elle vaut, sans VBA donc.
Le souci est qu'au lieu de te pondre une grosse formule matricielle, qui va me faire très mal à la tête, vus mes piètres talents de formuleux, je te l'ai fait en quelques étapes. Au moins, cela te sera plus aisé d'en comprendre le mécanisme ^^
 

Pièces jointes

  • chat lapin.xls
    17.5 KB · Affichages: 75

CISCO

XLDnaute Barbatruc
Re : Extraction d'informations dans une chaine de caractère

Bonjour à tous, mike14, mara54 et softmama

Cf. une possibilité en pièce jointe pour avoir la somme de tous les nombres (ce n'est pas ce que tu demandes, mais cela servira peut être à d'autres), pas très belle (52 SUBSTITUE imbriqués), mais bon, ça fonctionne.

Dans un premier temps, on remplace toutes les lettres par des + grace aux 52 SUBSTITUE.
Dans un second temps, on calcule le résultat de la formule obtenue, du style 1 ++++ 2 +++++ 5 ++++ 0 avec la fonction EVALUER d'Excel4.

@ plus

P.S : La formule proposée par softmama ne fonctione pas, malheureusement, dans tous les cas, par exemple si on a 12 chat 3 lapin 2 chat.
 

Pièces jointes

  • mike14EVALUERSUBST.xlsm
    10.1 KB · Affichages: 62
Dernière édition:

mike14

XLDnaute Nouveau
Re : Extraction d'informations dans une chaine de caractère

P.S : La formule proposée par softmama ne fonctione pas, malheureusement, dans tous les cas, par exemple si on a 12 chat 3 lapin 2 chat.

La formule de softmama pourrait fonctionner en remplaçant dans toute la colonne B =SI(A3="";"";CNUM(STXT($A$1;A3-2;2))) par =SI(A3="";"";CNUM(STXT($A$1;A3-3;2))) mais à condition que le nombre devant chat soit inférieur à 100

J'ai commencé à imbriquer ce genre de formule les unes dans les autres et pour 4 niveaux j'ai plus de 1500 caractères dans la formule sans avoir inclus les éléments évitant d'avoir les #valeur

Je crois que si un jour je veux y retoucher je n'y arriverai pas
 

CISCO

XLDnaute Barbatruc
Re : Extraction d'informations dans une chaine de caractère

Bonsoir

Ce coup ci, ça doit faire ce que tu veux, avec une méthode semblable à la précédente.

En simplifiant, dans un premier temps, on remplace le mot recherché par 000+ et tous les autres par des +.
Dans un second temps, on calcule avec EVALUER le résultat de la somme et on prend la partie entière de cette somme divisée par 1000.

@ plus

P.S : La formule utilisée n'est toujours pas très belle, avec plus de 52 SUBSTITUE imbriqués les uns dans les autres. Le plus simple, il me semble, serait de passer par une macro.
 

Pièces jointes

  • mike14EVALUERSUBST bis.xlsm
    10.2 KB · Affichages: 64
Dernière édition:

Softmama

XLDnaute Accro
Re : Extraction d'informations dans une chaine de caractère

bonjour,

par fonction personnalisée, si la case est en A1 : entrer : =SomAnimo("chat") dans une cellule
VB:
Function SomAnimo(Animal As String)
Dim a As String, curr As Long, n As Long
a = [A1].Text
curr = 1
Do While InStr(curr, a, Animal) > 0
    n = InStr(curr, a, Animal) - 2
    Do While Mid(a, n, 1) Like "[0-9]"
        If n > 1 Then n = n - 1 Else Exit Do
    Loop
    SomAnimo = SomAnimo + Val(Mid(a, n, InStr(curr, a, Animal) - n - 1))
    curr = InStr(curr, a, Animal) + Len(Animal)
Loop
End Function
 

hamcec

XLDnaute Nouveau
Re : Extraction d'informations dans une chaine de caractère

Bonsoir le Forum,

Une autre fonction en VBA utilisant la fonction split (bien utile).
VB:
Public Function F_Chat(A_Chaine As String) As Long
    Dim L_Cpt       As Long
    Dim MonTableau  As Variant
    MonTableau = Split(A_Chaine, " ")
    For L_Cpt = 0 To UBound(MonTableau)
        If UCase(MonTableau(L_Cpt)) = "CHAT" Then
            If L_Cpt > 0 Then F_Chat = F_Chat + Val(MonTableau(L_Cpt - 1))
        End If
    Next
End Function
Entrer dans une cellule =F_Chat(A1) si la cellule à traiter est en A1 ...

Softmama, si le 1er mot de la cellule est chat, ta fonction rencontre une erreur.

Cdt, Hamcec.
 
Dernière édition:

CISCO

XLDnaute Barbatruc
Re : Extraction d'informations dans une chaine de caractère

Bonjour

Ma précédente proposition ne donnait pas le bon résultat lorsque le total des animaux non-choisis dépassait 1000.
Par exemple, toujours en simplifiant un peu, avec 1 chat 100 poussin 800 poulet 4 chat 300 chien (soit 100+800+300=1200 non-choisis), on devrait trouver 5 chats.
En pratique, l'ancienne formule remplace chat par "000+", ce qui donne 1 000+ 100 poussin 800 poulet 4 000+ 300 chien. La formule remplace ensuite chaque lettre par "+", ce qui donne 1 000+ 100 +++++++ 800 ++++++ 4 000+ 300 +++++. Ensuite, EVALUER donne le total, soit 6200. Finalement, avec /1000 et ENT, la formule donne 6 chats, ce qui est faux.

Pour résoudre ce défaut, je met donc en pièce jointe une autre possibilité, fonctionnant presque suivant la même méthode :
En simplifiant, dans un premier temps, on remplace le mot recherché par + et tous les autres lettres par 1*0+.
Ainsi, la formule, avec 1 chat 100 poussin 800 poulet 4 chat 300 chien donne dabord 1 + 100 poussin 800 poulet 4 + 300 chien puis 1 + 100 1*0+1*0+1*0+1*0+1*0+1*0+1*0+ 800 1*0+1*0+1*0+1*0+1*0+1*0+ 4 + 300 1*0+1*0+1*0+1*0+1*0+0.
Dans un second temps, on calcule avec EVALUER le résultat de la somme. Dans l'exemple 1+1001*0+0+8001*0+0+4+3001*0+0=1+0+4+0 = 5.

Pour ce qui est de nommer des formules, sur Excel 2007 : Si la formule contient des références relatives, cliquer sur la cellule où sera utiliser le nom. Cliquer sur l'onglet Formules, puis sur gestionnaire de noms, puis sur nouveau. Donner un nom, et, en bas, écrire ou coller la formule.

@ plus
 

Pièces jointes

  • mike14EVALUERSUBST ter.xlsm
    10.2 KB · Affichages: 58
Dernière édition:

mike14

XLDnaute Nouveau
Re : Extraction d'informations dans une chaine de caractère

Merci Cisco pour cette nouvelle solution. Cependant pour mon application ça ne pose pas de problème car la somme ne dépassera pas 1000.

Par contre dans le cas où tu recherches pas "chat" mais "chat 1" j'ai trouvé une petite astuce
exemple de chaine :

1 chat 1 12 chat 3
si tu substitue en cherchant "chat 3", ça donne 1++++112000+ ce qui fait au bout 112 "chat 3",
pour contourner cela j'ai substitué " " par "+", et au lieu de faire une substitution de "chat 3" par 000+ j'ai fait une substitution de " chat 3" par 000+ (ajout de l'espace par concatenation)
1 chat 1 12 chat 3 devient alors 1+++++1+12000+ c'est à dire 12

J'espère que c'est compréhensible
 

Discussions similaires