Microsoft 365 Formules ne contenant qu'un tiret

RollyLCXL

XLDnaute Nouveau
Bonjour,

Dans un range ne contenant qu'une colonne ... j'ai des valeurs. Par exemple.

A-Avis de cotisation
C-AV-Contrat
D-Stocks
Etc.

Je dois valider si dans le range il y a une valeur qui débute par C- ... mais ... qui ne contient ensuite pas d'autres tirets dans la chaine. Actuellement j'utilise la formule SI(NB.SI(CN_TreeviewDocExtZone;"C-"&"*")>=1;1;"")

Alors cela résulte avec la valeur 1. Alors qu'il ne faudrait pas que cela résulte par un 1 mais avec "".

Y aurait-il une formule qui pourrait retourner la valeur souhaitée dans ces cas?

Même que si la formule pourrait aussi valider que la chaîne ... débute ... par C- ce serait encore mieux. Car ma formule actuelle retournerait un 1 avec une chaîne telle que "Allo C-Avis".

Merci à l'avance.
 

jurassic pork

XLDnaute Occasionnel
Hello,
RollyLCXL je vois que tu as Microsoft 365 alors tu disposes peut-être dans les fonctions de REGEXTEST qui permet d'utiliser les expressions régulières. Avec cette formule :
VB:
=SI(RegexTest(A1;"^C-[^-]+$");1;"")
Cela devrait fonctionner :
RegexTest.gif


Explication du motif ^C-[^-]+$ :
Texte qui commence par C- (^C-) suivi de caractères qui ne contiennent pas le tiret ( [^-]+) jusqu'à la fin du texte ($)
Pour ceux qui comme moi ne possède pas Excel 365 voici une fonction personnalisée en VBA qui se substitue à cette fonction :
VB:
Function RegexTest(text, pattern, Optional caseSensitive = 0) As Boolean
 Dim RegEx As Object
 Set RegEx = CreateObject("VBScript.RegExp")
 RegEx.pattern = pattern
 RegEx.IgnoreCase = caseSensitive
 RegexTest = RegEx.Test(text)
End Function

Ami calmant, J.P
 

JHA

XLDnaute Barbatruc
Bonjour à tous,

A essayer
VB:
=SOMME(--(STXT(A2;LIGNE(INDIRECT("1:"&NBCAR(A2)));1)="-"))=1
ou
VB:
=SOMMEPROD(--(STXT(A2;LIGNE(INDIRECT("1:"&NBCAR(A2)));1)="-"))=1

JHA
 

Pièces jointes

  • Classeur nombre de tiret.xlsx
    9.1 KB · Affichages: 3

RollyLCXL

XLDnaute Nouveau
Vraiment un grand merci à tous. Mais ... cela ne fonctionne pas. Je reçois des messages d'erreur #Ref!, #Valeur! et surtout #Propagation!.

Car ... je dois savoir si dans le Range CN_TreeviewDocExtZone1 ... donc qui contient plusieurs cellules dans une même colonne et non que pour une cellule. Comme un NB.SI avec des critères ou un SOMMEPROD. J'ai essayé avec quelques manipulations mais je n'y arrive pas.

Dans le fond ce que je recherche à savoir est ... dans le Range combien y a t'il de cellules qui ne contiennent pas plus de un tiret et qui commencent par "C-".

Clea me semble difficile. Peut-être n'est-ce pas possible? Même si j'ai de la difficulté à admettre une telle possibilité.

Aussi nos usagers n'ont pas tous Office 365. Sinon je devrai donner une directive aux usagers que les textes en question ne doivent pas contenir plus d'un tiret.

Merci à l'avance.
 

jurassic pork

XLDnaute Occasionnel
En faisant la somme du résultat du Regex pour chaque cellule ou avec une fonction personnalisée qui compte les séquences correspondantes dans une plage :
VB:
Function CompteSequence(Plage, pattern, Optional caseSensitive = 0) As Integer
 Dim RegEx As Object, Ary As Variant, i As Long
 Ary = Plage.Value
 Set RegEx = CreateObject("VBScript.RegExp")
 RegEx.pattern = pattern
 RegEx.IgnoreCase = caseSensitive
 CompteSequence = 0
 For i = 1 To UBound(Ary)
    If RegEx.Test(Ary(i, 1)) Then CompteSequence = CompteSequence + 1
 Next i
End Function

CompteSequence.gif
 

Discussions similaires

Réponses
16
Affichages
2 K

Statistiques des forums

Discussions
315 095
Messages
2 116 159
Membres
112 673
dernier inscrit
ìntellisoft