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 :

Compter les changements de valeur dans une colonne


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut Compter les changements de valeur dans une colonne
    Bonjour, je suis débutant sous excel vba, et j'ai le problème suivant :

    j'ai une colonne constituée de 0 et de 1, par exemple :
    0
    0
    1
    0
    1
    1
    0

    J'aimerais compter le nombre de changements, et plus précisément :
    - a chaque fois qu'il y a un passage de 0 à 1, j'incrémente une variable VAR1
    - a chaque fois qu'il y a un passage de 1 à 0, j'incrémente une variable VAR2
    - lorsqu'il n'y a pas de changement, les variables ne bougent pas...

    seulement voila, je ne sais pas comment faire la comparaison entre une cellule et la suivante...

    je précise que le nombre de cellules de la colonne n'est pas fixe...

    merci d'avance!

  2. #2
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Colonne A
    la liste vont de la première ligne à la dernière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
    Dim var1 As Long, var2 As Long
    Dim i As Long
    For i = 2 To Range("A65536").End(xlUp).Row
    If Cells(i, 1) - Cells(i - 1, 1) > 0 Then
        var1 = var1 + 1
    ElseIf Cells(i, 1) - Cells(i - 1, 1) < 0 Then
        var2 = var2 + 1
    End If
    Next i
    msgbox "Nombre de passage de 0 à 1 : " & var1 & chr(13) & "Nombre de passage de 1 à 0 : " & var2
    End Sub
    Quelque info pour l'adapter :
    Pour modifier la colonne change le A de Range("A65536") et dans cells(i,1) remplace le 1 par ton numéro de colonne (colonne E donne 5)
    Pour modifier le num de ligne du début et de la fin des donné for i = lignedébut+1 to lignefin
    Range("A65536").End(xlUp).Row renvoie la dernière ligne remplie de la colonne A

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut
    hmmm...

    est ce qu'il faut que les valeurs contenues dans les cellules soient d'un certaine type (formule, valeur...) ?

    parce que la j'ai une formule dans chaque cellule, et j'obtiens l'erreur suivante :

    Erreur d'exécution '13':

    Incompatibilité de type

  4. #4
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    j'ai essayé la version précédente avec des formule et c'est bon.
    Par contre tu es sure de bien commencer ta liste de 0 et de 1 dès la première ligne et ce jusqu'à la dernière? sinon reporte toi a mon premier post.

    Au hasard je dirais que ce code devrait marcher (il ne test pas la première ligne qui contient souvent les titred de colonne)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
    Dim var1 As Long, var2 As Long
    Dim i As Long
    For i = 3 To Range("A65536").End(xlUp).Row
    If Cells(i, 1) - Cells(i - 1, 1) > 0 Then
        var1 = var1 + 1
    ElseIf Cells(i, 1) - Cells(i - 1, 1) < 0 Then
        var2 = var2 + 1
    End If
    Next i
    msgbox "Nombre de passage de 0 à 1 : " & var1 & chr(13) & "Nombre de passage de 1 à 0 : " & var2
    End Sub
    Au moment ou ca plante regarde la valeur de i soit en mùettant le curseur dessus soit en affichant les variable local ou encore avec un espion tu as le choix

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut
    oups c'était de ma faute, il ya avait un souci non pas avec la premiere mais avec la dernirèe ligne (qui contenait du texte).

    maintenant tout est OK.

    merci beaucoup!!!

  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
    Bonjour,

    0 et 1 étant des valeurs de bits, on peut faire ainsi (et on soulage le processeur) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim titi As Long, var1 As Long, var2 As Long
    For i = premiereligne + 1 To Range("A65536").End(xlUp).Row
       titi = cells(i) Xor cells(i-1) ' on ne lit qu'une fois et on évite les conditions
       var1 = var1 + titi
      var2 = var2 + Abs(titi - 1)
    Next i

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut
    ok, mais en fait j'ai quelques valeurs qui sont des valeurs décimales comprises entre 0 et 1...

    je testerai cette solution pour voir ce que ca donne...

  8. #8
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Mon code test si la valeur est plus grande ou plus petite que la précédente, celui de ucfoutu ne devrais fonctionner que sur les 0 et les 1.

    0
    0.5
    1
    avec mon programme cela augmentera var1 de 2 celui de ucfoutu devrais planté

    Pose une question précise et tu auras une réponse précise
    Tu veux faire quoi de tes décimal?

    Edit j'ai testé visiblemenr celui de ucfoutu prend les décimal comme des 0

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut
    oui nan mais t'inquiètes ton code me convenait, j'ai juste déouvert après que mes valeurs n'étaient pas que des 0 ou 1.

    mais en fait, dans le cas où j'ai un 0 suivi de 0.5, je ne veux incrémenter var1 QUE si ce 0.5 est suivi d'un 1. la j'avais fait une petite boucle un peu pourrie (mais qui a l'air de marcher), mais si la solution de ucfoutu prend les décimals comme des 0, ca devrait bien me convenir je crois.

    merci bien à vous deux pour vos réponses en tout cas!

  10. #10
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    je te laisse tester c'est l'impression que j'ai eu mais ca reste a véifier et ce n'est pas très propre, enfin a toi de voir
    Pense au bouton

  11. #11
    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
    Re...

    Je ne sais plus où nous en sommes, si la "donne" change à chaque instant !

    Alors, maintenant, les nombres peuvent être différents de 0 et 1 et même être décimaux ?

    D'accord, alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = premiereligne + 1 To Range("A65536").End(xlUp).Row
      var1 = var1 + Abs(cells(i) - cells(i - 1) <> 0)
      var2 = var2 + Abs(cells(i) - cells(i - 1) = 0)
    Next
    MsgBox var1 & "  " & var2
    Edit :

    ce qui revient d'ailleurs à écrire (et cette dernière formulation serait capable de traiter même des chaînes de caractères):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim var1 As Long, var2 As Long
    For i = premiereligne + 1 To Range("A65536").End(xlUp).Row
      var1 = var1 + Abs(cells(i) <> cells(i - 1))
      var2 = var2 + Abs(cells(i) = cells(i - 1))
    Next
    MsgBox var1 & "  " & var2

Discussions similaires

  1. [Toutes versions] Alterner les couleurs sur changement de valeur dans une colonne
    Par Invité dans le forum Contribuez
    Réponses: 0
    Dernier message: 30/01/2015, 09h20
  2. Réponses: 13
    Dernier message: 21/02/2011, 20h33
  3. Réponses: 5
    Dernier message: 12/07/2010, 14h45
  4. Réponses: 6
    Dernier message: 04/11/2008, 22h35
  5. intervertir les valeurs dans une colonne d'une table
    Par hammou dans le forum Débuter
    Réponses: 2
    Dernier message: 26/01/2004, 10h15

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