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.
 

jurassic pork

XLDnaute Occasionnel
Hello,
Sylvanu ton idée est excellente mais ce que veut RollyLCXL C'est le comptage des occurrences si bien qu'avec :
VB:
=NB.SI(CN_TreeviewDocExtZone;"C-*")-NB.SI(CN_TreeviewDocExtZone;"C-*-*")
cela suffit


TooFatBoy l'idée est bonne mais le test est à inverser > 1 devient < 2
Code:
=SOMMEPROD((GAUCHE(CN_TreeviewDocExtZone;2)="C-")*(NBCAR(CN_TreeviewDocExtZone)-NBCAR(SUBSTITUE(CN_TreeviewDocExtZone;"-";""))<2))

Avec les formules de Sylvanu , de tooFatBoy et ma fonction personnalisée je trouve la même chose (2) sur cet échantillon de chaînes :
A-Avis de cotisation
C-AV-Contrat
D-Stocks--
C-Test----
C- Avis de prélèvement
C- Avec-
C-SansAutreTiret

J'ai mesuré les performances de ma fonction personnalisée (qui sera toujours moins rapide qu'une formule) avec cBenchmark pour voir si elle n'était pas trop lente :
VB:
Function CompteSequence(Plage, pattern, Optional caseSensitive = 0) As Integer
 Dim regex As Object, Ary As Variant, i As Long
 Dim bm As New cBenchmark
 Ary = Plage.Value
 bm.TrackByName "Copie Plage"
 Set regex = CreateObject("VBScript.RegExp")
 regex.pattern = pattern
 regex.IgnoreCase = caseSensitive
 CompteSequence = 0
 bm.TrackByName "Create Regex"
 For i = 1 To UBound(Ary)
    If regex.Test(Ary(i, 1)) Then CompteSequence = CompteSequence + 1
    bm.TrackByName "Regex"
 Next i
 bm.TrackByName "Fin"
End Function

Voici le résultat pour 7 lignes de données :
IDnrNameCountSum of ticsPercentageTime sum
0​
Copie Plage
1​
111​
1,10%11 us
1​
Create Regex
1​
9 70996,05%971 us
2​
Regex
7​
264​
2,61%26 us
3​
Fin
1​
24​
0,24%2400 ns
TOTAL
10​
10 108100,00%1,01 ms
Total time recorded:1,01 ms

Et pour 1000 lignes :
IDnrNameCountSum of ticsPercentageTime sum
0​
Copie Plage
1​
136​
0,43%14 us
1​
Create Regex
1​
10 38233,06%1,04 ms
2​
Regex1 00020 84666,38%2,08 ms
3​
Fin
1​
39​
0,12%3900 ns
TOTAL1 00331 403100,00%3,14 ms
Total time recorded:3,14 ms

Cela me paraît acceptable.

Ami calmant, J.P
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
TooFatBoy l'idée est bonne mais le test est à inverser > 1 devient < 2
Au temps pour moi, je croyais qu'il fallait compter ce qui commence par "c-" et qui contient plus d'un tiret.

Du coup je propose ceci :
Code:
=SOMMEPROD((GAUCHE(CN_TreeviewDocExtZone;2)="C-")*(NBCAR(CN_TreeviewDocExtZone)-NBCAR(SUBSTITUE(CN_TreeviewDocExtZone;"-";""))=1))
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
ce que veut RollyLCXL C'est le comptage des occurrences
A priori, la demande est au post #1 :
Je dois valider si dans le range il y a une valeur qui débute par C-
Donc pour moi il suffit de mettre 1 si la condition est remplie et "" dans le cas contraire.
D'où sa formule initiale :
VB:
SI(NB.SI(CN_TreeviewDocExtZone;"C-"&"*")>=1;1;"")
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…