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
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...
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 !
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 !
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
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 !!
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 Subsa 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
des que je change l'année sa ne marche plus
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 SubCe 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
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.
bonjour
merciii bcppp je suis en train de regarder cela de plus pres