Pb de la fonction CountIfs

BONJOUR

Pouvez vous m'aider svp

je n'arrive pas a calculer le nombre de ligne il me donne toujours comme résultats 0

voici mon code et le fichier sur lequel je teste si mon code est bon ou pas

Public Sub Sinistre_Decl()

Dim Nombre_Sinistre_Declare As Integer
Dim Date_Souscription_Adhésion As Range
Dim Numéro_Police As Range
Dim Date_Survenance As Range

Dim Somme As Long

Dim nblignes As Integer
Dim i As Integer
Dim j As Integer

Worksheets("Feuil1").Activate

DernLigne1 = Sheets("Feuil1").Range("G" & Rows.Count).End(xlUp).Row 'définit la dernière ligne colonne A
DernLigne2 = Sheets("Feuil1").Range("R" & Rows.Count).End(xlUp).Row 'définit la dernière ligne colonne B

Set Date_Souscription_Adhésion = Sheets("Feuil1").Range("G2:G" & DernLigne1) 'définit la colonne A
Set Date_Survenance = Sheets("Feuil1").Range("R2:R" & DernLigne2) 'définit la colonne B

nblignes = Application.WorksheetFunction.CountIfs(Range("G2:G37"), ">=" & DateSerial(1, 4, 2016), Range("G2:G37"), "<=" & DateSerial(30, 4, 2016), Range("U2:U37"), ">=" & DateSerial(1, 9, 2016), Range("U2:U37"), "<=" & DateSerial(30, 9, 2016))
MsgBox "nombre de ligne " & nblignes

End Sub
27exple.xlsm (19.25 Ko)

bonjour

pourquoi ? du VBA et non une simple formule qui compte les lignes (lignes non vides, nombre d'écarts de dates > X jours, autres critères...)

je dois le faire en vba jai pas le choix

Bonsoir,

1) Code non indenté (si je notais !! )

2) Des lignes sautées : une indentation systématique selon des règles rigoureuses, sans sauter de lignes, est nécessaire et suffisant pour permettre une lecture rapide (la plus rapide) et efficace du code. Je pense que l'apprentissage devrait commencer par là, on perdrait beaucoup moins de temps par la suite.

[3) Ça c'est perso... Noms de variables plutôt longs... moi qui commence à trouver un peu trop long au-delà de 3 caractères mais on peut aimer passer du temps à écrire les noms de variables...]

4) Recherche des dernières lignes sur 2 colonnes, dans la même base ! ??? Si base "à trou", elle doit toujours comporter une colonne qui en est dépourvue (si bien conçue, c'est la première), et c'est sur cette colonne qu'on teste pour avoir la dimension. A noter que ces variables ne sont pas déclarées.

(Il pourrait être aussi utile de nommer la base en dynamique, ou (selon mes préférences) la première colonne, et on n'a plus jamais besoin de tester les dimensions.)

5) Affectation des plages (colonnes dimensionnées) à des variables : pour en venir là, on pouvait faire l'économie des variables précédentes, qui s'avèrent à usage unique !

6) Pour toutes ces opérations d'affectations, on se trouve sur la même feuille, qu'on répète à chaque ligne ! Un bloc With aurait économisé de l'écriture, déjà, mais surtout permet une exécution plus rapide...

7) Après s'être donné du mal à initialiser des variables plages, il apparaît qu'on les oublie dans le reste de la procédure ! Elles ne sont pas utilisées !

8 ) On doit rappeler que espace suivi de underscore permet de passer à la ligne (physique) suivante sans interrompre la ligne de code. C'est utile, pour la lecture, aussi...

9) Range("G2:G37") : expression non qualifiée, ce n'est pa la seule, elles sont toutes dans le même cas sur cette ligne... On doit recommander de toujours qualifier ses expressions, n'en déplaise à ceux qui s'en abstiennent volontiers, et dont le code reste approximatif et dépendant du contexte, mais au cas particulier on disposait en plus de variables initialisées... !!

10) DateSerial(1, 4, 2016) : !!!! Direction Aide pour la syntaxe de la fonction ! Fonction tout de même très courante pourtant.

Avec cette définition des dates, je doute que la fonction puisse renvoyer quelque chose...

11) Il faut noter aussi que sur 8 variables déclarées, 3 seulement ont été utilisées (dont 2 pour rien !) ! 5 ne le sont pas ! Pas très cohérent. (Et 2 utilisées mais non déclarées.)

Il n'y a pourtant pas beaucoup de code. J'ai failli risquer d'en oublier !!!!

12) Worksheets("Feuil1").Activate : horreur totale ! Dans tout code qui se respecte, jamais de Select ou d'Activate intempestif et parasite (de même que tout élément approchant). On y préfère la qualification évoquée (doter toute expression de qualificateur d'objet).

Et quand la feuille active n'est pas celle sur laquelle on opère, cela n'en est que mieux ! On active alors, si l'utilisateur doit voir le résultat, à la fin de la procédure, seulement à la fin.

Si l'objectif est d'apprendre à programmer en VBA, je ne peux que te souhaiter de tirer profit de mes critiques...

Cordialement.

olalala jai pas tt compris

comment je pourrais faire du coup

Pour faire du VBA, il faut te mettre en mesure de comprendre les explications et en acquérir les bases...

Si je te signale tout ce qui ne va pas dans le code, à tout point de vue, je signale aussi quand il s'agit d'erreurs qui empêchent l'obtention du résultat !...

jai besoin de 2 colonnes une pour les base adhesion et une autre pour les date de survenance


javais les plages parcce que javais fais des boucles for pour parcourir les colonnes mais sa ne marcher pas du coup jai changer


pour DateSerial(1, 4, 2016) javais essayer de mettre DateSerial(201, 4, 1) mais sa ne marcher pas non plus


jarrive pas du tt a améliorer ce code si vous pouviez m'aider

jai besoin de 2 colonnes une pour les base adhesion et une autre pour les date de survenance

Y a qu'une base !

javais les plages parcce que javais fais des boucles for pour parcourir les colonnes mais sa ne marcher pas du coup jai changer

On ne conserve pas les déchets, ça se nettoie tout de suite... !

pour DateSerial(1, 4, 2016) javais essayer de mettre DateSerial(201, 4, 1) mais sa ne marcher pas non plus

L'an 201 est bien pris en compte par VBA, mais Excel n'aimera pas !!

2016 loll

Essaie :

Sub Sinistre_Decl()
    Dim Date_Souscription_Adhésion As Range, Date_Survenance As Range
    Dim DernLigne As Long, nblignes As Long
    With Worksheets("Feuil1")
        DernLigne = .Range("A" & .Rows.Count).End(xlUp).Row
        Set Date_Souscription_Adhésion = .Range("G2:G" & DernLigne)
        Set Date_Survenance = .Range("R2:R" & DernLigne)
    End With
    nblignes = WorksheetFunction.CountIfs(Date_Souscription_Adhésion, ">=4/1/2016", _
     Date_Souscription_Adhésion, "<=4/30/2016", Date_Survenance, ">=9/1/2016", _
     Date_Survenance, "<=9/30/2016")
    MsgBox "nombre de lignes : " & nblignes
End Sub

sa marche pas non plus il me sort nombre de ligne =0

Mets ton fichier alors, qu'on voie de plus près !

Tu es sûre qu'il y a des lignes qui correspondent aux critères ?

Essai sur ton fichier fourni initialement (ton premier post), réaménagé pour pouvoir tester, ça fonctionne... !

Renvoie 2 et il y a bien 2 lignes qui correspondent aux critères.

sa devrait me sortir

'exple dsa= fev 2015 et ds = fev 2015 ==> =2

' ds=mars 2015 ==> =3

' ds=avril 2015 ==> =11

'exple dsa= aout 2015

' ds=sept 2015 ==> =3

'exple dsa= setp 2015

' ds=sept 2015 ==> 1

'exple avril 2016

' ds=janvier 2016==>3

' ds=fev 2016 ==>1

' ds=mai 2016 ==>3

' ds=sept 2016 ==>2

' ds=oct 2016 ==>1

' ds=nov 2016 ==>1

'exple juin 2016

' ds=dec 2015 ==>1

'exple mars 2019

'ds=fev 2017 ==>2

'ds=mars 2017 ==>2



sa marcheeeee javais pas mis qqchose dans la premiere colonne

mais pq qd je change la condition sa me met encore 0

Sub Sinistre_Decl()
    Dim Date_Souscription_Adhésion As Range, Date_Survenance As Range
    Dim DernLigne As Long, nblignes As Long
    With Worksheets("Feuil1")
        DernLigne = .Range("A" & .Rows.Count).End(xlUp).Row
        Set Date_Souscription_Adhésion = .Range("G2:G" & DernLigne)
        Set Date_Survenance = .Range("R2:R" & DernLigne)
    End With
    nblignes = WorksheetFunction.CountIfs(Date_Souscription_Adhésion, ">=2/1/2015", _
     Date_Souscription_Adhésion, "<=2/30/2015", Date_Survenance, ">=4/1/2015", _
     Date_Survenance, "<=4/30/2015")
    MsgBox "nombre de lignes : " & nblignes
End Sub
20exple.xlsm (23.32 Ko)

des que je change l'année sa ne marche plus

Une date c'est jour/mois/année !

Autre proposition (pour changer de registre... )

Sub StatSinistres()
    Dim Tss(), asa, zsa, ass, zss, n%, i%, sa%, ss%
    asa = Array(Year(Date), 12): ass = Array(Year(Date), 12)
    zsa = Array(0, 1): zss = Array(0, 1)
    With Worksheets("Feuil1")
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        asa = WorksheetFunction.Min(.Range("G2:G" & n))
        If asa > 0 Then
            asa = Array(Year(asa), Month(asa))
        Else
            MsgBox "Date manquante en colonne G !", vbCritical, "Erreur"
            Exit Sub
        End If
        ass = WorksheetFunction.Min(.Range("R2:R" & n))
        If ass > 0 Then
            ass = Array(Year(ass), Month(ass))
        Else
            MsgBox "Date manquante en colonne R !", vbCritical, "Erreur"
            Exit Sub
        End If
        zsa = WorksheetFunction.Max(.Range("G2:G" & n))
        zsa = Array(Year(zsa), Month(zsa))
        zss = WorksheetFunction.Max(.Range("R2:R" & n))
        zss = Array(Year(zss), Month(zss))
        ReDim Tss(asa(1) To (zsa(0) - asa(0)) * 12 + zsa(1), ass(1) To (zss(0) - ass(0)) * 12 + zss(1))
        For i = 2 To n
            sa = (Year(.Cells(i, 7)) - asa(0)) * 12 + Month(.Cells(i, 7))
            ss = (Year(.Cells(i, 18)) - ass(0)) * 12 + Month(.Cells(i, 18))
            Tss(sa, ss) = Tss(sa, ss) + 1
        Next i
    End With
    sa = UBound(Tss, 1) - LBound(Tss, 1) + 1
    ss = UBound(Tss, 2) - LBound(Tss, 2) + 1
    With Worksheets("Feuil2")
        zsa = .Range("A1")
        With .Range("B2").CurrentRegion
            .ClearContents
            .Borders.LineStyle = xlLineStyleNone
        End With
        .Range("B2").Resize(sa, ss).Value = Tss
        With .Range("A2").Resize(sa)
            For i = 1 To sa
                .Cells(i, 1) = MonthName((asa(1) + i - 2) Mod 12 + 1) & " " _
                 & (asa(1) + i - 2) \ 12 + asa(0)
            Next i
        End With
        With .Range("B1").Resize(, ss)
            For i = 1 To ss
                .Cells(1, i) = MonthName((ass(1) + i - 2) Mod 12 + 1) & " " _
                 & (ass(1) + i - 2) \ 12 + ass(0)
            Next i
        End With
        With .Range("A1")
            .Value = zsa
            With .Borders(xlDiagonalDown)
                .LineStyle = xlContinuous: Weight = xlThin
            End With
        End With
        With .Range("A1").Resize(sa + 1, ss + 1).Borders
            .LineStyle = xlContinuous: Weight = xlThin
        End With
        .Activate
    End With
End Sub

Ce que fait cette procédure : elle regarde d'abord les dates minimales et maximales de souscriptions d'une part et de sinistres d'autre part, puis établit un tableau cadré sur ces dates, où pour chaque mois de souscription elle recense les sinistres par mois de sinistre...

[NB- Je doute un peu de la validité de souscriptions en 2019 avec des sinistres en 2017 , mais c'est autre chose !]

Le tableau résultant est affecté en Feuil2.

NB- La procédure efface l'ancien tableau et les bordures pour remplacer par le nouveau. Le reste de la mise en forme n'étant pas appelé à varier à chaque fois, a été prédéfini...

Cordialement.

19aude21-exple.xlsm (45.59 Ko)

bonjour

merciii bcppp je suis en train de regarder cela de plus pres

Rechercher des sujets similaires à "fonction countifs"