IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Définir la valeur mini qui a le plus d'occurences


Sujet :

Macros et VBA Excel

  1. #41
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    Cela dépend du PC dont je dispose; parmi la foultitude de gratuits : LICEcap …

    Sinon pour des présentations avec du son (voix off) : Camtasia (MAC) ou Camtasia Studio (PC) …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  2. #42
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    Merci je vais regarder
    en attendant ta réponse j'ai trouvé screentogif mais il me semble lourd a l'exécution mais fonctionne très bien
    Nom : Animation.gif
Affichages : 185
Taille : 707,9 Ko
    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

  3. #43
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    alors la respect entre licecap et screentogif il y a un monde

    licecap et beaucoup plus simple et surtout moins lourd a l'exécution
    par contre c'est vrai il manque tout les outils qu'il y a sur screentogif
    nickel je garde
    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

  4. #44
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Pour titiller Patrick, autrement et sans vrai apport
    Le marteau pour tuer la mouche mais pour chercher les valeurs consécutives identiques (à toute fin utile)

    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
    Function LeMin(ByVal Rng As Range, ByVal NbOcc As Long)Dim Rg As Object, A As Object, B As Object
    Dim Res As Double, Mn As Double
    Dim Tmp As String, S As String
     
     
    S = Space(2)
    Res = Application.Max(Rng)
    Mn = Application.Min(Rng)
    Tmp = S & Join(Application.Transpose(Rng), S) & S
     
     
    Set Rg = CreateObject("vbscript.regexp")
    With Rg
        .Global = True
        .Pattern = "(\D\d+\D)\1{" & NbOcc - 1 & ",}"
        If .Test(Tmp) Then
            Set A = .Execute(Tmp)
            For Each B In A
                Res = Application.Min(Split(B.Value)(1), Res)
                If Res = Mn Then Exit For
            Next B
            LeMin = Res
        End If
    End With
    Set Rg = Nothing
    End Function
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #45
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    re
    Bonjour Mercatog

    a ben moi qui avais honte de sortir mon outils de fainéant a chaque fois(dictionary)

    la je crois que tu m'a battu

    cela dit c'est bien tordu comme j'aime surtout que j'aime bien faire joujou avec un regex

    une seule chose que je comprends pas c'est le pattern


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
    MsgBox LeMin(Range("A1:A25"), 3)
    End Sub
    pour le pattern ca donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     .Pattern = "(\D\d+\D)\1{" & NbOcc - 1 & ",}"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Pattern = "(\D\d+\D)\1{2}"
    j'ignorais que l'opérande était possible dans le regex comme ca

    bon malgré l'inutilité d'une tel mécanique pour faire ce que l'on a besoins ca me plait beaucoup

    confirme moi que ce qui est en rouge veut bien dire

    1
    représente 1 fois l'ensemble qu' il précède et bien évidement le 2 entre les accolades sont le nombre de répétition demandées
    ou
    1 fois le même nombre répété 2 fois
    j'ai bien compris ??? car j'ai des doutes
    le "(\D\d+\D)" pourrait être n'importe quel nombre


    sinon juste pour le sport!!
    je ré utilise le regex pour les matches comme j'ai souvent l'habitude de le faire
    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
    Sub test()
    MsgBox LeMin(Range("A1:A25"), 3)
    End Sub
    Function LeMin(ByVal Rng As Range, ByVal NbOcc As Long)
    Dim Rg As Object, A As Object, B As Object, z As String
    Dim Res As Double, Mn As Double
    Dim Tmp As String, S As String
     
     
    S = Space(2)
    Res = Application.Max(Rng)
    Mn = Application.Min(Rng)
    Tmp = S & Join(Application.Transpose(Rng), S) & S
     
     MsgBox Tmp
    Set Rg = CreateObject("vbscript.regexp")
    With Rg
        .Global = True
        .Pattern = "(\D\d+\D)\1{" & NbOcc - 1 & ",}"
       'equivalent en dur .Pattern = "(\D\d+\D)\1{2}"
     
        If .test(Tmp) Then
            Set A = .Execute(Tmp)
           .Pattern = "(\D\d+\D)"
            For Each B In A
                 z = .Execute(B)(0)
                Debug.Print "triplet  =  " & z
                Res = Application.Min(z, Res)
                If Res = Mn Then Exit For
            Next B
            LeMin = Res
        End If
    End With
    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

  6. #46
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Patrick bonjour

    Regarde le point III-C-6. Références du Tuto de Cafeine sur les Regexp

    Ce que j'ai compris: Le groupe 1 (càd celui entre parenthèse) est répété au moins 2 autres fois

    J'aurais pu faire aussi
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #47
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonjour,
    bien vu mercatog !
    Tu peux éventuellement éviter le Split du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Res = Application.Min(Split(B.Value)(1))
    puisque tu as les SubMatches de B à ta disposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Res = Application.Min(B.SubMatches(0), Res)
    Tu peux également légèrement simplifier le pattern à condition d'utiliser une seule espace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Tmp = Join(Application.Transpose(Rng), " ") & " "
    '...
    .Pattern = "(\d+\s)\1{" & NbOcc - 1 & ",}"
    et sortir directement de la fonction après ton test Mais là c'est du chipotage...
    A+

  8. #48
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonjour davido84,

    Pour le pattern, c'est ce que j'avais au départ fais, mais prend en compte des situations non voulues
    Exemple d'une liste
    25, 5, 5, 1

    Il prend bien le 5 comme répété 3 fois
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  9. #49
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Exact !
    Comme quoi je n'aurais pas dû me contenter de ne tester que l'exemple indiqué...
    A+

  10. #50
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Je suis sûr que tu vas proposer un pattern plus joli davido84.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  11. #51
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Désolé mais pour l'instant je n'ai pas mieux !
    Si une idée me vient je te fais signe !

    David

  12. #52
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut
    je ne voudrais pas casser l'ambiance et la fièvre créative de chacun
    mais voudrais rappeler que l'auteur du post n'a pas montré ni le bout de son nez ni aucun remercîment au participants

    en effet tieumav est intervenu dans le post 3 et depuis plus rien

    je trouve très énervant personnellement. encore un dans ma liste noire
    pour le coup moi aussi je cherche un joli pattern

    ah!!! au fait
    @Mercatog
    a quoi sert la virgule dans ton pattern ??, ca fonctionne très bien sans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Pattern = "(\D\d+\D)\1{" & NbOcc - 1 & ",}"
    re
    @Mercatog
    je viens de m'apercevoir aussi que rept fonctionne très bien malgré ton exemple 1,222,22
    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
    Sub test2()
        MsgBox LeMin(Range("A1:A20"))
    End Sub
    Function LeMin(ByVal Rng As Range)
        Dim Tmp As String, S As String
        Dim Mn As Long
        Mn = Application.Max(Rng)
        Tmp = Join(Application.Transpose(Rng), ",")
        Debug.Print "Tmp= " & Tmp
        For i = 1 To Rng.Rows.Count
            If InStr(Tmp, Application.Rept(Rng.Cells(i) & ",", 3)) Then Mn = IIf(Rng.Cells(i) < Mn, Rng.Cells(i), Mn)
        Next
        Debug.Print "le plus petit est!  " & Mn
        LeMin = Mn
    End Function
    Nom : demo2.gif
Affichages : 269
Taille : 297,9 Ko
    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

  13. #53
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Patrick

    Sans la virgule: Exactement 3 occurrences
    Avec la virgule: Au moins 3 occurrences

    Avec le Rept, tu as ajouté la virgule c'est pour ça.

    Autre chose?
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  14. #54
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    non ca va
    je cherche toujours un pattern mais le tiens a définitivement clos les possibilités de meilleure écriture

    ok pour la nuance de la virgule (compris)
    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

  15. #55
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonjour,
    on peut éventuellement modifier le pattern pour ramener directement dans A la valeur unique et non la suite de valeurs qui se répètent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Pattern = "(\s\d+\s)(?=\1{" & NbOcc - 1 & "})"
    et donc traiter directement la valeur capturée à la place de l'utilisation d'un autre pattern, d'un split ou d'un SubMatches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For Each B In A    
        Res = Application.Min(B.Value, Res)
        If Res = Mn Then LeMin = Res: Exit Function
    Next B
    On peut même ne pas utiliser B puisque cette valeur unique est la valeur de A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For i = 0 To A.Count - 1     
         Res = Application.Min(A(i).Value, Res)
         If Res = Mn Then LeMin = Res: Exit Function
    Next i
    mais cela nous oblige à abandonner la boucle For...Each donc peut-être pas intéressant.
    Inconvénient de la méthode : cela peut engendrer plus de valeurs à traiter si une suite de même valeur se répète au-delà du nombre d'occurrences indiqués dans le 2ème argument de la fonction...

    A+

  16. #56
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonjour,

    pour éviter le petit inconvénient relevé à la fin de mon message précédent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Pattern = "(\s\d+\s)(?=\1{" & NbOcc - 1 & "}(?!\1))"
    Par rapport à la proposition de mercatog on se retrouve avec un pattern plus complexe mais une extraction des correspondances plus directe.
    Pas sûr que l'on y gagne au change...mais c'est surtout pour explorer le RegExp !

    A+

Discussions similaires

  1. [XL-2003] Tableau: trouver la colonne qui a le plus de valeur
    Par deamonRav dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/04/2010, 10h58
  2. Réponses: 1
    Dernier message: 30/05/2007, 14h25
  3. [Debutant(e)]définir les valeurs possibles d'un param
    Par mouste79 dans le forum Langage
    Réponses: 7
    Dernier message: 18/11/2004, 11h48
  4. Root qui ne peux plus rien faire :'(
    Par Smortex dans le forum Administration
    Réponses: 2
    Dernier message: 27/09/2004, 21h13
  5. Qui ne voi plus les images ou smiley du forum ?
    Par Marc Lussac dans le forum Evolutions du club
    Réponses: 30
    Dernier message: 13/09/2004, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo