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 :

sequence consecutive de numeros dans une suite de numeros


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Par défaut sequence consecutive de numeros dans une suite de numeros
    bonjour à tous
    je cherche depuis plusieurs jour à realiser un algo vba permettant de trouve des numeros consecutifs dans une serie de numeros
    soit la serie 1-12-5-6-13-4-3-20-2

    objectif : recherche les numeros qui se suivent de 3, 4 et 5 et faire apparaitre dans un textboxe le resultat
    sous la forme :
    il y a dans la serie X serie de 3 numeros qui se suivent( 1-3-2,..)
    il y a dans la serie y serie de 4 numeros qui se suivent(1-3-4-2,.......
    il y a dans la serie Z serie de 5 numero qui se suivent (1-3-5-4-2,........)

    merci de votre aide

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Sous quelle forme ta série ? Une chaîne de caractères ? Ou bien les numéros sont-ils chacun dans une cellule ?
    Edit
    Ta textbox se trouve-t-elle dans un userform ou dans la feuille de calculs ?

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Un bout de code peut-être ?

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    Ah ! J'aime beaucoup (enfin les méninges et non la récitation)...
    Je m'en occupe donc ...

    Allez, une démo à à "main levée", pour me lancer un petit (tout petit) défi :
    Dans ce qui suis, on part d'un Array non trié (serie), que l'on transforme en array trié (serietri). ici je l'ai trié à la main mais les exemples de code pour trier ne manquent pas sur ce forum (je ne m'y attarde donc pas)

    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
    Private Sub Command1_Click()
      serie = Array(1, 12, 5, 6, 13, 4, 3, 20, 2)
      serietri = Array(1, 2, 3, 4, 5, 6, 12, 13, 20)
      ou = 0
      cpt = 1
      For i = 1 To UBound(serietri)
        If serietri(i) - serietri(i - 1) = 1 Then
          cpt = cpt + 1
       Else
         If cpt > 2 Then Exit For
         ou = i
         cpt = 1
       End If
      Next
      If cpt < 2 Then Exit Sub
      For j = 3 To cpt
        Text1.Text = Text1.Text & "il y a " & j & " numeros ("
        For i = ou To ou + j - 1
         Text1.Text = Text1.Text & serietri(i)
        Next
        Text1.Text = Text1.Text & ") qui se suivent" & vbCrLf
      Next j
    End Sub
    Et voilà ...
    Ceci étant dit : tu ne nous as pas parlé de la possibilité de la présence de 2 (ou +) suites continues au sein de la même série. Je n'ai donc traité le cas que d'une seule série. Je te laisse le soin de comprendre ce raisonnement et d'aller plus loin (toujours avec le même raisonnement) si tu veux traiter le cas de plusieurs suites continues dans la même série.
    Observation : avec ma méthode, la suite continue commence où il en existe une et pas forcément au 1er numéro, hein... (bien évidemment).

    Bon dimanche, amitiés...
    et bonne continuation ...

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Par défaut serie
    bonjour
    tout d'abord merci de vos reponses ou questions.
    Pour repondre à ouskel'n'or et aux autres.
    les donnees sont issues dans tableau() de type variant
    les textboxe se trouve dans un userform.
    il y effectivement plusieur series

    voila comment je traite la serie ci dessus
    soit la serie 1-12-5-6-13-4-3-20-2
    je realise au choix de l'utilisateur toutes les combinaisons de taille 3 4 ou 5
    que je place dans un tableau() de type variant.
    ex
    si l'utilisateur choisit la taille 4
    je decompose la serie en combinaisons 1-12-5-6, ...........,4-3-20-2
    puis je relie le contenu du tableau et se passe chaques conbinaisons à la detection de

    numeros consecutif en fonction de la limite demande par l'utilisateur.
    ex si l'utilisateur veut eliminer toutes les combinaisons contenant une suite de 3 numeros consecutif.
    dans notre cas
    la combinaison de taille 4 1-4-5-6 sera eliminée.
    idem pour 5-4-3-2 sera eliminée.;;;

    etc.....

    je regarde le le code, je te tiens au courant

    A+

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonsoir,

    On "glisse" là vers autre chose non exprimé à l'ouverture de ta discussion, non ?

    Pour ma part :
    1) j'ai donné la solution au problème, tel qu'il était posé.
    2) si ta question était finalement autre (et il semble que oui) :
    a) il s'agit d'une succession de décisions et non plus d'une seule difficulté bien isolée
    b) j'attendrai que tu aies décidé de définir (dans un "post" différent) clairement et complètement ton problème, une fois pour toutes (je n'aime pas "avancer" (à la place d'un autre, et selon un rythme décidé par l'autre) pas à pas...
    J'espère avoir été clair.

    Bonne continuation...

  7. #7
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Par défaut serie
    bonsoir ucfoutu

    j'ai detaillé comme j'obtenais la serie à tester et rien d'autre!

    le code pour tester la cosecutivite de la serie reste mon probleme majeur.

    chaque probleme doit etre pris et examiné les uns apres les autres. Tu as raison.

    pour le code que tu as elaborer ,je regarde des que possible.

    merci
    je te tiens informé.

  8. #8
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Par défaut serie
    bonsoir
    je viens de regarder le debut du code .

    si j'ai tout compris, la partie suivante serietri = Array(1, 2, 3, 4, 5, 6, 12, 13, 20)
    contient la serie triée par ordre croissant .

    par rapport à ton code , il faut donc trier les numeros par ordre croissant.?

  9. #9
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Oui (et les exemples de tri ne manquent pas sur ce forum)

    Bonne continuation...

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    la combinaison de taille 4 1-4-5-6 sera eliminée.
    idem pour 5-4-3-2 sera eliminée.;;;
    Qu'entends-tu par "éliminée", tu veux dire qu'elles ne seront pas prises en compte ou que tu les exclus de ton tableau ?
    En dehors de quoi, au lieu de passer par un tableau, as-tu pensé à utiliser une collection ?
    A+

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Par défaut
    incr est l'incrément 1 pour des nombres consécutifs
    x est un ensemble indéfini de range array et valeurs
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    Function geser(incr As Integer, ParamArray x() As Variant) As String
    Dim bouc1, bouc2 As Variant
    Dim bouc3 As Integer
    Dim mamat As Variant
    Dim nb As Long
    Dim tempo As Variant
    Dim collresu As New Collection
    Dim chres As String
    'comptage des données
    For Each bouc1 In x
         If IsArray(bouc1) Then
            For Each bouc2 In bouc1
            nb = nb + 1
            Next bouc2
         Else
         nb = nb + 1
         End If
    Next bouc1
    'on remplit le vecteur résultat
    ReDim mamat(1 To nb, 1 To 2)
    nb = 0
    For Each bouc1 In x
         If IsArray(bouc1) Then
            For Each bouc2 In bouc1
            nb = nb + 1
            mamat(nb, 1) = bouc2
            Next bouc2
         Else
         nb = nb + 1
         mamat(nb, 1) = bouc1
         End If
    Next bouc1
    'on trie le vecteur
    For bouc1 = 1 To nb
        For bouc2 = bouc1 + 1 To nb
            If mamat(bouc1, 1) > mamat(bouc2, 1) Then
            tempo = mamat(bouc1, 1)
            mamat(bouc1, 1) = mamat(bouc2, 1)
            mamat(bouc2, 1) = tempo
            End If
         Next bouc2
    Next bouc1
     
    'attribution résultat
    For bouc1 = nb - 1 To 1 Step -1
    If mamat(bouc1, 1) - mamat(bouc1 + 1, 1) = -incr Then
        If mamat(bouc1 + 1, 2) = 0 Then
          mamat(bouc1, 2) = 2
          mamat(bouc1 + 1, 2) = 1
         Else
           mamat(bouc1, 2) = mamat(bouc1 + 1, 2) + 1
         End If
        Else
        mamat(bouc1, 2) = 0
    End If
    Next bouc1
     
     
     
    'gestion resultat
    For bouc1 = 1 To nb
    chres = "coucou"
    If mamat(bouc1, 2) <> 0 Then
    On Error Resume Next
    chres = collresu(Format(mamat(bouc1, 2), "0000"))
    If Err.Number = 5 Then
    collresu.Add key:=Format(mamat(bouc1, 2), "0000"), Item:=Format(mamat(bouc1, 2), "0000") & "/" & mamat(bouc1, 1)
    Err.Clear
    Else
    collresu.Remove (Format(mamat(bouc1, 2), "0000"))
    collresu.Add key:=Format(mamat(bouc1, 2), "0000"), Item:=chres & "/" & mamat(bouc1, 1)
    End If
    bouc1 = bouc1 + mamat(bouc1, 2) - 1
    End If
    Next bouc1
    For Each bouc1 In collresu
    chres = (Len(bouc1) - Len(Replace(bouc1, "/", ""))) & " série de " & Val(bouc1) & Chr(10)
    mamat = Split(Right(bouc1, Len(bouc1) - 4), "/")
    For bouc2 = 0 To UBound(mamat)
        For bouc3 = 1 To Val(bouc1)
        chres = chres & (((bouc3 - 1) * incr) + mamat(bouc2)) & ";"
        Next bouc3
        chres = chres & Chr(10)
    Next bouc2
    MsgBox (chres)
    Next bouc1
    End Function

  12. #12
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Par défaut serie
    bonsoir à tous
    pour repondre ouskel'n'or.
    j'entends par eliminer, cest à dire une fois l'ensemble des combinaisons crees (par exemple total des combinaisons =15 avant les filtres), et stockées dans mon tableau() de type variant, je les lis les unes par unes et les passe dans les differents filtres comme celui des consecutifs.
    ce qui, à la fin du passage de toutes les combinaisons dans les divers filtres, certaines sont eliminées et sur les 15 combinaisons au depart , je me retrouve avec , par exemple , 10 combinaisons jouables.

    merci pour tous vos codes
    je vais regarder cela.

  13. #13
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Par défaut serie
    bonsoir
    j'apporte une precision concernant la maniere d'extraire la combinaison et le chiffre dans la combinaison
    chiffre (de type long)= Resultat(combinaisonN°, postionchiffre)
    chiffre(de type long) = la variable chiffre que je vais exploiter de type long
    combinaisonN°(de type long) = le numero de la combinaison contenu dans le tableau
    positionchiffre(de type long)= la position du chiffre dans la combinaison selectionner par "combinaisonn°".

    ex si la combinaison n° 2 est : 1-8-9-6
    la positionchiffre =2 alors chiffre = 8


    cordialement

Discussions similaires

  1. Requete pour trouver des trous dans une suite
    Par Ben_Le_Cool dans le forum Langage SQL
    Réponses: 11
    Dernier message: 28/08/2009, 18h17
  2. [XL-2007] Incrémenter une valeur dans une suite de nombre
    Par beast666 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/04/2009, 15h18
  3. Réponses: 1
    Dernier message: 18/06/2008, 14h15
  4. Recherche de mot précis dans une suite de mot
    Par Adrien38240 dans le forum C
    Réponses: 4
    Dernier message: 02/06/2008, 11h25
  5. [RegEx] Recherche dans une suite de nombres
    Par alibab dans le forum Langage
    Réponses: 11
    Dernier message: 20/09/2007, 08h04

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