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 :

Nombre de séquence


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Renens
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Renens

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut Nombre de séquence
    Bonjour,

    Je vous joints ci-joints un fichier test.
    Je vous conseille de le télécharger avant de lire la suite parce que je crois que ca peut vite devenir compliqué^^

    J'ai donc un tableau avec différent chiffre qui représente des codes internes.
    En premier lieu, j'aimerais transformé tout les chiffres en 0
    les cellules sans chiffre en 1 aussi
    et les chiffres 30, 40 et 41 en 2
    J'ai réussi à la faire avec la fonction recherche, remplace mais ça prend beaucoup de temps et je voudrais voir si il y un autre moyen.

    En second lieu et là ça se complique, j'aimerais analyser cette suite de chiffre.
    En effet nous aurons sur ce tableau par la suite des suites comprenant le 0,1,2

    En fait le code numéro 2 représente l'absence pour maladie et j'aimerais pourvoir calculer le nombre de cas maladie.
    Par exemple

    une séquence de type --> 0000002222200022220000222000
    Dans cette exemple, il y a trois séquence de 2 et donc trois cas maladie.
    Pour terminer si un 1 et précédé d'un deux j'aimerais que le 1 et les 1 qui le suit se transforme en deux

    Exemple: 0000222112220022122122000 --> ici il y a donc 5 séquence de deux
    Cette séquence devra être affiché de la sorte
    0000222222220022222222000
    Au final, il y a 2 séquence de deux

    J'aimerais avoir donc au final le nombre de séquence de deux par personne
    Je ne sais pas si j'ai été assez clair
    N'hésitez pas en cas de questions


    Cordialement
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    En premier lieu, j'aimerais transformé tout les chiffres en 0
    tu peux voir avec "SpecialCells(xlCellTypeConstants)" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Plage.SpecialCells(xlCellTypeConstants).Value = 0
    les cellules sans chiffre en 1 aussi
    toujours avec "SpecialCells" mais sur les cellules vides :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Plage.SpecialCells(xlCellTypeBlanks).Value = 1
    et les chiffres 30, 40 et 41 en 2
    c'est ce cas qui complique la chose, il te faut faire un bouclage pour trouver ces valeurs et tu ne peux pas utiliser "SpecialCells" car ces valeurs vont disparaître avec "Plage.SpecialCells(xlCellTypeConstants).Value = 0" !
    Je te propose d'utiliser un tableau intermédiaire pour effectuer les recherches et modifs :
    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()
     
        Dim Tbl
        Dim Plage As Range
        Dim I As Long
        Dim J As Long
     
        Set Plage = Range("B5:AE96")
     
        Tbl = Plage
     
        For I = 1 To UBound(Tbl, 1)
     
            For J = 1 To UBound(Tbl, 2)
     
                Select Case Tbl(I, J)
     
                    Case 30, 40, 41: Tbl(I, J) = 2
     
                    Case Is <> 0: Tbl(I, J) = 0
     
                    Case Is = "": Tbl(I, J) = 1
     
                End Select
     
            Next J
     
        Next I
     
        Plage = Tbl
     
    End Sub
    En fait le code numéro 2 représente l'absence pour maladie et j'aimerais pourvoir calculer le nombre de cas maladie.
    Par exemple
    une séquence de type --> 0000002222200022220000222000
    Dans cette exemple, il y a trois séquence de 2 et donc trois cas maladie.
    C'est une chaîne dans une cellule ou une plage de cellules où chacune contient un chiffre ?
    Pour terminer si un 1 et précédé d'un deux j'aimerais que le 1 et les 1 qui le suit se transforme en deux

    Exemple: 0000222112220022122122000 --> ici il y a donc 5 séquence de deux
    Cette séquence devra être affiché de la sorte
    0000222222220022222222000
    Au final, il y a 2 séquence de deux
    Même question que précédemment !

    Hervé.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    alors dans le cas où les séries sont dans une seule et même chaîne, une fonction qui compte les fréquences (résultat dans la fenêtre d'exécution Ctrl+G) :
    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
     
    Sub Test2()
     
        Dim Chaine As String
     
        Chaine = "0000002222200022220000222000"
     
        Debug.Print Frequence(Chaine)
     
    End Sub
     
    Function Frequence(Chaine As String) As Integer
     
        Dim I As Integer
        Dim J As Integer
     
        For I = 1 To Len(Chaine)
     
            If Mid(Chaine, I, 1) = 2 Then
     
                Frequence = Frequence + 1
     
                For J = I + 1 To Len(Chaine)
     
                    If Mid(Chaine, J, 1) <> 2 Then Exit For
                    I = J
     
                Next J
     
            End If
     
        Next I
     
    End Function
    et une fonction qui effectue le remplacement sans modifier la chaîne d'origine (argument passé par valeur "ByVal") :
    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
     
    Sub Test3()
     
        Dim Chaine As String
     
        Chaine = "01202221122200221221220210"
     
        Debug.Print Remplace(Chaine)
     
    End Sub
     
    Function Remplace(ByVal Chaine As String) As String
     
        Dim I As Integer
        Dim J As Integer
     
        For I = 1 To Len(Chaine)
     
            If Mid(Chaine, I, 1) = 2 Then
     
                For J = I + 1 To Len(Chaine)
     
                    If Mid(Chaine, J, 1) = 2 Then Exit For
     
                        If Mid(Chaine, J, 1) = 1 And Mid(Chaine, J - 1, 1) = 2 Then Chaine = Left(Chaine, J - 1) & "2" & Right(Chaine, Len(Chaine) - J)
     
                    I = J
     
                Next J
     
            End If
     
        Next I
     
        Remplace = Chaine
     
    End Function
    bien évidemment, tout ça est à adapter à ton cas.

    Hervé.

  4. #4
    Membre averti
    Homme Profil pro
    Renens
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Renens

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    Salut,

    Alors le premier code fonctionne parfaitement je t'en remercie.

    Pour la seconde question c'est une chaîne de valeur ou chaque cellule à un chiffre
    Je te mets le fichier avec le premier code que tu m'as fournis peut être tu verras mieux la chaine de valeur.

    J'ai essayé les deux autres codes que tu m'as fournis mais j'ai pas le resultat escompté.

    les chiffres 1 et la suite de 1 qui suit qui sont précédé d'un 2 ne se change pas
    Donc un série
    22211100010102212
    Devra être affiché 22222200010102222

    Je ne sais pas si c'est plus clair

    Cordialement
    Fichiers attachés Fichiers attachés

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    les chiffres 1 et la suite de 1 qui suit qui sont précédé d'un 2 ne se change pas
    l'exemple que je t'ai posté remplace les 1 qui suivent un 2 mais ça dans une chaîne et pas dans une plage de cellules !
    Pour faire cette manip dans une plage de cellules, pas besoin de fonction, une Sub suffit. Pour le test (adapter la plage de cellules) :
    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
     
    Sub Remplace()
     
        Dim Plage As Range
        Dim I As Integer
        Dim J As Integer
     
        'défini la plage de cellules, à adapter...
        Set Plage = Range("B51:AE51")
     
        For I = 1 To Plage.Count
     
            If Plage(I).Value = 2 Then
     
                For J = I + 1 To Plage.Count
     
                    If Plage(J).Value = 2 Then Exit For
     
                        If Plage(J).Value = 1 And Plage(J - 1).Value = 2 Then Plage(J).Value = 2
     
                    I = J
     
                Next J
     
            End If
     
        Next I
     
    End Sub
    Idem pour le comptage de fréquences (dans ce cas ci, la fonction est maintenue. Adapter la plage) :
    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
     
    Sub Test2()
     
        Dim Plage As Range
     
        Set Plage = Range("A1:A21") '<-- adapter...
     
        MsgBox Frequence(Plage)
     
    End Sub
     
    Function Frequence(Plage As Range) As Integer
     
        Dim I As Integer
        Dim J As Integer
     
        For I = 1 To Plage.Count
     
            If Plage(I).Value = 2 Then
     
                Frequence = Frequence + 1
     
                For J = I + 1 To Plage.Count
     
                    If Plage(J).Value <> 2 Then Exit For
                    I = J
     
                Next J
     
            End If
     
        Next I
     
    End Function
    Hervé.

  6. #6
    Membre averti
    Homme Profil pro
    Renens
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Renens

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    Je ne sais pas comment te remercier
    C'est parfait

    J'ai juste un souci avec le dernier code qui compte les fréquences
    En fait j'aimerais à la fin de chaque ligne mettre donc le nombre de fréquence de 2
    Donc une nouvelle colonne sera présente au bout des lignes avec le résultat du nombre de fréquence de 2
    Est ce que cela est faisable ??

    Cordialement

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Comme la fonction ne change pas, je poste seulement la proc appelante. Le nombre de fréquences sera inscrit dans la cellule qui suit la plage, si c'est A1:R1, le résultat sera inscrit en S1 et si c'est A1:A21, le résultat sera inscrit en A22. Il te faut supprimer la ligne de code qui ne sert 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
     
    Sub Test2()
     
        Dim Plage As Range
     
        Set Plage = Range("A1:R1") '<-- adapter...
     
        'inscrit le nombre de fréquences dans la cellule qui suit la plage...
        'pour une plage horizontale
        Plage.Cells(Plage.Row, Plage.Columns.Count + 1).Value = Frequence(Plage)
     
        'pour une plage verticale
        Plage.Cells(Plage.Rows.Count + 1, Plage.Column).Value = Frequence(Plage)
     
        'supprimer la ligne qui ne sert pas !
     
    End Sub
    Si tu veux définir plusieurs plages qui sont par exemple à l'horizontale (en ligne) il te suffit de boucler et d'appeler la fonction à chaque fois :
    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
     
    Sub Test2()
     
        Dim Plage As Range
        Dim I As Integer
     
        For I = 1 To 100
     
            'sur la feuille active, de la colonne A (1) à la colonne R (18)
            'et de la ligne 1 à la ligne 100
            Set Plage = Range(Cells(I, 1), Cells(I, 18)) '<-- adapter...
     
            'inscrit le nombre de fréquences dans la cellule qui suit la plage
            Cells(I, Plage.Columns.Count + 1).Value = Frequence(Plage)
     
        Next I
     
    End Sub
    Hervé.

  8. #8
    Membre averti
    Homme Profil pro
    Renens
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Renens

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    Salut,

    Je suis vraiment navré mais j'ai testé le code et celui-ci ne fonctionne pas
    Je ne sais pas la raison mais un message d'erreur apparaît.

    Je voulais savoir si il était possible de compter le nombre de fréquence sans passer par une macro?

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    C'est quoi le message d'erreur ? Chez moi ça fonctionne très bien. Exemple, de A1 à R1 j'ai la séquence suivante : 002220220002220222 et le résultat, 4 séquences, est bien inscrit en cellule S1.
    Je voulais savoir si il était possible de compter le nombre de fréquence sans passer par une macro?
    La fonction que je t'ai posté peut être utilisée dans une feuille Excel. J'ai modifié le nom de la fonction pour ne pas entrer en conflit avec la native d'Excel. Tu remplace la fonction "Frequence" par la fonction "NB_FREQUENCE" ci-dessous et dans la feuille de calcul tu entre la formule sous cette forme : =NB_FREQUENCE(A1:R1)
    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 NB_FREQUENCE(Plage As Range) As Integer
     
        Dim I As Integer
        Dim J As Integer
     
        Application.Volatile
     
        For I = 1 To Plage.Count
     
            If Plage(I).Value = 2 Then
     
                NB_FREQUENCE = NB_FREQUENCE + 1
     
                For J = I + 1 To Plage.Count
     
                    If Plage(J).Value <> 2 Then Exit For
                    I = J
     
                Next J
     
            End If
     
        Next I
     
    End Function
    Hervé.

  10. #10
    Membre averti
    Homme Profil pro
    Renens
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Renens

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    Alors pour le premier code que tu m'as transmis
    J'ai le message d'erreur suivant
    "Erreur de compilation - Sub ou Function non défini"

    Pour ton dernier message
    Si j'ai bien compris j'introduis le code
    Et après je tappe la fonction NB_FREQUENCE(A1:R1)
    et cela doit marcher?

    Parce que je fais ça mais je peux exécuter le code
    et quand je tape le NB_FREQUENCE
    Ca me mets
    #NOM?

    Je sais pas ce que je fais de faux

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Alors pour le premier code que tu m'as transmis
    J'ai le message d'erreur suivant
    "Erreur de compilation - Sub ou Function non défini"
    En faisant le copier/coller tu as dus estropier un mot d'où le message d'erreur car le compilateur ne le reconnait pas !
    Je te poste un classeur exemple pour que tu puisse réaliser des tests en ligne 1 de A1 à R1.

    Hervé.
    Fichiers attachés Fichiers attachés

  12. #12
    Membre averti
    Homme Profil pro
    Renens
    Inscrit en
    Août 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Renens

    Informations forums :
    Inscription : Août 2015
    Messages : 12
    Par défaut
    C'est parfait
    ça fonctionne

    Je te remercie pour le temps que tu as passé sur mon problème
    Je n'aurais jamais réussis sans toi
    Mille merci

    Cordialement
    Hakan

  13. #13
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Mais je t'en prie, c'est avec plaisir !

    Hervé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/11/2009, 01h41
  2. Binarisation d'une séquence de nombres aléatoires
    Par cs_ntd dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 10/06/2009, 21h45
  3. RemoteBlast : nombre de séquences
    Par Jasmine80 dans le forum Bioinformatique
    Réponses: 4
    Dernier message: 30/04/2009, 12h26
  4. sed et correspondance exacte du nombre de séquence d'un caractère
    Par N_BaH dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 11/02/2009, 19h01
  5. Réponses: 1
    Dernier message: 27/03/2008, 11h57

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