Merci.
Merci.
Dernière modification par LittleWhite ; 15/04/2018 à 16h41.
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)...
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
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 : 456555567
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Function repet(Cel As Range, chiffre) repet = IIf(InStr(Cel.Value, chiffre) >= 1, "Yes", "No") End Function
=repet(B2;555)
Cordialement
Ryu
La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein
Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple
Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie
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...
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
un dérivé de la fonction simple :
Edit : pour ressembler à la 1ère (post #24) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Cordialement
Ryu
La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein
Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple
Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie
Bonjour Pierre
les approches sont innombrables.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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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")
Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .
****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...
Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
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'AUTRE
Code : Sélectionner tout - Visualiser dans une fenêtre à part application.rept(valeur,repetition)
et cela pour du texte ou des nombres
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 Functionformule texte
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
=comptechar(A2;"a";5) ' teste si "a" est répété 5 foismille excuse pour la meprise=comptechar(A1;2;6)'teste si "2" est répété 6 fois
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Cordialement,
Franck
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 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 besoins
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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)
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
@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
Cordialement,
Franck
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
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
et n'oublie pas de voter
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager