VBA Ligne "oubliée " après comparaison

Résolu
Bonjour,

Je veux compter le nombre d'opérations, par mois selon le type d'OP.

Malheureusement, quand je change de mois, la 1ère ligne n'est pas comptabilisée car elle n'est pas égale à celle d'avant.
Exemple : le 01/09/2013 ne sera pas comptée car différente de la ligne d'au dessus du 31/08/2013.

Ci-joint mon code qui fonctionne mais qui "oublie" chaque 1ere ligne de mois:
Sub extractBOT()

Sheets("Feuil1").Activate
Dim Mois As Byte
Dim m As Double
Dim n As Double
Dim o As Double
Dim p As Double
Dim j As Double
j = 2

m = 0
n = 0
o = 0
p = 0
r = 0




nbcolonne1 = Sheets("Feuil1").UsedRange.Columns.Count 'compte le nombre de colonnes non vides sur la feuille 1
nbligne1 = Sheets("Feuil1").UsedRange.Rows.Count 'compte le nombre de lignes non vides sur la feuille 1

For i = 2 To nbligne1

Mois = Month(CDate(Cells(i, 20)))
Cells(i, 23).Value = Mois

Annee = Year(CDate(Cells(i, 20)))
Cells(i, 24).Value = Annee
Next

For i = 2 To nbligne1

    If Cells(i, 23).Value = Cells(i - 1, 23) And Cells(i, 24).Value = Cells(i - 1, 24) Then
    
        If Cells(i, 5).Value = "COMMISSION" Then
                n = n + 1
                r = r + 1
                
        'ElseIf Cells(i, 5).Value = "COMMISSION" And Cells(i, 2).Value = "RECEIPT" Then
               'm = m + 1
               'r = r + 1
           
        ElseIf Cells(i, 5).Value = "PRINCIPAL" And Cells(i, 2).Value = "PAYMENT" Then
            
                o = o + 1
                r = r + 1
        ElseIf Cells(i, 5).Value = "PRINCIPAL" And Cells(i, 2).Value = "RECEIPT" Then
                p = p + 1
                r = r + 1
            
        End If
        
    Else
            Sheets("Feuil2").Cells(j, 1).Value = n
            Sheets("Feuil2").Cells(j, 2).Value = m
            Sheets("Feuil2").Cells(j, 3).Value = o
            Sheets("Feuil2").Cells(j, 4).Value = p
            Sheets("Feuil2").Cells(j, 5).Value = r
            j = j + 1
            m = 0
            n = 0
            o = 0
            p = 0
    End If
    
Next

Sheets("Feuil2").Activate
End Sub




Quequ'un aurait il une idée svp ?

57 réponses

Résumé de la discussion

Le souci porte sur le comptage du nombre d'opérations par mois selon le type d'OP, car la première ligne d'un nouveau mois n'est pas comptabilisée lorsque le mois change. Des solutions suggèrent d'utiliser des variables mois et année et de réinitialiser les compteurs dès que ces valeurs changent, puis d'incrémenter les totaux pour chaque ligne et de les enregistrer. En pratique, il faut éviter de comparer i et i-1 pour le mois/année et, à partir de Cells(i,20), mettre à jour mois et année, récupérer j, m, n, o, p et les réinitialiser quand nécessaire.

Bobot (l’IA à votre service)
  1. On a dit que tu supprimais complètement les années, puisqu'elles sont inutiles. Donc il faut tout enlever de ce qui les concerne. (En regardant ton code, je vois que tu n'en as enlevé aucune en fait)
    1
    1. Salut
      J'avoue que voir du script comme ca sans visuel du tableur, c'est un peu compliqué.
      Alors de ce que j'ai compris, tu pourrais
      1- récupérer la date de Cell(i,23) et de Cell(i,24)
      2- Comparer à la date de Cell(i-1,23), respct. Cell(i-1,24) OU comparer à la date du jour précédent (que tu auras calculé à partir de la date récupérée en 1).

      Hermios
      0
      1. Salut Hermios.

        Merci pour ta réponse.

        En fait c'est déja ce que je fais. Je récupère dans me cellule (i,20) le mois et l'année que je copie en cellules (i,23 ) et (i,24). Ensuite, je compare ces cellules entre i et i-1 pour pouvoir compter le nombre d'opération par mois ( même i ).

        Le souci, c'est qu'en changeant de mois ( par exemple en passant de la date 31/08/2013 à 01/09/2013 ) , du coup la valeur de (i,23) et (i-1,23) n'est forcément plus égale donc je saute celle ligne. Mais elle m'intéresse quand même, je veux compter cette ligne aussi car elle fait partie du mois suivant !

        Est-ce plus clair pour toi et vois tu une solution ? :)
        0
        1. Idée un petit idiote, mais... tu pourrais pas simplement incrémenter artificiellement de 1? Puisque ton programme va systématiquement ignorer la première ligne...
          Dsl si ca marche pas. dans ce cas, je te conseille vivement d'attacher un screenshot de ta feuille (voir ta feuille elle même), avec des valeurs fakes, peu importe. Mais ca sera plus simple pour se représenter le tout!
          0
          1. Si j'incrémente de 1, cela va quand même sauter mes 1 ères ligne de chaque mois, alors que j'en ai besoin.

            https://www.cjoint.com/?3GeoB1YhysD

            Ci-joint un exemple avec les 3 colonnes intéressantes.
            0
            1. Arf, je comprend mieux.
              Bon, je te conseille de changer ton système :
              1- tu crées une variable month
              2- tu crées une variable year
              3- Loop sur tes lignes
              if month et year sont nulles, ou différentes de la valeur dans Cell(i,23) et Cell(i,24),
              year et month prennent les valeurs de cette cellule,
              If year et month ne sont pas nulles,
              tu récupères les valeurs j,m,n, o et p,
              tu réinitialises ceux-ci
              End If
              End If
              Tu fais tes incrémentations de j,r,m,n, o et p sur cette cellule

              end loop
              Tu récupères les valeurs j,m,n, o et p
              Ca devrait marcher, je pense
              0
              1. Ok je vais bidouiller et essayer de suivre tes instructions.

                Peux tu juste m'éclairer sur le :
                " 3- Loop sur tes lignes " qui ne m'est pas très familier stp .

                Je te remercie :)
                0
                1. C'est tout simplement ton :
                  For i = 2 To nbligne1 :D
                  0
                  1. En relisant ta réponse j'ai un petit doute sur quelque chose.
                    J'ai une contrainte car je dois compter le nombre d'opérations différentes PAR MOIS. Exemple, en juillet, il s'est passé 2 opération de type PAYMENT et 1 opération de type CREDIT. D'ou ma contrainte de comparer MOIS et ANNEE.

                    Pourrais-tu un peu expliciter ton idée sur les conditions suivantes :
                    "if month et year sont nulles, ou différentes de la valeur dans Cell(i,23) et Cell(i,24),
                    year et month prennent les valeurs de cette cellule,
                    If year et month ne sont pas nulles, "

                    Merci pour ton aide.
                    0
                    1. Re
                      month et year sont des variables que tu as déclarées au préalable, mais pas définies. Donc, la premiére fois que tu veux comparer ta ligne à ces dates, elles seront nulles, et tu risques de recevoir une erreur. D'où l'idée de d'abord vérifier si elles sont nulles (dans ce cas, cela signifie que tu commences ton loop), puis sinon, de vérifier qu'elles sont différentes des valeurs de ta cellule(Dans ce cas, ca signifie que ta ligne actuelle correspond à un nouveau mois.)
                      Dans ces deux cas, tu vas (re)initialiser month et year par rapport au mois actuel.
                      Mais tu dois conserver les opérations comptabilisées auparavant.
                      Quand je parle de comparer, il s'agit bien sur de compater Cell(i,23) avec Month, d'une part,. et Cell(i,24) avec year d'autre part.

                      J'espère que c'est plus clair.

                      @+ Hermios
                      0
                      1. Si tu veux, j'ai crée mes variables Année et Mois pour écrire le mois et l'année dans les cellules 23 et 24 pour simplier la comparaison. J'ai seulement à lire le contenu de ces cellules pour ensuite comparer.

                        Je viens de produire le code suivant, qui me semble coller à tes conseils :
                        
                        Sub extractBOT()
                        
                        Sheets("Feuil1").Activate
                        Dim Mois As Byte
                        Dim Annee As Byte
                        Dim m As Double
                        Dim n As Double
                        Dim o As Double
                        Dim p As Double
                        Dim j As Double
                        
                        Dim VarMois As Double
                        Dim VarAnnee As Double
                        j = 2
                        
                        m = 0
                        n = 0
                        o = 0
                        p = 0
                        r = 0
                        
                        VarMois = 0
                        VarAnnee = 0
                        
                        nbcolonne1 = Sheets("Feuil1").UsedRange.Columns.Count 'compte le nombre de colonnes non vides sur la feuille 1
                        nbligne1 = Sheets("Feuil1").UsedRange.Rows.Count 'compte le nombre de lignes non vides sur la feuille 1
                        
                        For i = 2 To nbligne1
                        
                        Mois = Month(CDate(Cells(i, 20)))
                        Cells(i, 23).Value = Mois
                        
                        Annee = Year(CDate(Cells(i, 20)))
                        Cells(i, 24).Value = Annee
                        Next
                        
                        For i = 2 To nbligne1
                            If (VarMois = 0 And VarAnnee = 0) Or (VarMois <> Cells(i, 23).Value And VarAnnee <> Cells(i, 24).Value) Then
                                If VarMois <> 0 And VarAnnee <> 0 Then
                        
                                    If Cells(i, 23).Value = Cells(i - 1, 23) And Cells(i, 24).Value = Cells(i - 1, 24) Then
                            
                                        If Cells(i, 5).Value = "COMMISSION" Then
                                        n = n + 1
                                        r = r + 1
                                        
                                        'ElseIf Cells(i, 5).Value = "COMMISSION" And Cells(i, 2).Value = "RECEIPT" Then
                                        'm = m + 1
                                        'r = r + 1
                                    
                                        ElseIf Cells(i, 5).Value = "PRINCIPAL" And Cells(i, 2).Value = "PAYMENT" Then
                                    
                                        o = o + 1
                                        r = r + 1
                                        ElseIf Cells(i, 5).Value = "PRINCIPAL" And Cells(i, 2).Value = "RECEIPT" Then
                                        p = p + 1
                                        r = r + 1
                                    
                                        End If
                            
                            
                                    Else
                                        Sheets("Feuil2").Cells(j, 1).Value = n
                                        Sheets("Feuil2").Cells(j, 2).Value = m
                                        Sheets("Feuil2").Cells(j, 3).Value = o
                                        Sheets("Feuil2").Cells(j, 4).Value = p
                                        Sheets("Feuil2").Cells(j, 5).Value = r
                                        j = j + 1
                                        m = 0
                                        n = 0
                                        o = 0
                                        p = 0
                                    End If
                                End If
                            End If
                            
                        Next
                        
                        Sheets("Feuil2").Activate
                        End Sub
                        
                        
                        
                        


                        J'ai une erreur sur la ligne : Annee = Year(CDate(Cells(i, 20)))
                        qui fontionnait et qui n'a pas subi de modification.
                        0
                        1. Plutôt étrange que tu aies une erreur, puisque ca n'a pas été changé.
                          ca dit quoi comme erreur?
                          0
                          1. erreur d'exécution '6' : Dépassement de capacité.

                            J'ai peut être une erreur dans une de mes boucles ?
                            0
                            1. Je sais pas pour cette erreur, mais effectivement, tu n'as pas reproduit ce que je t'ai décrit: Tu continues à comparer la valeur de la cellule i avec celle de la cellule i-1, là où tu devrais uniqueemnet comparer avec month et year. (En gros, supprime cette ligne).
                              De plus, Entre le
                              "If (VarMois = 0 And VarAnnee = 0) Or (VarMois <> Cells(i, 23).Value And VarAnnee <> Cells(i, 24).Value) Then"
                              et le
                              "If VarMois <> 0 And VarAnnee <> 0 Then,"
                              tu dois rénitialiser tes valeurs (Dans ces deux cas, tu dois réinitialiser ces valeurs, mais si la deuxième condition est vraie, tu dois en plus recupérer les valeurs j,n,m,o,p...

                              Bon, déjà ca, pour le reste, on pourra voir plus tard.
                              0
                              1. Bon j'ai tenté une nouvelle fois de suivre tes conseils. J'ai toujours la même erreur. Mais je ne comprends pas pourquoi on mets les valeurs à 0 au début alors qu'elles sont remises à 0 en fin de boucle.

                                
                                Sub extractBOT()
                                
                                Sheets("Feuil1").Activate
                                Dim Mois As Byte
                                Dim Annee As Byte
                                Dim m As Double
                                Dim n As Double
                                Dim o As Double
                                Dim p As Double
                                Dim j As Double
                                
                                Dim VarMois As Double
                                Dim VarAnnee As Double
                                j = 2
                                
                                m = 0
                                n = 0
                                o = 0
                                p = 0
                                r = 0
                                
                                VarMois = 0
                                VarAnnee = 0
                                
                                nbcolonne1 = Sheets("Feuil1").UsedRange.Columns.Count 'compte le nombre de colonnes non vides sur la feuille 1
                                nbligne1 = Sheets("Feuil1").UsedRange.Rows.Count 'compte le nombre de lignes non vides sur la feuille 1
                                
                                For i = 2 To nbligne1
                                
                                Mois = Month(CDate(Cells(i, 20)))
                                Cells(i, 23).Value = Mois
                                
                                Annee = Year(CDate(Cells(i, 20)))
                                Cells(i, 24).Value = Annee
                                Next
                                
                                For i = 2 To nbligne1
                                    If (VarMois = 0 And VarAnnee = 0) Or (VarMois <> Cells(i, 23).Value And VarAnnee <> Cells(i, 24).Value) Then
                                        m = 0
                                        n = 0
                                        o = 0
                                        p = 0
                                            
                                            
                                            
                                            
                                            If VarMois <> 0 And VarAnnee <> 0 Then
                                
                                                m = 0
                                                n = 0
                                                o = 0
                                                p = 0
                                    
                                                If Cells(i, 5).Value = "COMMISSION" Then
                                                n = n + 1
                                                r = r + 1
                                                
                                                'ElseIf Cells(i, 5).Value = "COMMISSION" And Cells(i, 2).Value = "RECEIPT" Then
                                                'm = m + 1
                                                'r = r + 1
                                            
                                                ElseIf Cells(i, 5).Value = "PRINCIPAL" And Cells(i, 2).Value = "PAYMENT" Then
                                                o = o + 1
                                                r = r + 1
                                                
                                                ElseIf Cells(i, 5).Value = "PRINCIPAL" And Cells(i, 2).Value = "RECEIPT" Then
                                                p = p + 1
                                                r = r + 1
                                            
                                                End If
                                    
                                    
                                            Else
                                                Sheets("Feuil2").Cells(j, 1).Value = n
                                                Sheets("Feuil2").Cells(j, 2).Value = m
                                                Sheets("Feuil2").Cells(j, 3).Value = o
                                                Sheets("Feuil2").Cells(j, 4).Value = p
                                                Sheets("Feuil2").Cells(j, 5).Value = r
                                                j = j + 1
                                                m = 0
                                                n = 0
                                                o = 0
                                                p = 0
                                            
                                            End If
                                    End If
                                    
                                Next
                                
                                Sheets("Feuil2").Activate
                                End Sub
                                
                                
                                
                                
                                
                                0
                                1. Re,
                                  Hum, tu t'es trompé, mais en fait moi aussi!
                                  Pour ton loop :
                                  If date de la cellule actuelle<>date enregistrée (mois et année)) mais que date enregistrée<>0
                                  Je récupère les données
                                  if date de cellule actuelle<>date enregistrée
                                  date enregistrée=date de cellule actuelle
                                  j,m,n etc. remis à 0
                                  Fin if
                                  Fin if
                                  incrémentation de j,m,n...
                                  Fin loop

                                  je récupères les données
                                  0
                                  1. On va y arriver !

                                    Une tentative de plus, j'espère ne pas m'être mélangé entre les "récupérations de données" car la je t'avoue que je commence un peu à m'embrouiller :x

                                    Sub extractBOT()
                                    
                                    Sheets("Feuil1").Activate
                                    Dim Mois As Byte
                                    Dim Annee As Byte
                                    Dim m As Double
                                    Dim n As Double
                                    Dim o As Double
                                    Dim p As Double
                                    Dim j As Double
                                    
                                    Dim VarMois As Double
                                    Dim VarAnnee As Double
                                    j = 2
                                    
                                    m = 0
                                    n = 0
                                    o = 0
                                    p = 0
                                    r = 0
                                    
                                    VarMois = 0
                                    VarAnnee = 0
                                    
                                    nbcolonne1 = Sheets("Feuil1").UsedRange.Columns.Count 'compte le nombre de colonnes non vides sur la feuille 1
                                    nbligne1 = Sheets("Feuil1").UsedRange.Rows.Count 'compte le nombre de lignes non vides sur la feuille 1
                                    
                                    For i = 2 To nbligne1
                                    
                                    Mois = Month(CDate(Cells(i, 20)))
                                    Cells(i, 23).Value = Mois
                                    
                                    Annee = Year(CDate(Cells(i, 20)))
                                    Cells(i, 24).Value = Annee
                                    Next
                                    
                                    For i = 2 To nbligne1
                                        If VarMois <> 0 And VarAnnee <> 0 And VarMois <> Cells(i, 23).Value And VarAnnee <> Cells(i, 24).Value Then
                                                    Sheets("Feuil2").Cells(j, 1).Value = n
                                                    Sheets("Feuil2").Cells(j, 2).Value = m
                                                    Sheets("Feuil2").Cells(j, 3).Value = o
                                                    Sheets("Feuil2").Cells(j, 4).Value = p
                                                    Sheets("Feuil2").Cells(j, 5).Value = r
                                                
                                                If VarMois <> Cells(i, 23).Value And VarAnnee <> Cells(i, 24).Value Then
                                    
                                        
                                                    If Cells(i, 5).Value = "COMMISSION" Then
                                                    n = n + 1
                                                    r = r + 1
                                                    
                                                    'ElseIf Cells(i, 5).Value = "COMMISSION" And Cells(i, 2).Value = "RECEIPT" Then
                                                    'm = m + 1
                                                    'r = r + 1
                                                
                                                    ElseIf Cells(i, 5).Value = "PRINCIPAL" And Cells(i, 2).Value = "PAYMENT" Then
                                                    o = o + 1
                                                    r = r + 1
                                                    
                                                    ElseIf Cells(i, 5).Value = "PRINCIPAL" And Cells(i, 2).Value = "RECEIPT" Then
                                                    p = p + 1
                                                    r = r + 1
                                                
                                                    End If
                                        
                                        
                                                Else
                                                    
                                                    j = j + 1
                                                    m = 0
                                                    n = 0
                                                    o = 0
                                                    p = 0
                                                
                                                End If
                                        End If
                                        
                                    Next
                                    
                                    Sheets("Feuil2").Activate
                                    End Sub
                                    
                                    
                                    
                                    


                                    PS : j'ai toujours la même erreur
                                    0
                                    1. Presque, mais non
                                      Init des données :
                                      m = 0
                                      n = 0
                                      o = 0
                                      p = 0
                                      Ca doit se placer après la condition
                                      If VarMois <> Cells(i, 23).Value And VarAnnee <> Cells(i, 24).Value Then
                                      et après l'init des données, tu dois terminer ta condition->End If

                                      Pour l'erreur, je suis perplexe, mais faudra que tu testes par toi même.
                                      0
                                      1. Une dernière tentative pour ce soir, sinon je continuerais demain. En espérant que cette fois-ci la procédure soit cohérente.

                                        Je testerai pour essayer de comprendre l'erreur.

                                        En tout cas je te remercie pour ton aide et tes conseils.

                                        Bonne soirée.

                                        
                                        Sub extractBOT()
                                        
                                        Sheets("Feuil1").Activate
                                        Dim Mois As Byte
                                        Dim Annee As Byte
                                        Dim m As Double
                                        Dim n As Double
                                        Dim o As Double
                                        Dim p As Double
                                        Dim j As Double
                                        
                                        Dim VarMois As Double
                                        Dim VarAnnee As Double
                                        j = 2
                                        
                                        m = 0
                                        n = 0
                                        o = 0
                                        p = 0
                                        r = 0
                                        
                                        VarMois = 0
                                        VarAnnee = 0
                                        
                                        nbcolonne1 = Sheets("Feuil1").UsedRange.Columns.Count 'compte le nombre de colonnes non vides sur la feuille 1
                                        nbligne1 = Sheets("Feuil1").UsedRange.Rows.Count 'compte le nombre de lignes non vides sur la feuille 1
                                        
                                        For i = 2 To nbligne1
                                        
                                        Mois = Month(CDate(Cells(i, 20)))
                                        Cells(i, 23).Value = Mois
                                        
                                        Annee = Year(CDate(Cells(i, 20)))
                                        Cells(i, 24).Value = Annee
                                        Next
                                        
                                        For i = 2 To nbligne1
                                                            If VarMois <> 0 And VarAnnee <> 0 And VarMois <> Cells(i, 23).Value And VarAnnee <> Cells(i, 24).Value Then
                                                                 Sheets("Feuil2").Cells(j, 1).Value = n
                                                                 Sheets("Feuil2").Cells(j, 2).Value = m
                                                                 Sheets("Feuil2").Cells(j, 3).Value = o
                                                                 Sheets("Feuil2").Cells(j, 4).Value = p
                                                                 Sheets("Feuil2").Cells(j, 5).Value = r
                                                             End If
                                             
                                                    If VarMois <> Cells(i, 23).Value And VarAnnee <> Cells(i, 24).Value Then
                                                        m = 0
                                                        n = 0
                                                        o = 0
                                                        p = 0
                                                        r = 0
                                            
                                                        If Cells(i, 5).Value = "COMMISSION" Then
                                                        n = n + 1
                                                        r = r + 1
                                                        
                                                        'ElseIf Cells(i, 5).Value = "COMMISSION" And Cells(i, 2).Value = "RECEIPT" Then
                                                        'm = m + 1
                                                        'r = r + 1
                                                    
                                                        ElseIf Cells(i, 5).Value = "PRINCIPAL" And Cells(i, 2).Value = "PAYMENT" Then
                                                        o = o + 1
                                                        r = r + 1
                                                        
                                                        ElseIf Cells(i, 5).Value = "PRINCIPAL" And Cells(i, 2).Value = "RECEIPT" Then
                                                        p = p + 1
                                                        r = r + 1
                                                    
                                                        End If
                                            
                                            
                                                    Else
                                                        
                                                        j = j + 1
                                                        m = 0
                                                        n = 0
                                                        o = 0
                                                        p = 0
                                                    
                                                    End If
                                           
                                            
                                        Next
                                        
                                        Sheets("Feuil2").Activate
                                        End Sub
                                        
                                        
                                        
                                        
                                        
                                        0
                                        1. Après test et suppression de la ligne "Dim Annee As Byte" ( me demandez pas pourquoi ), le code fonctionne.

                                          Par contre j'ai toujours le même problème, la 1ère ligne du nouveau moins est oubliée :/

                                          Je suis perdu la.
                                          0
                                          • 1
                                          • 2
                                          • 3