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

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.
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Peut-être un truc comme ça :
Code:
=SI(ET(GAUCHE(CN_TreeviewDocExtZone;2)="C-";NBCAR(CN_TreeviewDocExtZone)-NBCAR(SUBSTITUE(CN_TreeviewDocExtZone;"-";""))>1);1;"")
 
Dernière édition:

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 :


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
si j'ai bien compris tu veux en fait comptabiliser les cellules de la plage CN_TreeviewDocExtZone1 qui contiennent la séquence qui commence par C- avec pas d'autres tirets et avoir le résultat (donc un nombre) dans une cellule de résultat ?
 

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

 

RollyLCXL

XLDnaute Nouveau
Merci Jurassic. Cela fonctionne très bien. J'ai appliqué le ComppteSequence. Je n'avais pas bien compris auparavant. POur ce qui ets de Regex ... je ne peux pas vraiment appliquer ceci.

C'est vraiment super! Wow!
 

Discussions similaires

Réponses
16
Affichages
2 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…