Comment mettre en place un compteur en fonction de la date
Résolu
cooka
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
A voir également:
- Comment mettre en place un compteur en fonction de la date
- Compteur électrique - Guide
- Fonction si et - Guide
- Comment ralentir un compteur linky forum - Accueil - Objets connectés
- Compteur de contractions - Télécharger - Santé & Bien-être
- Comment ouvrir un fichier dat - Guide
11 réponses
Bonjour
Comme dit michel (salut à toi en passant) pas besoin de vba
https://www.cjoint.com/?3Kvo0FSkBvg
Cdlmt
Comme dit michel (salut à toi en passant) pas besoin de vba
https://www.cjoint.com/?3Kvo0FSkBvg
Cdlmt
re,
pour répondre à ta préoccupation
A1 doit rester vide de préférence
en D2
=INDEX(A:A;MIN(SI(NB.SI(D$1:D1;A$2:A$50)=0;LIGNE(A$2:A$50))))
mettre au format date
tirer vers le bas
Formule à valider par « ctrl+maj+entrée » (et non directement par « entrée »), le curseur clignotant dans la barre de formule
Décocher afficher 0 cellules vides (options excel -avancées)
Mais si tu as des milliers de dates, alors, oui, il vaut mieux passer par du vba , les formules matricielles et sommeprod étant très lentes(toujours préciser le nombre de lignes dans les demandes car l'nalyse du pb varie suivant le nombre de lignes)
Je regarde pour du vba mais je dois m'absenter
Merci de mettre un extrait de ton classeur (1000 lignes environ) car je n'ai pas trop envie de m'amuser à passer 1 heure à le reconstituer:
mettre le classeur sans données confidentielles en pièce jointe sur http://cijoint.fr/
et coller le lien proposé dans le message de réponse
pour ccm81:
mon idée:voir avec un dictionary avec un item comptant les vides
Michel
pour répondre à ta préoccupation
A1 doit rester vide de préférence
en D2
=INDEX(A:A;MIN(SI(NB.SI(D$1:D1;A$2:A$50)=0;LIGNE(A$2:A$50))))
mettre au format date
tirer vers le bas
Formule à valider par « ctrl+maj+entrée » (et non directement par « entrée »), le curseur clignotant dans la barre de formule
Décocher afficher 0 cellules vides (options excel -avancées)
Mais si tu as des milliers de dates, alors, oui, il vaut mieux passer par du vba , les formules matricielles et sommeprod étant très lentes(toujours préciser le nombre de lignes dans les demandes car l'nalyse du pb varie suivant le nombre de lignes)
Je regarde pour du vba mais je dois m'absenter
Merci de mettre un extrait de ton classeur (1000 lignes environ) car je n'ai pas trop envie de m'amuser à passer 1 heure à le reconstituer:
mettre le classeur sans données confidentielles en pièce jointe sur http://cijoint.fr/
et coller le lien proposé dans le message de réponse
pour ccm81:
mon idée:voir avec un dictionary avec un item comptant les vides
Michel
Bonjour
Proposition VBA
maquette de W
https://www.cjoint.com/?3Kwma35qESk
Proposition VBA
Option Explicit
'-------
Sub compter_lesvides()
Dim Derlig As Long, T_in, Idx As Long, Jour As Long
Dim D_date As Object
Dim test
'----initialisations
Application.ScreenUpdating = False
With Sheets("test")
Derlig = .Columns("C").Find("*", , , , , xlPrevious).Row
'stocke en RAM le tableau
T_in = .Range("C6:D" & Derlig)
Set D_date = CreateObject("scripting.dictionary")
'-----collecte et traitement
For Idx = 1 To UBound(T_in)
Jour = CLng(T_in(Idx, 1))
If Not D_date.Exists(Jour) Then
D_date.Add Jour, 0
If T_in(Idx, 2) = "" Then D_date.Item(Jour) = 1
Else
If T_in(Idx, 2) = "" Then D_date.Item(Jour) = D_date.Item(Jour) + 1
'test = D_date.Item(Jour)
End If
Next
'restitution
.Range("G7:H10000").Clear
With .Range("G7").Resize(D_date.Count, 1)
.Value = Application.Transpose(D_date.keys)
.NumberFormat = "dd/mm/yyyy"
End With
.Range("H7").Resize(D_date.Count, 1) = Application.Transpose(D_date.items)
.Range("G7:H" & D_date.Count + 7).Borders.Weight = xlThin
End With
End Sub
maquette de W
https://www.cjoint.com/?3Kwma35qESk
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci pour ta question,
j'ai passé quelques heures à essayer avec les formules comme NB.SI ou autre sans résultats, mais si tu as une solution à me communiquer, je te remercie d'avance.
j'ai passé quelques heures à essayer avec les formules comme NB.SI ou autre sans résultats, mais si tu as une solution à me communiquer, je te remercie d'avance.
merci beaucoup ccma81 pour ta réponse, cela va beaucoup m'aider dans un premier temps. Mais la solution atteint ses limites quand j'ai une base de donné qui se remplie tout les jours avec les données que j'ai cité dans ma problématique (colonne A et B). Car dans ta solution on renseigne les dates manuellement et cela devient vite lourd quand notre base de données comprte des milliers de date.
Merci beaucoup, déjà avec cette solution, mon problème a bien avancé.
Merci beaucoup, déjà avec cette solution, mon problème a bien avancé.
Je ne comprend pas très bien
1. Mais la solution atteint ses limites quand j'ai une base de donné qui se remplie tout les jours avec les données que j'ai cité dans ma problématique
Dans ce cas
Definir les plages de façon dynamique
date1=DECALER(Feuil1!$A$1;1;0;NB(Feuil1!$A:$A);1)
date2=DECALER(Feuil1!$A$1;1;1;NB(Feuil1!$A:$A);1)
puis la formule en F2
F2=SOMMEPROD((date1=D2)*(date2=""))
2. Car dans ta solution on renseigne les dates manuellement et cela devient vite lourd
est ce que tu parles de la colonne D?
1. Mais la solution atteint ses limites quand j'ai une base de donné qui se remplie tout les jours avec les données que j'ai cité dans ma problématique
Dans ce cas
Definir les plages de façon dynamique
date1=DECALER(Feuil1!$A$1;1;0;NB(Feuil1!$A:$A);1)
date2=DECALER(Feuil1!$A$1;1;1;NB(Feuil1!$A:$A);1)
puis la formule en F2
F2=SOMMEPROD((date1=D2)*(date2=""))
2. Car dans ta solution on renseigne les dates manuellement et cela devient vite lourd
est ce que tu parles de la colonne D?
merci beaucoup pour la réponse.
laisse moi quelques temps pour allégé le document et supprimer toutes les données sensible. Je le mettrai par la suite sur ton lien.
laisse moi quelques temps pour allégé le document et supprimer toutes les données sensible. Je le mettrai par la suite sur ton lien.
Bonjour à tous et bon weekend, comme convenu voici le fichier en question.
https://www.cjoint.com/?3Kwj7zk664Z
le but c'est de compter les cases vides par date.
un grand merci à tous.
https://www.cjoint.com/?3Kwj7zk664Z
le but c'est de compter les cases vides par date.
un grand merci à tous.
wow c'est exactement ce que je voulais, je vais l'adapter sur mon fichier d'origine et je me permettrai de revenir vers toi si jamais j'ai des difficulté.
encore un grand merci :)
encore un grand merci :)
j'ai modifier le code pour l'adapter à mon tableau mais malheureusement je n'ai aucun résultat, devant toutes les dates il y a marqué 0.
le code
Option Explicit
'-------
Sub compter_lesvides()
Dim Derlig As Long, T_in, Idx As Long, Jour As Long
Dim D_date As Object
Dim TempsdeTraverseGlobale
'----initialisations
Application.ScreenUpdating = False
With Sheets("TempsdeTraverseGlobale")
Derlig = .Columns("E").Find("*", , , , , xlPrevious).Row
'stocke en RAM le tableau
T_in = .Range("E6:K" & Derlig)
Set D_date = CreateObject("scripting.dictionary")
'-----collecte et traitement
For Idx = 1 To UBound(T_in)
Jour = CLng(T_in(Idx, 1))
If Not D_date.Exists(Jour) Then
D_date.Add Jour, 0
If T_in(Idx, 2) = "" Then D_date.Item(Jour) = 1
Else
If T_in(Idx, 2) = "" Then D_date.Item(Jour) = D_date.Item(Jour) + 1
'TempsdeTraverseGlobale = D_date.Item(Jour)
End If
Next
'restitution
.Range("K6:L10000").Clear
With .Range("K6").Resize(D_date.Count, 1)
.Value = Application.Transpose(D_date.keys)
.NumberFormat = "dd/mm/yyyy"
End With
.Range("L6").Resize(D_date.Count, 1) = Application.Transpose(D_date.items)
.Range("K6:L" & D_date.Count + 7).Borders.Weight = xlThin
End With
End Sub
le resultat:

le code
Option Explicit
'-------
Sub compter_lesvides()
Dim Derlig As Long, T_in, Idx As Long, Jour As Long
Dim D_date As Object
Dim TempsdeTraverseGlobale
'----initialisations
Application.ScreenUpdating = False
With Sheets("TempsdeTraverseGlobale")
Derlig = .Columns("E").Find("*", , , , , xlPrevious).Row
'stocke en RAM le tableau
T_in = .Range("E6:K" & Derlig)
Set D_date = CreateObject("scripting.dictionary")
'-----collecte et traitement
For Idx = 1 To UBound(T_in)
Jour = CLng(T_in(Idx, 1))
If Not D_date.Exists(Jour) Then
D_date.Add Jour, 0
If T_in(Idx, 2) = "" Then D_date.Item(Jour) = 1
Else
If T_in(Idx, 2) = "" Then D_date.Item(Jour) = D_date.Item(Jour) + 1
'TempsdeTraverseGlobale = D_date.Item(Jour)
End If
Next
'restitution
.Range("K6:L10000").Clear
With .Range("K6").Resize(D_date.Count, 1)
.Value = Application.Transpose(D_date.keys)
.NumberFormat = "dd/mm/yyyy"
End With
.Range("L6").Resize(D_date.Count, 1) = Application.Transpose(D_date.items)
.Range("K6:L" & D_date.Count + 7).Borders.Weight = xlThin
End With
End Sub
le resultat:

Oui mais ca marche sur le mien comme quoi les exemples vite faits ne correspondant pas à la réalité posent toujours des problèmes
par exemple
T_in = .Range("E6:K" & Derlig) ???? pourquoi K puisque tu restitue en K ?
et sur mon code
T_in = .Range("C6:D" & Derlig)
le test se fait sur la colonne à droite de la colonne date
????
par exemple
T_in = .Range("E6:K" & Derlig) ???? pourquoi K puisque tu restitue en K ?
et sur mon code
T_in = .Range("C6:D" & Derlig)
le test se fait sur la colonne à droite de la colonne date
????