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

Réponses
16
Affichages
2 K

Statistiques des forums

Discussions
315 095
Messages
2 116 162
Membres
112 674
dernier inscrit
AKD