[RESOLU] Occurences dans un intervale de temps

macadamx

XLDnaute Junior
Bonjour à tous !

J'éssaye de trouver la solution sur le forum, mais je n'ai pas trouvé quelque chose qui s'en rapproche.

sur un tableau, je fais un datepart pour savoir le numéro du mois.
Et je voudrais enregistrer la donnée dans des mois pour avoir le nombre d'occurence par mois.

Concrètement, je voudrais partir d'un tableau où je calcul la durée des mesures.

Si la mesure est terminée par exemple :

1er janvier 2014 au 13 mars 2014
il sera alors présent aux mois de janvier, février et mars

si la mesure n'est pas terminée

ça sera janvier, février, mars, avril, mai, juin, juillet, août.

Pour cela j'utilise le datepart pour avoir le numéro mais après, soit j'écris chaque possibilité ce qui risque d'être super long, soit je trouve une solution alternative.

J'enregistre le tout ensuite dans un autre tableau.

En sachant que je passe par du VBA pour analyser si la mesure est terminée ou non et que j'extrait ces données de doublons.

Mon seul besoin serait concrètement d'utiliser le résultat de datepart("m"..) pour dire il est présent de janvier à mars soit 1 à 3 ou de janvier à aujourd'hui donc 1 à 8.

Comment feriez vous cela s'il vous plaît ...

En espérant avoir été assez clair dans mes explications.

Johan
 
Dernière édition:

macadamx

XLDnaute Junior
Re : Occurences dans un intervale de temps

Bon je suis en train d'éssayer de développer mon fichier...

En gros, ça serait if datestart = 1 and datefin = 3 then
janvier = janvier + 1
février = février + 1
mars = mars + 1

elseif datestart = 2 and datefin = 3 then
février = février + 1
mars = mars + 1

elseif datestart = 3 and datefin = 3 then
mars = mars + 1

Je dois faire ça pour chaque occurrence dans ce cas là ?...
Quelqu'un aurait une solution alternative ?
Parce que j'ai 8 type différents * 12 mois * beaucoup de possibilités....
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Occurences dans un intervale de temps

Bonjour Johan, bonjour le forum,

Et si tu nous proposais le code que tu utilises ou, mieux encore, un petit fichier exemple avec ce même code... Je pense que les réponses pleuvraient comme démissions de ministres...
 

macadamx

XLDnaute Junior
Re : Occurences dans un intervale de temps

pour le moment j'en suis là :

Sub analyse_réel_jeunes_game_mesures()


Application.ScreenUpdating = False


Sheets("GAME MESURES").Activate

Dim d As Date
Dim f As Date
Dim fp As Date
Dim cellule As Range
Dim cellu As Range

'oui je te fais chier avec mon Lastrow
lastrow = Cells(Rows.Count, "A").End(xlUp).Row


' chercher la cellule statut
Cells.Find(What:="Statut de la Prise en Charge", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate

'definir la position de statut
statut = ActiveCell.Column


' chercher la cellule identifiant
Cells.Find(What:="Identifiant", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate

'definir la position de statut
identifiant = ActiveCell.Column

' chercher la cellule date de début de la prise en charge
Cells.Find(What:="Date Début de Prise en Charge", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate

'definir la position de la date de début
début = ActiveCell.Column

' chercher la cellule fin prévue
Cells.Find(What:="Date Fin Prévue", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate

'definir la position de statut
fin_prévue = ActiveCell.Column


' chercher la cellule fin effective
Cells.Find(What:="Date Fin Effective", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate

'definir la position de statut
fin_effective = ActiveCell.Column


Columns.identifiant.Select
Range(identifiant & lastrow).Sort Key1:=Range(Cells(ActiveCell.Row, identifiant)), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal




Set myrg = ActiveSheet.Range(identifiant & lastrow).Rows.SpecialCells(xlCellTypeVisible)


myrg.Select




doublonDetected = False
lastIdentifiant = 0
For Each c In myrg

c.Select
'lastIdentifiant permet de sauter completement un paquet de doublons
If lastIdentifiant = c.Value Then GoTo NEXTC

lastIdentifiant = c.Value

countinit = c.Row
Count = c.Row

'On cherche a savoir si on a un doublon et jusqu'a ou on a le doublon
Do While c.Value = Cells(Count + 1, c.Column):
Count = Count + 1
Loop
'Si on a un doublon alors la condition suivante est remplie
If Count > c.Row Then 'on a un doublon
Set MyRg2 = Range(identifiant & countinit & identifiant & Count)
MyRg2.Select

'On cherche si on a la valeur "en cours" parmis ces doublons
For Each C2 In MyRg2

If Cells(C2.Row, statut).Value = "en cours" Then 'alors on sait que cette ligne n'est pas clôturée


en_cours = True
Exit For
End If




Next C2

'Si on a trouvé un doublon, on note les rows
If en_cours = True Then




Set MyRg5 = Range(Cells(countinit, début), Cells(Count, début))
MyRg5.Select
d = Application.WorksheetFunction.Min(MyRg5)
datestart = d





'définition de la plus grande date de fin éffective
Set myrg6 = Range(Cells(countinit, fin), Cells(Count, fin))
myrg6.Select
f = Application.WorksheetFunction.Max(myrg6)
dateend = f

De là, une fois que je sais que j'ai des doublons etc, je fais les analyse sur les durées max et min pour avoir l'intervalle de temps. Donc 1 à 5, 2 à 6, etc.

Et c'est là où je bloque
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Occurences dans un intervale de temps

Bonjour Johan, bonjour le forum,

Le code que tu donnes est incomplet ! Pour t'aider il faut que je puisse comprendre. Pour comprendre il me faut le code complet (à défaut d'un fichier exemple qui serait l'idéal). Fais un effort, on va pas tout faire pour toi !...

 

macadamx

XLDnaute Junior
Re : Occurences dans un intervale de temps

Bonjour Robert, Bonjour le forum,

Merci de prendre le temps de me répondre.
En fait, il est incomplet justement parce que je me pose la question de comment enregistrer mes données.
Concrètement,
Si les données sont en cours avec un doublon, je fais un min et un max pour pouvoir prendre la plus petite et la plus grande date dans ce doublon.

Après, sil il n y a pas de doublons, j'enregistre simplement la plus petite et la plus grande date.

Si c'est cloturé alors c'est la plus petite date jusqu'à aujourd'hui.

Tout ça, je sais faire.

C'est dans l'enregistrement des données où ça me pose un problème.
J'ai 12 établissements
et pour chaque établissement il pourra y avoir une donnée avec un intervalle de temps différent.


Etablissement 1 :

Donnée 1 : janvier à février => donc présent dans le tableau
Janvier + 1
Février + 1

Donnée 2 : Mars à Mai => donc présent dans le tableau
Mars + 1
Avril + 1
Mai + 1

Etablissement 2...

Donnée x
août à aujourd'hui.

Le but étant de regrouper les données par mois.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Occurences dans un intervale de temps

bonjour Johan, bonjour le forum,

Ce qui est pénible c'est qu'il faut tout recréer pour essayer de comprendre alors qu'un petit fichier exemple aurait été tellement plus simple...
Voilà donc ce que j'ai cru comprendre :

Code:
Sub analyse_réel_jeunes_game_mesures()
Dim O As Object 'déclare la variable O (Onglet)
Dim Statut As Integer 'déclare la variable Statut
Dim Identifiant As Integer 'déclare la variable Identifiant
Dim Debut As Integer 'déclare la variable Debut
Dim Fin As Integer 'déclare la variable Fin
Dim PL As Range 'déclare la variable PL (PLage)
Dim C As Range 'déclare la variable C (Cellule)
Dim ND As Integer 'déclare la variable ND (Nombe de doulons)
Dim PLD As Range 'déclare la variable PLD (Plage des Doublons)
Dim D As Date 'déclare la variable d (date de Début)
Dim F As Date 'déclare la variable F (date de Fin)

Application.ScreenUpdating = False 'masque les rafraîchissement d'écran
Set O = Sheets("GAME MESURES") 'définit l'onglet O

'ces colonnes ne sont elles pas fixe ? Pourquoi une recherche pour les définit ?
Statut = O.Rows(1).Find("Statut de la Prise en Charge", , xlValues, xlWhole).Column 'définit la colonne du statut
Identifiant = O.Rows(1).Find("Identifiant", , xlValues, xlWhole).Column 'définit la colonne de l'identifiant
Debut = O.Rows(1).Find("Date Début de Prise en Charge", , xlValues, xlWhole).Column 'définit la colonne de la date de début
Fin = O.Rows(1).Find("Date Fin Effective", , xlValues, xlWhole).Column 'définit la colonne de la date de fin
'tri la colonne identifiant

O.Columns(Identifiant).Sort Key1:=O.Cells(1, Identifiant), Order1:=xlAscending, Header:= _
   xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
   DataOption1:=xlSortNormal
Set PL = O.Columns(Identifiant).SpecialCells(xlCellTypeConstants) 'définit la plage PL
Set PL = PL.Offset(1, 0).Resize(PL.Rows.Count - 1, 1) 'redéfinit la plage PL (sans l'étiquette de la ligne 1)
For Each C In PL 'boucle sur toutes les cellules C de la plage PL
    ND = Application.WorksheetFunction.CountIf(PL, C.Value) 'définit le nombre de doublons ND
    If ND = 1 Then 'condition : si ND = 1 (pas de doublon)
        D = O.Cells(C.Row, Debut) 'définit la date D
        F = IIf(O.Cells(C.Row, Statut) = "en cours", Date, O.Cells(C.Row, Fin)) 'définit la date F (date de fin effective ou date du jour si "en cours")
    Else 'sinon (il y a des doublons)
        Set PLD = C.Resize(ND, 1) 'définit la plage des doublons PLD
        D = Application.WorksheetFunction.Min(Application.Intersect(PLD.EntireRow, O.Columns(Debut))) 'récupère la date de début minimum
        F = Application.WorksheetFunction.Max(Application.Intersect(PLD.EntireRow, O.Columns(Fin))) 'récupère la date de fin effective maximim)
    End If 'fin de la condition
    
    'ici tu traites en fonction des date de début et de fin

Next C 'prochaine cellule de la boucle
Application.ScreenUpdating = True 'affiche les rafraîchissement d'écran
End Sub

Mais sans fichier exemple, je passe la main.
 

macadamx

XLDnaute Junior
Re : Occurences dans un intervale de temps

Bonjour ! Merci beaucoup !

Les colonnes peuvent être amenées à être modifiées.
Je ne veux enregistrer à chaque fois que pour l'année en cours.
J'ai joint un fichier exemple.
Dans ce fichier exemple, j'ai surligné en jaune ce qui doit être remplit automatiquement.
J'ai mis en exemple, une ligne en rouge qui est en doublon et comment elle est enregistrée dans l'autre tableau.
C'est dans l'enregistrement des données que je bloque. Soit je fais pour chaque établissement (il y en a 12) avec toutes les possibilités d'intervalle par établissement, soit je ne sais pas ....






Merci encore de votre aide.
 

Pièces jointes

  • EXEMPLE_dates.xls
    156 KB · Affichages: 40

Robert

XLDnaute Barbatruc
Repose en paix
Re : Occurences dans un intervale de temps

bonjour Johan, bonjour le forum,

Et il sort d'où ce 1,0 ? Ça correspond à quoi ? je ne le vois nulle part dans le tableau de l'onglet GAME MESURES. De plus, il y a doublon avec une donnée dont le statut est en cours et l'autre clôturé. Comment savoir ?
Ton exemple ne montre qu'un seul doublon mais où seront renvoyées les données si plusieurs doublons ?
Tu es désespérant !...

Autant de mauvaise volonté je navet jamais vu ! je passe la main, trouve un autre gogo...

 

macadamx

XLDnaute Junior
Re : Occurences dans un intervale de temps

Bonjour Robert, Bonjour le forum,

Désolé si je m'exprime mal, c'est dur de décrire un problème parfois.
Le 1 est en fait un exemple d'enregistrement (les deux lignes surlignées en rouge).
En fait, lorsqu'il y a des doublons, il faut regarder la plus petite et la plus grande valeur, si il en existe une en cours, on prend quand même la plus petite valeur, mais la plus grande sera celle d'aujourd'hui car la donnée n'est pas cloturée.

La macro, va devoir ajouter + 1 à chaque fois pour la période de présence de la donnée.

donc si il existe dans une autre ligne une présence de mars à mai cela donnera :

Janvier : 1
Février : 1
Mars : 2
Avril : 2
Mai : 2
Juin : 1
Juillet : 1
Août : 1

Et ainsi de suite pour chaque identifiant.

Ai-je été assez clair là ?

Encore désolé de la mauvaise explication. (je ne vous prend pas pour un gogo loin de là).
 

macadamx

XLDnaute Junior
Re : Occurences dans un intervale de temps

Je viens de voir quelque chose, les données peuvent ne pas être présentes à certains mois. Donc il faut que je prenne en compte cela aussi dans mon code en enregistrant seulement par périodes.
exemple dans l'un des doublons :

clôturée /NMvWAliUiL3vISi3cAW8AvCAvUUrg F 09/07/2014 10/07/2014
clôturée /NMvWAliUiL3vISi3cAW8AvCAvUUrg F 03/04/2014 04/04/2014
clôturée /NMvWAliUiL3vISi3cAW8AvCAvUUrg F 20/02/2014 21/02/2014
clôturée /NMvWAliUiL3vISi3cAW8AvCAvUUrg F 09/02/2014 10/02/2014

La donnée n'est donc pas présente en mars, mai et juin.

Donc ça fera février + 1
avril + 1
juillet + 1

... Que de complications !!!
 

macadamx

XLDnaute Junior
Re : Occurences dans un intervale de temps

Je suis déséspéré...

J'ai cherché :
- enregistrer valeur selon intervalle de temps
- datepart durée
- datefrom, dateto
- présence données dans temps

Et j'en passe et je ne trouve rien qui se rapproche de mon problème.

Personne n'a eu affaire à ce genre de requêtes ?
 

Discussions similaires

Réponses
3
Affichages
405

Statistiques des forums

Discussions
312 188
Messages
2 086 028
Membres
103 100
dernier inscrit
erym64300