Repérer date de début, date de fin

Bjr

Après réflexion et recherches dans les formules, il semblerait que j'aurais toujours un problème pour être en phase avec les dates, je pense que peut être ,je devrais me diriger par la création d'une macro qui compterais en AI le nombre de A , et en AJ le nombre de B, en AK le nombre de C dans la période notée en AH,puis une autre macro en AL, AM et AN pour compter les A, B ou C entre les date définies en AK (seconde période)

Cdt

Norberlngo

Bonjour,

... Je pense que ton raisonnement chemine dans la bonne direction. La personnalisation devient telle qu'il devient plus judicieux d'individualiser complètement le traitement ! Je débute ma journée... Je regarderai plus en détail plus tard...

Bonne journée.

Bonjour

Oui peut être que le raisonnement chemine dans la bonne direction mais dommage que je ne sois pas assez doué et bon pour traduire mes idées en langage excel

Je commence seulement à comprendre quelques formules alors la création de macros c'est encore un peu difficile.

En attendant très bonne journée, je vais continuer de tâtonner

Cdt

Berlingo

Bonsoir,

J'ai un peu mélangé ton sujet avec un autre dans une de mes réponses (pas ici). Cas plus simple que le tien, mais l'intéressé déclarait abandonner... Bon, après avoir été remettre quelques excuses pour les commentaires qu'il n'a pas dû comprendre et pour cause, puisqu'ils se référaient à ta configuration , je n'ai toujours pas eu le temps de reprendre ton fichier, mais on doit pouvoir trouver une solution simple.

A+

Pour me laisser le temps de réfléchir, j'ai concocté une autre fonction, qui utilise les résultats de la première pour compter les mentions par période et par mention...

Elle fonctionne, certes, mais cela ne simplifie globalement pas les choses, et je n'oserais pas m'en glorifier.

Surtout que ton alerte à 35, ne peut plus être traitée par ligne. Il faut reconstituer la succession de dates pour l'apprécier.

La première fonction pouvait s'appliquer à autre chose qu'un calendrier, la seconde aussi. Elles fournissent des résultats, que la ligne ait 20 colonnes ou 100... C'est d'ailleurs pour ça que cela ne gêne pas la première de te fournir un 30 février dans un résultat !

Il faut donc repenser le problème en terme de calendrier...

A titre d'illustration :

Noté que tu as abandonné cet axe de travail !

Je clos donc, en ce qui me concerne.

Bonjour

Pas très bien compris la teneur du dernier message. Je n'ai rien abandonné du tout, et surtout pas "cet axe de travail",bien au contraire.Je le trouve très bien.

C'est peut être une allusion au message laissé sur le forum au sujet de la recherche de formules. Oui en effet, j'essaie de progresser dans ce domaine et c'est en décorticant les formules reçues que j'arrive à comprendre certains cheminements. Etant donné que j'avais un début de solution, j'essaie de continuer à trouver des idées tout en adoptant néanmoins vos macros sur mon projet

Pour la réponse d'hier, merci. Je l'ai intégré dans mon tableau et cela fonctionne parfaitement.

Mais il est vrai que l'utilisation d'un vrai calendrier faciliterait le cumul des 35 jours, voir même peut être le calcul des périodes. C'est la succession, d'un mois sur l'autre , qui doit être prise en compte, en effet je l'avais compris mais de là , à le transmettre sur papier, il y a un pas que je ne suis encore capable de franchir.

Cdt

NB

Bonsoir (ou bonjour) ?

Ma dernière contribution, ultra-personnalisée : retour à une fonction matricielle globale. Elle calcule tout le tableau en même temps.

Function RECAPCAL(Cal As Range, Optional biss As Boolean)
    Dim Rcp(), djm, m%, j%, i%, dp%, fp%, p%, sg(1, 2), nj%, att%
    Application.Volatile False
    i = IIf(biss, 29, 28)
    djm = Array(0, 31, i, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
    If Cal.Rows.Count <> 12 Or Cal.Columns.Count <> 31 Then
        RECAPCAL = CVErr(xlErrNum): Exit Function
    End If
    ReDim Rcp(1 To 12, 9)
    With Cal
        For m = 1 To 12
            For j = 1 To djm(m)
                Select Case .Cells(m, j)
                    Case 0
                        If dp > 0 Then
                            fp = j - 1: i = (p - 1) * 3 + 1
                            Rcp(m, i) = "du " & dp & " au " & fp & " " & MonthName(m)
                            Rcp(m, i + 1) = sg(1, 1) & sg(0, 1)
                            If sg(0, 0) = 2 Then Rcp(m, i + 2) = sg(1, 2) & sg(0, 2)
                            If dp = 1 And att > 0 Then
                                nj = nj + fp - dp + 1
                                If nj > 35 Then
                                    att = (att - 1) * 3 + 1
                                    Rcp(m - 1, att) = Rcp(m - 1, att) & Chr(160)
                                    Rcp(m, i) = Rcp(m, i) & Chr(160)
                                End If
                            End If
                            att = 0: nj = 0: dp = 0: fp = 0: Erase sg
                        End If
                    Case Else
                        If dp = 0 Then
                            dp = j: p = p + 1: sg(0, 0) = 1: sg(0, 1) = .Cells(m, j): sg(1, 1) = 1
                        Else
                            If sg(0, 0) = 1 Then
                                If .Cells(m, j) <> sg(0, 1) Then
                                    sg(0, 0) = 2: sg(0, 2) = .Cells(m, j): sg(1, 2) = 1
                                Else
                                    sg(1, 1) = sg(1, 1) + 1
                                End If
                            Else
                                Select Case .Cells(m, j)
                                    Case sg(0, 1): sg(1, 1) = sg(1, 1) + 1
                                    Case sg(0, 2): sg(1, 2) = sg(1, 2) + 1
                                End Select
                            End If
                        End If
                End Select
            Next j
            If dp > 0 Then
                fp = djm(m): i = (p - 1) * 3 + 1
                Rcp(m, i) = "du " & dp & " au " & fp & " " & MonthName(m)
                Rcp(m, i + 1) = sg(1, 1) & sg(0, 1)
                If sg(0, 0) = 2 Then Rcp(m, i + 2) = sg(1, 2) & sg(0, 2)
                If att > 0 Then
                    nj = nj + fp - dp + 1
                    If nj > 35 Then
                        att = (att - 1) * 3 + 1: Rcp(m - 1, att) = Rcp(m - 1, att) & Chr(160)
                    ElseIf m < 12 Then
                        For i = 1 To 37 - nj
                            If .Cells(m + 1, i) = 0 Then Exit For
                        Next i
                        If nj + i > 36 Then
                            att = (att - 1) * 3 + 1: Rcp(m - 1, att) = Rcp(m - 1, att) & Chr(160)
                        End If
                    End If
                Else
                    nj = fp - dp + 1
                End If
                att = p: dp = 0: fp = 0: Erase sg
            End If
            If p > 0 Then Rcp(m, 0) = p: p = 0
        Next m
    End With
    For m = 1 To 12
        For i = 0 To 9
            If IsEmpty(Rcp(m, i)) Then Rcp(m, i) = ""
        Next i
    Next m
    RECAPCAL = Rcp
End Function

L'utilisation est simple : on sélectionne une plage de 12 lignes et 10 colonnes.

Formule : =RECAPCAL(B4:AF15;VRAI)

On lui envoie donc tout le tableau annuel de 12 lignes et 31 colonnes. Le second argument est optionnel : mettre VRAI si l'année est bissextile pour que le 29 février soit pris en compte.

(On suit le calendrier maintenant, ton inscription du 30 février est donc ignorée ! )

La fonction est un peu plus longue que les précédentes , un peu normal puisqu'on fait le calcul sur toute l'année, mais c'est le décompte relatif aux 35 jours qui a bien contribué à l'allongement et occupe pas loin du tiers de la procédure...

Le traitement de ce décompte a consisté à rajouter (après première insertion, car pour dépasser 35 jours il faut être à cheval sur au moins deux mois et on pourrait facilement l'être sur 3, d'où la nécessité d'évaluer en fin de mois si on est dans une période déjà à cheval et qui peut donc chevaucher un 3e mois mais ne dépasse pas encore 35 jours, si elle va les dépasser au mois suivant, pour garder un dispositif homogène qui dans un tel cas, en fin d'une période ne fait intervenir que sur les 2 derniers mois concernés, les mois précédents étant traités en fin de mois lorsque la période continue), traitement donc je disais (pour reprendre le fil ) qui a consisté à rajouter aux mentions de périodes concernés un caractère invisible (espace insécable) mais détectable par une MFC.

Voilà !

Bonjour ou bonsoir (en effet, un peu perdu avec ces horaires

Merci pour cette nouvelle contribution. Elle à l'air génial. Je l'ai vite aperçu ce matin à mon réveil mais je n'ai pas eu le temps de l'étudier d'un peu plus près .Je m'y attarderai ce week end car à présent il est tard.

Mais vraiment merci beaucoup pour tout ce temps consacré à la réalisation de mon projet.

J'ai hâte de mettre cette macro dans mon tableau et de la voir fonctionner.

Bon début du week end et très vite je donnerai des news du bon fonctionnement de mon travail, du moins je l'espère

Encore tous mes remerciements

Cdt

Berlingo

Bonjour ou bonsoir

J'ai donc fini par intégrer la nouvelle macro dans mon dossier. Merci c'est vraiment un beau et long travail qu'il me serait impossible de réaliser. Vraiment super!

Et si tout à l'air de fonctionner par rapport à l'ancienne macro, je ne trouve pas comment je pourrais rajouter le comptage du contenu de colonnes supplémentaires.

Je m'explique avec la précédente macro, la formule=NBLIBP($B4:$AF15;$AH4;2) me permettait en la faisant glisser et en modifiant le 2 par 3 ou 4 ou 5 ou 6 ou 7 ou 8 de pouvoir comptabiliser des autres sigles que A , B ou c. Apparemment à présent je suis limité à seulement deux colonnes donc deux sigles.

J'espere que la mail n'est pas trop compliqué.

Merci et bonne journée

cdt

Berlingo

On peut pas tout avoir à la fois !

Celle-ci est prévue pour un tableau définitif, tel que conçu au départ : dimensionné sur 3 période au maximum par mois, un nombre d'inscriptions différentes pour chaque période de deux au plus. Le fait que ce soit une fonction n'introduit comme souplesse que le choix de l'emplacement du résultat par la sélection.

Dès lors qu'on veut modifier un élément, on rebâtit la fonction pour que le tableau produit corresponde à cette nouvelle conception.

Cela peut être relativement simple comme pouvoir récapituler 4 périodes au lieu de 3 : il y a alors simplement à redimensionner le tableau qui comprendra 3 colonnes de plus et vérifier que le reste s'adapte à ce redimensionnement.

Ou un peu plus compliqué comme augmenter le nombre d'inscription différentes au sein d'une même période : cela fait également redimensionner le tableau, mais là le pas des boucles doit être aussi réadapté, le tableau de comptabilisation des inscriptions doit également être réadapté, ainsi que les boucles internes afférentes...

Mais au moment de la conception, on sait à combien de période au max on peut s'attendre, et on sait le nombre total d'inscriptions différentes utilisées. Il ne devrait donc pas y avoir de surprise à cet égard.

Je dis toujours que la conception est le moment le plus important d'un projet, qu'il conditionne étroitement ce qu'on aura à l'arrivée, et qu'il convient de prévoir lors de cette phase les évolutions possibles ultérieures de façon à en intégrer la possibilité dans la réalisation du projet. Ce qui est à la portée de tous car cela ne fait appel à strictement aucune connaissance en Excel ou VBA (qui n'interviennent que dans la réalisation).

Cordialement.

Bonjour

Etant donné que dans la précédente macro, j'avais la possibilité de rajouter très simplement des colonnes afin de comptabiliser d'éventuels nouveaux sigles, il n'était donc pas nécessaire à mon sens que j'en parle à nouveau. J'avais testé et tout fonctionnait très bien. Donc pour moi, cela était bien inclus de ma conception de départ. Comment imaginer ou prévoir que ça ne serait plus possible dans la dernière version. Je pensais que les fonctions de base du projet restaient en place et que simplement la boucle pour le comptage des 35 jours était rajoutée.

Cordialement

NB

C'est complètement différent ! Cela reste une fonction par commodité d'utilisation, mais que l'on insère à l'intérieur ou en argument une adresse de destination du tableau, on peut remplacer Function par Sub sans rien changer...

Les autres fonctions faisaient un calcul sur la ligne qui leur était indiquée, sans se préoccuper de la nature des données traitées, il suffisait qu'elles répondent aux conditions rendant le calcul prévu possible.

Le calcul des 35 consécutifs oblige à traiter sur un déroulement calendaire : on est sur plusieurs lignes dont il faut interpréter la fin pour passer à la suivante. Ce qui est demandé à ce calcul est une modification du résultat que l'on produisait avant par une fonction autonome : pour le modifier, il faut le produire entièrement.

A ce degré de personnalisation, on est dans une procédure qui doit faire très exactement ce qu'on lui demande et produira un résultat sans variabilité possible.

Que l'on veuille d'autres résultats, ce sera à chaque fois une procédure adaptée au résultat demandé et qui n'en produira pas d'autre.

Je ne dis pas que l'on ne pourrait pas introduire quelques possibilités de variations... mais :

1) Il faudrait au moins un (ou deux selon cas) paramètres supplémentaires en arguments (beaucoup d'arguments alors...)

2) Cela allongerait sans doute le code de façon sensible.

3) Il faudrait ne pas se louper dans la sélection initiale qui devra être en correspondance avec les paramètres choisis (complique l'utilisation).

Rechercher des sujets similaires à "reperer date debut fin"