Texte GetNumOnText

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
comme la fonction SPLITEXTNUM que nous avons développé @Yeahou et moi

Aujourd’hui je vous présente sa petite sœur

j'invite bien entendu @Yeahou et tout autres membres à apporter des modifs ou des idées qui apporteraient un plus

c'est la fonction GetNumOnText

parti encore une fois d'une idée de @job75 (très inspirant ce @job75 ;) )qui est de récupérer une chaîne numérique dans une chaîne alphanumérique
j'ai développé cette petite fonction de la même manière que sa petite sœur
a savoir elle retourne une matrice ou valeur
elle est utilisable en VBA ou en formule non matricielle et/ou matricielle

quelque chose me dis que @Yeahou va avoir envie d'y jeter un coup d' œil 🤣
VB:
'******************************************************
'            FONCTION GetNumOnText
'auteur:Patricktoulon sur ExcelDownloads
'Date:19/09/2021
'la fonction retourne une matrice ou un item(NUMERIQUE!!!) du split d'une chaine Alphanumerique
'la matrice retourné peut etre un array ou un tableau 2 dim (vertical ou horizontal) ou une valeur de la matrice
'Attention a l'heure actuelle la matrice est en base 0 !!!!!
'------------------------------------------
'argument:
'argument(T) attend un string
'argument(Index) attend un chiffre)
'argument(ConvertNum) attend un boolean ou 0/1 en formule
'cet argument active la conversion numerique si virgule ou point  en separateur decimal dans l'item trouvé
'------------------------------------------

'-----------------------les formules:--------------------------
'--------------------------------------------------------------
'en matricielle horizontal ou vertical est la meme
' =GetNumOnText(SOURCE)| etendu sur x cellule verticalement ou horizontalement et VALIDE PAR CTRL+MAJ+ENTER
'SOURCE etant l'adresse d'une !! cellule
'--------------------------------------------------------------
'en mode unitaire
'=GetNumOnText(SOURCE;index)
'SOURCE étant l'adresse d'une cellule
'index etant un nombre correspondant a l index recherché
'ex: =GetNumOnText(A4:2) --->> la 3 eme valeur numerique dans la chaine qui se trouve en A4
'--------------------------------------------------------------


'test vba en matrice ou la  valeur d'un item
Sub test2()
    T$ = ",45/6bonj.our0,123"
    MsgBox GetNumOnText(T, 1)    'exemple récupération du 3eme nombre(le tableau est en base(0))
    MsgBox GetNumOnText(T)(1)    'exemple récupération du 2d item dans le !!!tableau complet !!!! en prenant l'index du 2d (base(0))
End Sub

Function GetNumOnText(ByVal T As String, Optional Index As Long = -1, Optional ConvertNum As Boolean = False)
    Dim I&, TbL
    If ConvertNum Then T = Replace(T, ",", ".")
    I = 1
    For I = I To Len(T)
        If Mid(T, I, 1) Like "[!0-9|.|,]" Then Mid(T, I, 1) = " "
        If Mid(T, I, 1) Like "[.|,]" Then If Mid(T, I - IIf(I > 1, 1, 0), 1) Like "[!0-9|]" Or Mid(T, I, 1) Like "[!0-9,.]" Then Mid(T, I, 1) = " "
    
    Next

    With Application
        If TypeName(.Caller) = "Range" Then
            'si la fonction a été appelée par une formule
            If Index = -1 Then 'si pas d'index demandé c'est une matricielle
                If .ThisCell.Offset(1).Formula = .ThisCell.Formula Then 'si matricielle verticale
                    GetNumOnText = .Transpose(Split(Application.Trim(T) & Application.Rept(" ", 1000)))
                Else
                    GetNumOnText = Split(Application.Trim(T) & Application.Rept(" ", 1000), " ") ' si matricielle horizontal

                End If
            Else
                'si index demandé et si le text n'est pas vide  return  de l'item demandé
                If T = "" Then GetNumOnText = "" Else GetNumOnText = Split(Application.Trim(T) & Application.Rept(" ", 1000), " ")(Index)
            End If

        Else
            ' si la fonction a été appelée par VBA
            If Index = -1 Then
                GetNumOnText = Split(Application.Trim(T), " ")
            Else
                GetNumOnText = Split(Application.Trim(T), " ")(Index)
            End If

        End If
    End With
End Function
j'ai fait un petit fichier exemple pour toute les méthodes en pièces jointes
demo7.gif

Enjoy
 

Pièces jointes

  • fonction GetNumOnText all Mode.xlsm
    22.4 KB · Affichages: 19
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re,

Je viens de faire un essai avec :
1,55 romina,007** |666|AF46
Pour le 3ème chiffre, la fonction renvoie : "666|". Si "|" n'est pas collé à droite de 666 --> 666.
Bon, ce n'est pas très fréquent que l'on utilise "|". Mais dans des codes à la mords-moi le nœud...
Sinon, tout le reste semble bien marcher.
 

patricktoulon

XLDnaute Barbatruc
re
solution:
changer la ligne
VB:
 If Mid(T, I, 1) Like "[.|,]" Then If Mid(T, I - IIf(I > 1, 1, 0), 1) Like "[!0-9|]" Or Mid(T, I, 1) Like "[!0-9,.]" Then Mid(T, I, 1) = " "
 

Magic_Doctor

XLDnaute Barbatruc
Re,

C'est presque parfait, dans la mesure où ça ne tient pas compte des chiffres négatifs.
Peut-être, rajouter un argument optionnel : par défaut tient compte des chiffres négatifs, sinon n'en tient pas compte (car "-" pourrait très bien être aussi un séparateur).
Par exemple, une suite d'intervalles :
[321 , 556]
[-208 , -55] ...
On tient compte des chiffres négatifs.

Petula-306
Hildgarde-88 ...
On ne tient pas compte des chiffres négatifs ("-" est ici un séparateur).
 

patricktoulon

XLDnaute Barbatruc
Bonjour @Magic_Doctor

c'est une chose impossible ça
comment veux tu que vba devine si entre ces deux phrases par exemple

bannane-255 blablabla
bannane -255 blablabla


la quelle est un nombre négatif ou contient simplement un séparateur de chaîne
c'est pas le but de la fonction
le but c'est de chopper les suites numériques entière ou décimales
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re,

C'est bien pour ça que j'avais précisé dans mon précédent post :
Peut-être, rajouter un argument optionnel : par défaut tient compte des chiffres négatifs, sinon n'en tient pas compte (car "-" pourrait très bien être aussi un séparateur).
Dans les arguments de la fonction, en dernière option optionnelle, par exemple :
Optional sep As Boolean = False
Function GetNumOnText(ByVal T As String, Optional Index As Long = -1, Optional ConvertNum As Boolean = False, Optional sep As Boolean = False)

Par défaut sep (le séparateur) est Faux --> "-" est considéré comme un chiffre négatif
Si sep est True --> "-" est considéré comme un séparateur

Ce sera à l'opérateur et à lui seul de choisir ce qu'il veut bien chercher.
Dans ta fonction actuelle GetNumOnText, sep serait True ("-" est considéré uniquement comme un séparateur).

Dans l'exemple que tu donnes :
bannane-255 blablabla
bannane -255 blablabla


Dans le 1er cas, "-" ne peut être qu'un séparateur
Dans le 2d, "-" est plus vraisemblablement un signe négatif. Si c'était un séparateur, on aurait dû écrire, en toute logique : bannane - 255 blablabla
Mais il est vrai que la logique n'est pas toujours au rendez-vous, surtout dans les formulaires administratifs...

Mais, si l'on reste strictement logique, on pourrait très bien considérer les choses ainsi :
- s'il n'y a pas d'espace à gauche du "-", c'est forcément un séparateur
- s'il y a un espace à gauche et aucun à droite du "-", c'est forcément un signe négatif

Malheureusement, la 1ère condition achoppe, au moins dans ce cas de figure classique, par exemple : ]-3 ; 45]
Ici, à gauche du "-" il n'y a pas d'espace et c'est pourtant bien un signe négatif.
En conséquence, ce n'est seulement que l'opérateur qui peut décider d'avance ce qu'il recherche en paramétrant bien la fonction.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
c'est là que l'on se comprends pas tout les deux
comment veux tu décider d'un argument a envoyer si tu le vois c'est sur mais pour une automation en serie c'est rappée
je vais répéter pour que l'on se comprenne mieux tout les deux
bannane-255 blablabla
bannane -255 blablabla


en quel honneur on devrait décider si le tiret est un séparateur ou le signe d'une suite numerique relative
l'espace?
ok d'accords
mais si la chaîne est bien un nombre relatif mais qu'il n'y a pas d'espace dans la chaîne globale on fait quoi???????
tu vois ce que je veux dire
en fait il faut bien comprendre que le traitement de texte en informatique VBA ou autres a ces limites
après on est dans l'intelligence artificielle en vba c'est pas encore ,c'est pour office 2099 je crois ;) 🤣
 

Magic_Doctor

XLDnaute Barbatruc
Re,

Pas d'accord.

Quand on cherche quelque chose, on sait forcément ce que l'on recherche.
1/ On cherche des nombres codes : on considère alors que "-" est un séparateur.
2/ On cherche des nombres y compris négatifs : on considère alors que "-" est un signe.
À l'opérateur d'en décider suivant ses desiderata.
Dans le premier cas, il mettra True pour "sep".
Dans le second cas, il mettra False (ou rien) pour "sep".

Ta fonction ne considère, pour le moment, que le second cas.
 

Discussions similaires

Réponses
2
Affichages
315

Membres actuellement en ligne

Statistiques des forums

Discussions
315 098
Messages
2 116 189
Membres
112 679
dernier inscrit
Yupanki