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.
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
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 FunctionL'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
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
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).