Récupérer une valeur numérique dans un texte

Enfaite cette formule ne s'appliquera pas à toutes les cellules de la colonne A cas certaine auront uniquement une unique valeur numérique ou aucune valeur numérique donc je suis obligée de passer par du VBA pour mettre des conditions d'utilisation de cette fonction que je ne peux pas étirer tout au long de ma colonne (le but étant également d'automatiser un opérateur doit juste avoir à appuyer sur un bouton pour que tout se fasse tout seul)

Non mais ça devient une fonction qu'on peut imbriquer dans d'autres fonctions.

Et il faut que tu la testes déjà parce qu'elle renvoie vide lorsque elle ne trouve pas la correspondance.

Et quand bien même, tu peux saisir :

=SIERREUR(EXTRACT_NUMBER([@A];1);"")

et le tour est joué...

5exemple.xlsx (9.96 Ko)

comme demandé voici un fichier exemple de ce que j'aimerais avoir à la fini si ça peut aider

Je suis totalement perdue j'ai l'impression que vous me parlez chinois ... il faut que ce soit absolument dans mon VBA je n veux pas de formule à trainer dans le document excel.

Je te retourne quand même le fichier (à calculer car sur mon mac ça ne marche pas). Il y a une formule...

Mais, il est possible de boucler sur la colonne A par VBA...

Sub a()

for i = 1 to 10
    cells(i, 2) = EXTRACT_NUMBER(cells(i,1), 1)
    cells(i, 3) = EXTRACT_NUMBER(cells(i,1), 2)
next i

end sub

Cela fonctionne en parti avec les formules or il prend toujours la deuxième valeur numérique qui n'est parfois pas une épaisseur c'est pour cela que le VBA va me permettre des choisir quelle formule va avec qui et dans le code que vous me donner peut on travailler avec le nom des colonnes du tableau plutôt qu'avec les coordonnées des cellules ? C'est mon majeur problème ne plus travailler avec les coordonnées mais les intersections.

Salut MAN,
Courage 3GB, on va y arriver !

Avec un fichier, tu remarqueras, MAN, que c'est plus rapide de trouver un début de solution : inspire t'en à l'avenir !

compliqué avec tous ces espaces ! Á tester si d'autres configurations !
Y a-t-il TOUJOURS un "X" (pas une autre lettre ?) quand il faut trouve 2 nombres ?

Un double-clic sur la feuille démarre la macro qui ne peut fonctionner que dans le cadre de l'exemple fourni.
Pour d'autres événements, prière de décrire précisément ce que tu souhaites !

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim iRev%, sData$, sStr$
Cancel = True
'
Set obj = CreateObject("vbscript.regexp")
obj.Global = True
obj.Pattern = "[a-z]"
'
For x = 2 To Range("A" & Rows.Count).End(xlUp).Row
    iRev = InStrRev(Cells(x, 1), " ")
    iRev = IIf(iRev > 0, iRev - 1, Len(Cells(x, 1)))
    sData = LCase(Left(Cells(x, 1), iRev))
    MsgBox sData
    iIdx = IIf(InStr(sData, "x") = 0, 1, 2)
    For y = 1 To iIdx
        sStr = Split(sData, "x")(y - 1)
        sStr = obj.Replace(sStr, "")
        If IsNumeric(sStr) Then Range("A" & x).Offset(0, y).Value = sStr
    Next
Next
'
End Sub
3man.xlsm (18.09 Ko)


A+

Edit : oublié d'enlever...

MsgBox sData

Déso, hein...

Bonjour toutes et tous

coucou @ tous

SURTOUT ===>ne pas cliquer sur le bouton ok <=== (laissez faire , modification du code de Curulis57 ^^

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim iRev%, sData$, sStr$
Cancel = True
'

On Error Resume Next
On Error GoTo 0
Set obj = CreateObject("vbscript.regexp")
obj.Global = True
obj.Pattern = "[a-z]"
'
For x = 2 To Range("A" & Rows.Count).End(xlUp).Row
    iRev = InStrRev(Cells(x, 1), " ")
    iRev = IIf(iRev > 0, iRev - 1, Len(Cells(x, 1)))
    sData = LCase(Left(Cells(x, 1), iRev))
   ' MsgBox sData
    CreateObject("WScript.Shell").Popup "Je clique sur mon OK tout seul", 2, "" & sData & "Message", 64
    iIdx = IIf(InStr(sData, "x") = 0, 1, 2)
    For y = 1 To iIdx
        sStr = Split(sData, "x")(y - 1)
        sStr = obj.Replace(sStr, "")
        If IsNumeric(sStr) Then Range("A" & x).Offset(0, y).Value = sStr
    Next
Next
'
0 Exit Sub
End Sub

trop la flemme d'appuyer sur Ok

crdlt,

André

Curulis : Oui, enfin, on y est déjà arrivés depuis longtemps selon moi...

Man : Une fois que tu as la fonction, il suffit de l'utiliser à ta convenance :

Sub onvayarriver()

'...

N = cells(Application.rows.count, 1).end(xlup).row
for i = 1 to N
    range("B" & i) = EXTRACT_NUMBER(range("A" & i), 1)
    If range("A" & i) Like "*#x#*" then 'si c'est une dimension
        range("C" & i) = EXTRACT_NUMBER(range("A" & i), 2)   
    else 'sinon
        range("C" & i) = 0.5  
    end if
next i 

'...

end sub

Moi aussi je mets mes lunettes de soleil

Salut 3GB,

je t'avouerai que, à une lecture diagonale des posts successifs pas trop concluants à priori, je ne voulais plus "travailler" sans un fichier-exemple.
Sans doute est-ce réglé depuis longtemps : déso, je n'essaye pas tout!

héhé,
A+

Bonsoir Man.403030, le Forum,

Vu que tu as posté un fichier. En retour il te suffira de cliquer sur le bouton et de lire la note.

En souhaitant que d'autres précisions de ta part ne manquent pas.

X cellus je suis en train d'essayer d'appliquer le code de ton fichier dans mon projet je me demande juste Lig c'est bien la ligne ?

Sur ces lignes de code :

Mot = Range("A" & Lig): ch = Mid(Mot, C, 1)
If ch < "A" And ch <> "." Then Range("B" & Lig) = Range("B" & Lig) & ch: Prem = 1
If Prem = 1 And ch >= "A" Then Exit For

on fait quoi je ne comprends pas ? J'ai l'impression que l'on compare une valeur texte ?

Est ce que tu peux m'indiquer le type de chaque variable stp ? et surtout commenter un tout petit peu pour que je comprenne car je déteste mettre du code que je ne comprends pas. Si un jour j'ai à le refaire je n'en serai pas capable.

Merci à tous pour votre aide

UPDATE : j'ai réussi à appliquer ton code X cellus par contre négligence de ma part d'un point auquel je n'avais pas pensé certain noms sont précédés du symbole

@

donc quand je lance mon code la valeur de la largeur prend pour valeur ce symbole....

Bonjour Man.403030,

Effectivement Lig est une variable pour désigner généralement la ligne.

Ensuite @ étant placé juste avant le A selon l'ordre ASCII.

Il faut changer dans les conditions là ou se trouve le A par @. Donc if ch < "@" plutôt que if ch < "A" ....etc...

Ainsi ce dernier ne sera pas pris en compte comme caractère Texte.

Puis si le tout te convient n'oublie pas.

Ca ne marche par car le espaces doivent être > au arobase

J'ai exclu les espaces pour qu'ils ne soient pas pris en compte comme les points, quand je lance le code j'ai pourtant toujours un problème il considère que la valeur numérique n'est pas inférieure au arobase. C'est en faisant tourner le déboggeur que je m'en suis aperçue ... est ce que c'est possible que mes caractères respectent un autre langage que le ASCII ?

D'abord pourquoi il y a l'arobase?

Le plus souvent utilisé pour le mail ou dans le cas de formule.

Dans le fichier proposé, aucun n'y figurait.

C'est dans le cadre d'un travail en entreprise c'est une notation qu'ils utilisent. Elle se trouve toujours au premier caractère mais que sur certains noms. Peut être on pourrait comment le code à partir du deuxième caractère car une chose est sure jamais la valeur à récupérer sera dans le premier caractère.

Evidemment le document c'est moi qui l'ai adapté pour enlever toute trace de données confidentielles et j'ai zappé de rajouter un cas avec un arobase

Suite,

Donc, si l'arobase est toujours comme premier caractère et qu'il n'y a pas de chiffre comme premier caractère si l'arobase est absent.

Tu peux modifier la boucle

For C = 1 To Len(Range("A" & Lig))

Au lieu de 1 tu tapes 2 afin de zapper le 1ier caractère

D'accord sinon j'ai remplacé chaine > arobase par Asc(chaine)> Asc(arobase) et cela fonctionne, ne me reste plus qu'a traiter le cas des points maintenant que j'ai compris le fonctionnement ça devrait être rapide. Merci pour votre aide

Rechercher des sujets similaires à "recuperer valeur numerique texte"