Merci.
Version imprimable
Merci.
Patrick,
Je retire ce que j'ai dit (mais je te laisse le +1 ;), car ça m'a donné l'idée)... Ca me renvoie YES même si les chiffres ne se suivent pas (je n'avais pas testé avant d'applaudir, mais en relisant ton code, je ne voyais pas comment cela pouvait fonctionner)...
Pièce jointe 362997
Mais ton idée est bonne... Voici ton code modifié pour que cela fonctionne (selon la demande initiale qui était de spécifier un chiffre bien défini). Comme quoi il y a souvent plusieurs chemins... ;)
Code:
1
2
3
4
5
6 Function CompteChiffre1(Valeur As String, Chiffre As Long, Repetition As Long) Dim Chaine As String Chaine = String(Repetition, Chiffre & "") CompteChiffre1 = UBound(Split(Valeur, Chaine)) > 0 End Function
Un grand merci Pierre, c'est parfait!
Merci à tous pour vos solutions, vous êtes géniaux!!!
autre solution basique mais simple si l'on veut viser plus spécialement un chiffre avec sa répétition au minimum
Ex. valeur de Cel : 456555567Code:
1
2
3 Function repet(Cel As Range, chiffre) repet = IIf(InStr(Cel.Value, chiffre) >= 1, "Yes", "No") End Function
=repet(B2;555)
Ce que j'apprécie particulièrement dans cette discussion (mais dans d'autres aussi), c'est que les différentes approches permettent à des utilisateurs de tous niveaux de s'y retrouver et d'avoir une solution à leur portée. L'important est qu'il y a d'abord une obligation de résultat, et c'est ce qu'illustre Arnaud
C'était aussi une solution, comme celle de Ryu qui, pour être basique mais simple, comme il dit, n'en est pas moins fonctionnelle (pour la question initiale).
L'approche de Ryu, qui plus est, permettrait, pour la question initiale, basiquement mais simplement, de se passer de VBA...
Pièce jointe 363009
En fait j'ai un petit soucis, le code fonctionne pour la première ligne, mais quand j'étire la formule je ne comprends pas les résultats qui ressortent (voir ci-dessous) :
Pièce jointe 363013
Pièce jointe 362995
Pour info dans ma colonne N, le nombre sont en format nombre.
Sorry, j'avais oublié de placer la répétition sur le 9.
Voici un code qui fonctionne (j'ai ajouté Pattern = Pattern & Rep après la boucle).
Question subsidiaire: Ca doit compter sur les valeurs avec décimales ou tu considères que ta suite de chiffres est une chaine de caractères?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Function SuiteChiffreOk(Valeur As String, Repetition As Long) As Boolean Dim RegExp As Object Dim Pattern As String Dim Rep As String Dim Counter As Long Rep = "{" & Repetition & "}" Pattern = "0" For Counter = 1 To 9 Pattern = Pattern & Rep & "|" & Counter Next Pattern = Pattern & Rep Set RegExp = CreateObject("VBScript.RegExp") RegExp.Pattern = Pattern SuiteChiffreOk = RegExp.test(Valeur) Set RegExp = Nothing End Function
Parfait, encore un grand merci!
Je considère la suite de chiffres comme un chaine de caractère, autrement dit je m'en fiche des décimales, et encore autrement dit votre code correspond parfaitement à ma demande.
Avec le code que je te donne, si tu souhaites tester 122,222245 et voir si un chiffre se répète 6 fois de suite, la fonction renverra FAUX.
Si tu veux que le comptage considère qu'il n'y a pas de décimales, tu devras utiliser la version suivante, dans laquelle je remplace , et . par rien. Par contre, il n'est pas nécessaire de se préoccuper du séparateur de milliers qui n'est pas passé à la fonction. A toi de voir ;)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Function SuiteChiffreOk(Valeur As String, Repetition As Long) As Boolean Dim RegExp As Object Dim Pattern As String Dim Rep As String Dim Counter As Long Valeur = Replace(Replace(Valeur, ".", ""), ",", "") Rep = "{" & Repetition & "}" Pattern = "0" For Counter = 1 To 9 Pattern = Pattern & Rep & "|" & Counter Next Pattern = Pattern & Rep Set RegExp = CreateObject("VBScript.RegExp") RegExp.Pattern = Pattern SuiteChiffreOk = RegExp.test(Valeur) Set RegExp = Nothing End Function
un dérivé de la fonction simple :
Edit : pour ressembler à la 1ère (post ) :Code:
1
2
3
4
5
6
7
8
9
10
11 Function repetition(Cel As Range, repet As Byte) Dim i As Byte For i = 1 To Len(Cel.Value) If InStr(Cel.Value, String(repet, Mid(Cel.Value, i, 1))) >= 1 Then repetition = "Yes" Exit For Else repetition = "No" End If Next End Function
Code:
1
2
3
4
5
6
7 Function repetition(Cel As Range, repet As Byte) Dim i As Byte For i = 1 To Len(Cel.Value) repetition = IIf(InStr(Cel.Value, String(repet, Mid(Cel.Value, i, 1))) >= 1, "Yes", "No") If repetition = "Yes" Then Exit For Next End Function
Bonjour Pierre
les approches sont innombrables.Citation:
Ce que j'apprécie particulièrement dans cette discussion (mais dans d'autres aussi), c'est que les différentes approches permettent à des utilisateurs de tous niveaux de s'y retrouver et d'avoir une solution à leur portée
En voilà une autre :
et si strconv peut en rebuter certains, voilà la même chose (un peu moins rapide) avec Mid :Code:
1
2
3
4
5
6
7
8
9
10
11 toto = "22122222213333333111177777777777744" nb = 6 ' la cndition.nombre minimum de répétitions titi = Split(StrConv(" " & toto, vbUnicode), Chr(0)) meszozos = "": deja = "" For I = 0 To UBound(titi) - 1 If InStr(deja, titi(I)) = 0 And toto Like "*" & String(nb, titi(I)) & "*" Then meszozos = meszozos & vbCrLf & titi(I) deja = deja & titi(I) End If Next MsgBox "liste des chiffres répétés au moins " & nb & " fois de suite" & IIf(meszozos <> "", meszozos, vbCrLf & "aucun")
(je préfère la plus grande agilité de la première des deux. Le nombre de lignes de code n'est pas ce qui importe).Code:
1
2
3
4
5
6
7
8
9
10 toto = "22122222213333333111177777777777744" nb = 6 ' la cndition.nombre minimum de répétitions For I = 1 To Len(toto) c = Mid(toto, I, 1) If InStr(deja, c) = 0 And toto Like "*" & String(nb, c) & "*" Then meszozos = meszozos & vbCrLf & Mid(toto, I, 1) deja = deja & c End If Next MsgBox "liste des chiffres répétés au moins " & nb & " fois de suite" & IIf(meszozos <> "", meszozos, vbCrLf & "aucun")
oui pierre j'avais pas compris qu'il fallait absolument que la valeur recherchée avec repetition devait se suivre
en relisant l'enoncé en post 1 effectivement j'ai busé le "fois de suite" autant pour moi
il y avait aussi
EDIT PETITE ADAPTATION D'UNE METHODE OU L'AUTRECode:application.rept(valeur,repetition)
et cela pour du texte ou des nombres
Code:
1
2
3 Public Function comptechar(cel As Range, valeur, repetition As Long) comptechar = IIf(UBound(Split(cel.Value, Application.Rept(valeur, repetition))) > 0, "yes", "no") End Function
formule texteCode:
1
2
3 Public Function comptechar(cel As Range, valeur, repetition As Long) comptechar = IIf(UBound(Split(cel.Value, String(repetition, valeur & ""))) > 0, "yes", "no") End Function
Citation:
=comptechar(A2;"a";5) ' teste si "a" est répété 5 fois
mille excuse pour la meprise :oops:Citation:
=comptechar(A1;2;6)'teste si "2" est répété 6 fois
Bonjour,
Les possibilités étant innombrables, je me permet trois petits détours (Like, Replace et Instr)...
Toutes sur le même schéma, un Do Loop sur le Split d'une constante afin d'en tirer tous les "pattern" possibles grâce à la fonction String.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 Option Explicit Private Const STRP As String = "0 1 2 3 4 5 6 7 8 9" Sub MainTest() Dim m As String m = Inl("22234444", 0) & " " & Inl("22234444", 2) & " " & Inl("22234444", 4) & " " & Inl("22234444", 5) & vbCrLf m = m & Inr("22234444", 0) & " " & Inr("22234444", 2) & " " & Inr("22234444", 4) & " " & Inr("22234444", 5) & vbCrLf m = m & Ini("22234444", 0) & " " & Ini("22234444", 2) & " " & Ini("22234444", 4) & " " & Ini("22234444", 5) MsgBox m End Sub Function Inl(strC As String, lngRept As Integer) As Boolean Dim cpt As Integer, t If lngRept > 0 Then t = Split(STRP, " ") Do Inl = strC Like "*" & String(lngRept, t(cpt)) & "*" cpt = cpt + 1 Loop While Not Inl And cpt <= 9 End If End Function Function Inr(strC As String, lngRept As Integer) As Boolean Dim cpt As Integer, L As Integer, t If lngRept > 0 Then t = Split(STRP, " ") Do L = Len(Replace(strC, String(lngRept, t(cpt)), "")) Inr = ((Len(strC) - L) Mod lngRept = 0) And Len(strC) > L cpt = cpt + 1 Loop While Not Inr And cpt <= 9 End If End Function Function Ini(strC As String, lngRept As Integer) As Boolean Dim cpt As Integer, t If lngRept > 0 Then t = Split(STRP, " ") Do Ini = InStr(1, strC, String(lngRept, t(cpt))) > 0 cpt = cpt + 1 Loop While Not Ini And cpt <= 9 End If End Function
re
bonjour a tous
je ne voudrais pas prolonger une discussion plus qu'il ne faut mais il me parraissait important d'attirer votre attention sur ce point
POURQUOI LIMITER LA FONCTION A VRAI/FAUX OU YES/NO COMME VOUS VOULEZ
je me suis dit
1°et si je voudrais non pas savoir si oui ou non mais mais avoir le retour du nombre d'occurences chaine identiques qui se suivent
2°et si je voudrais non pas savoir si oui ou non mais mais avoir le retour du nombre d'occurences chaine identiques qui ne se suivent pas forcement
j'ai donc limité paradoxalement:mouarf: la fonction a retourner le nombre d'occurence et dans la formule je gere le vrai/faux par la condition si()
comme vous le voyez ci dessous tout se gere avec le 2d et 3eme argument de la fonction et le test ">" dans la condition "si()" selon mes besoinsCode:
1
2
3 Public Function comptechar(cel As Range, valeur, repetition As Long) comptechar = UBound(Split(cel.Value, Application.Rept(valeur, repetition))) End Function
- y a-t-il "2" 5 fois de suite dans la cellules la formule : =SI(comptechar(A3;2;3)>0;"yes";"no")
- combien de fois il y a "aaa" dans la cellule la formule =comptechar(A2;"a";3)
- y a-t-il "22" 3 fois de suite dans la cellules la formule : =SI(comptechar(A3;22;3)>0;"yes";"no")
- y a-t-il plusieurs fois "22" pas forcement qu'il se suivent dans la cellule la formule =SI(comptechar(A5;22;1)>1;"yes";"no")
- combien de fois il y a "22" pas forcement qu'il se suivent dans la cellule la formule =comptechar(A2;22;1)
- y a-t-il plusieurs fois "toto" pas forcement qu'il se suivent dans la cellule la formule =SI(comptechar(A5;"toto";1)>1;"yes";"no")
demo
Pièce jointe 363310
a noter que j'aurais pu faire exactement la meme chose en utilisant un argument supplementaire dans un select case dans la fonction pour choisir le type/mode de retour de la fonction et ainsi se passer de la condition "si()" dans la formule
j'ai voulu la garder la plus simple possible c'est pour cela que j'ai choisi cette methode
a noter aussi par exemple en ligne 2 dans la capture j'aurais pu utiliser =comptechar(A2;"aaa";1)
@Patrick,
Le nombre d’occurrences est également sujet à interprétation.
Ainsi, dans 22222234 on peut y voir :
> 3 fois 22 :
22222234
> 5 fois 22 :
22222234
22222234
22222234
22222234
22222234
re
bonjour franck
comme on teste une chaine et que en plus il est précisé "fois de suite" ton interprétation est erronée
2222 n'est pas 3 fois 22 de suite comme tu le sous entends
cela dit ta remarque est pertinante mais on parle de combinasion voir d'un nombre puissance len(....)
2222
le1 avec le 2d
le 1 avec le 3eme
le 1 avec le 4eme
le 2d avec le 3eme
etc...etc.....
d'ailleurs il me semble avoir fait un exercice comme ca avec le regex celui ci me semble t il ,donnait bien le nombre sans les combinaison croisée
a verifier