Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2021 VBA format d'un Like

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Dudu2

XLDnaute Barbatruc
Bonjour,
Je m'y perds avec ces foutus Like...
Je dois vérifier qu'une chaine saisie est une suite de chiffres [0-9] de longueur quelconque/une suite de chiffres [0-9] de longueur quelconque.
VB:
If Chaine like "*#/*#" then MsgBox "OK" '??????????????????????????????????
 
et bien dans ce cas là c'est encore plus simple
il te suffit d’évaluer
puisque la chaine est sensé avoir la même forme qu'une division voir suite de division
VB:
Sub test2()
chaine = "dfrgfr68/52frferf"
MsgBox Not IsError(Evaluate("0" & chaine))

chaine = "2/12"
MsgBox Not IsError(Evaluate("0" & chaine))

chaine = "52/1"
MsgBox Not IsError(Evaluate("0" & chaine))

chaine = "52/1/4523"
MsgBox Not IsError(Evaluate("0" & chaine))

chaine = "a2/1"
MsgBox Not IsError(Evaluate("0" & chaine))

chaine = "45/1E"
MsgBox Not IsError(Evaluate("0" & chaine))

End Sub
je te laisse deviner pour quoi le "0" &
 
Re,
Pourquoi ne pas passer par un array, cela semble répondre à tous les besoins :
Code:
Function Nombre(N)
Nombre = False
T = Split(N & "/", "/")
If UBound(T) = 1 Or UBound(T) > 2 Then Exit Function
If IsNumeric(T(0) & T(1)) Then Nombre = True
End Function
 

Pièces jointes

et pour rester dans le like on peut utiliser l’exclusion"!" très rarement utilisé d'ailleurs a tord
et pour le coup on limite aussi a une seule opération la chaine un nombre /par une autre nombre
VB:
Sub testss()
chaine = "45/2"
MsgBox Not chaine Like "*[!0-9/]*" And Not chaine Like "*/*/*"

End Sub
"*[!0-9/]*
 
re
3 likes
VB:
Sub test()
chaine = "145254/7452652"
MsgBox chaine Like "*#/#*" And Not chaine Like "*[!0-9/]*" And Not chaine Like "*/*/*"

'1°  Like "*#/#*"'                      -->au moins un chiffre ou plus +/+au moins un chiffre mais permet les  lettres
'2° And Not chaine Like "*[!0-9/]*"'    -->exclu les caractères autre que 0 à 9  et le "/"'qui règle le problème du 1er like 
'3° And Not chaine Like "*/*/*"         -->exclu la possibilité de plus de deux segments donc un seul séparateur
End Sub
 
re
a h oui je n'ai pas pensé aux décimales
le " "0" & c'est pour eviter que evaluate évalue une cellule plutôt que la chaine

exemple x=evaluate("A1/12365") évaluerait la valeur de [A1] et non le texte "A1"

donc avec le "0" & l’évaluation serait x=evaluate("0A1/12365")

0A1 n'est pas une cellule et donc ça passe en texte 😉

mais le problème des décimales rend la chose caduque

conclusion tu a le choix soit le split de @sylvanu soit mes trois likes
 
au pire un like perso avec un simple test regex avec le patterne restrictif (début --> finde chaine) avec que des num et "/"
le pattern étant extériorisé la fonction est réutilisable avec un autre pattern
VB:
Sub test()
    MsgBox LikePerso("452d36/7586", "^\d+/\d+$")
 End Sub
 Function LikePerso(ByVal txt, PatternX As String) As Boolean
    With CreateObject("VBScript.RegExp")
        .Pattern = PatternX
        .IgnoreCase = True
        .Global = False
        LikePerso = .test(CStr(txt))
    End With
End Function
 
Bonsoir,

avec Like


VB:
Sub TesterToutesLesCombinaisons()
    ' Déclaration du tableau avec toutes les chaînes fournies
    Dim MesTests As Variant
    MesTests = Array("123456789/987654321/-1234/123.45/123a45", "1234/56789/0123/45", "12/5", "3/14", "0/1", "123456/7890", "12 / 5", " 12/5", "12/5 ", "abc/12", "12/abc", "12/", "/12", "12-5", "12//5", "12/5/7", "12.5/7", "12/7.5", "", " ", "12/ 5", " 12 / 5 ", "0012/0005", "125635/45236/45896", "125635/ert45236/edfr45896", "dfrgfr8/5frferf", "dfrgfr68/52frferf", "3/12", "215/3", "25/84a", "a25/84", "123/456789", "1/789", "123/5", "123/4156", "2/12", "52/1", "52/1/4523", "a2/1", "45/1E", "45/2", "145254/7452652", "12.5/4.25", "A1/12365", "0A1/12365", "452d36/7586")

    Dim i As Integer
    Dim Resultat As String
    
    Debug.Print "--- DÉBUT DES TESTS ---"
    
    For i = LBound(MesTests) To UBound(MesTests)
        If EstValide(CStr(MesTests(i))) Then
            Resultat = "OK"
        Else
            Resultat = "NON"
        End If
        
        ' Affichage du résultat
        ' On ajoute une petit marque pour les cas où vos commentaires prédisaient l'inverse
        Debug.Print Resultat & " | " & Chr(34) & MesTests(i) & Chr(34)
    Next i
    
    Debug.Print "--- FIN DES TESTS ---"
End Sub

' Fonction de validation stricte : [0-9]+/[0-9]+
Function EstValide(LaChaine As String) As Boolean
    Dim p As Integer
    Dim PartieGauche As String, PartieDroite As String
    
    EstValide = False ' Par défaut on refuse
    
    ' 1. Vérifier la présence d'au moins un slash
    p = InStr(LaChaine, "/")
    If p = 0 Then Exit Function
    
    ' 2. Vérifier qu'il n'y a QU'UN seul slash (position du dernier slash = position du premier)
    If InStr(p + 1, LaChaine, "/") > 0 Then Exit Function
    
    ' 3. Vérifier qu'il n'y a pas de slash au début ou à la fin
    If p = 1 Or p = Len(LaChaine) Then Exit Function
    
    ' 4. Isoler les parties
    PartieGauche = Left$(LaChaine, p - 1)
    PartieDroite = Mid$(LaChaine, p + 1)
    
    ' 5. Vérifier strictement que ce sont des chiffres [0-9] et rien d'autre
    ' L'astuce String(Len, "#") crée le motif exact de la bonne longueur
    ' Ex: "123" devient "###", "a12" devient "###" mais ne matche pas
    
    If PartieGauche Like String(Len(PartieGauche), "#") And _
       PartieDroite Like String(Len(PartieDroite), "#") Then
        EstValide = True
    End If
End Function
 
et ben dis donc allez moi je vais un peu divaguer ca fait du bien
VB:
Sub test()
MsgBox isvalidChaine("1256325/212563")
End Sub

Function isvalidChaine(txt)
    Dim a&, b, part1 As Boolean, part2 As Boolean
    a = InStr(1, txt, "/")
    If a > 0 Then part1 = IsNumeric(Mid(txt, 1, a - 1)) And Int(Mid(txt, 1, a - 1)) = Val(Mid(txt, 1, a - 1))
    b = InStr(a + 1, txt, "/")
    If b = 0 Then
        part2 = IsNumeric(Mid(txt, a + 1)) And Int(Mid(txt, a + 1)) = Val(Mid(txt, a + 1))
    End If
isvalidChaine = part1 And part2 = True
End Function
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
15
Affichages
808
Réponses
4
Affichages
284
Réponses
16
Affichages
513
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…