Compté le nombre de ligne entre deux trait
Bonjour
j'aurai besoin d'aide sur un fichier
je voudrais calculer le nombre de ligne entre deux trait une macro ou formule
dans mon example il y a deux colonnes week et day
en A2 à A22 c'est la semaine 15 donc le resultat que je souhaite est 21
la semaine 16 il y a 23
la semaine 17 il y a 28 aussi mais on peux avoir plus....
ideal c'est avoir une autre feuille ici feuil2
En C1le resultalt de la semaine 15 ici 21
En D1 le debut de la semaine ici A2
en E1 la fin de la semaine icic A22
en C2 le resultalt de la semaine 16 ici 23
En D2 le debut de la semaine ici A23
en E2 la fin de la semaine icic A45
.......
je vous en remercie à l'avance.
......
Bonjour,
Une autre possibilité sans VB. La fin du tableau des semaines doit être matérialisée par "FIN" dans la colonne "day" de la dernière semaine renseignée.
Bonjour M12 et Cylfo
Merci ca fonctionne tres bien.
mais voila, mon probleme , je ne l''ai pas signalé c'est que le Lundi n'est pas tout le temps juste apres le trait on peut y avoir des lignes entre le trait de debut de semaine
je vous ai renvoyer les fichiers en mettant bien des lignes en plus pour les lundi au dessus.
mais l'idée est tres bonne
est il possible de travailler avec le Trait et non avec le Lundi
merci
bonjour, il faut vérifier s'il y a une ligne horizontale et cela n'est pas possible avec des formules.
Bonjour
merci à vous deux , si quelque peut trouver une solution je suis preneur.
pour l'instant, je vais garde votre idee.
sinon j'ai réflechie dans mon projet
dans le meme principe
j'ai rajoutér une feuille3 ou on retrouve
week n week n+1 ....
mais sous le week n
il y a deux chiffre le premier c'est dans la semaine 15 c'est tous les bulk ici il y en a 4 et ensuite je fait la somme
donc ici le premier bulk est le 154126 et la somme 77 000
l 'idée , je voudrais que la feuille 3 se mette a jours en automatiques
sachant que week n c'est la semaine en cours
je vous en remerci a l'avance
re,
ce que vous demandez est différent à ce que vous demandiez au debut.
Sub Feuil3()
Dim c As Range, c3, iMax, F3, Dict, iWeek
Set F3 = Sheets("Feuil3")
F3.UsedRange.Offset(1).ClearContents
Set c3 = F3.Range("B3")
Set Dict = CreateObject("scripting.dictionary")
With Feuil1
iWeek = WorksheetFunction.IsoWeekNum(Date) 'cette semaine
Set c = .Columns("A").Find(iWeek) 'trouvez-la dans la colonne A
If c Is Nothing Then
MsgBox "semaine est introuvable"
Else
iMax = .UsedRange.Row + .UsedRange.Rows.Count + 1 'dernière ligne
Set c = c.End(xlUp) 'trouvez "debut" juste en dessus
If StrComp(c.Value, "debut", 1) = 0 Then 'correcte, c'est "debut"
For i = c.Row To iMax 'boucle ces lignes
If IsNumeric(.Cells(i, "A")) And Len(.Cells(i, "A").Value) Then iWeek = .Cells(i, "A") 'valeur numérique en colonne A = numéro de la semaine
If Len(.Cells(i, "C").Value) > 0 Then 'bulk <>""
Dict(.Cells(i, "C").Value) = Dict(.Cells(i, "C").Value) + .Cells(i, "D").Value 'cumuler qty pour ce "bulk"
End If
If StrComp(.Cells(i + 1, "A").Value, "debut", 1) = 0 Or i = iMax Then 'prochaine ligne est de nouveau "debut" ou derniere ligne
If Dict.Count Then 'il y a des résultats
With c3.Resize(Dict.Count) 'plage pour coller
.Value = Application.Transpose(Dict.keys) 'les différents bulks
.Offset(, 1).Value = Application.Transpose(Dict.items) 'ces qty cumulés
End With
End If
c3.Offset(-1).Value = "Week " & iWeek 'la semaine
Set c3 = c3.Offset(, 2) 'cellule pour la semaine suivante
Dict.RemoveAll 'RAZ dictionaire
End If
Next
End If
End If
End With
End Sub
Bonjour le fil
@Olivcoco, quand vous demandez autre chose que pour la 1ère question,
merci de créer un nouveau sujet avec un nouveau titre SVP
Merci de votre compréhension
Bonjour
excusez moi mais pour moi c 'est le meme sujet.
En faite au debut je pensais recuper les cellules les copier manuellement en feuil 3 puis faire un tableau dynamics
et je me suis dit apres je pourrais tout faire en meme temps et la deuxieme methode est beaucoup mieux pour moi.
Bonjour Bart
votre methode marche tres bien et je vous en remercie.
j'aurai comme meme quelque chose encore à faire . en faite mon planning il est sur 2 ans donc il y a un probleme il trouve le premier 16 ( la semaine en cours ) mais qui est la semaine de l'année derniere donc il bloque
la solution que j'ai trouvé pour l'instant est de supprimer mes numero de semaines avant
l ideal c'est de rechercher soit le deuxieme "16" ou alors rechercher le premier "debut" je pourrais effacer manuellement tous les "debut" qui sont avant
je vous renvoie le fichier il y a deux bouton en haut en i1 c'est la macro pour feuil3
re,
on cherche la dernière semaine "ISO-week" dans la colonne A, les "debut" ne sont plus nécessaire, on suppose que le lundi précédent à cette semaine (en colonne B) est la première ligne de cette semaine.
Re,
je pense que vous avez renvoyer la premier version
Pour le Lundi je prefere garder le "debut" parce que le Lundi n'est pas toujours la premiere ligne de cette semaine
Merci
je vous renvoie le fichier
la colonne C est la meme que G et D est la meme que AC
bizar,
c'est la macro "Feuil3_Bis", l'autre existe encore ! Vous voulez C&D au lieu de G&AC ? (facile à modifier dans la macro, je l'ai indiqué)
Bonjour
Jje ne prefere pas travailler avec le Lundi .Je prefere garder le "debut" dans la colonne A et je trouve que le principe focntionne bien
Parce que je l'ai dit avant je peux avoir des ligne avant le Lundi et qui compte dans la semaine du lundi.
Mais sinon ca fonctionne bien
Merci
Bonjour BSAlv
la macro fonctionne tres bien
j'aurai une petite remarque
si je modifie le nom de la feuil1 cela ne fonctionne plus que si il y a un espace dans le texte
example j'ai remplacé Feuil1 de la macro et dans l'onglet le nouveau nom ici Planning G1
et il bloque à la ligne aCol1 = Filter(Evaluate(s), "~", 0) 'tableau avec la ligne et le contenu de toutes les cellules non-vide sans "debut" de la colonne A
il met tout en jaune
parcontre si je ne met pas d'espace PlanningG1 ça fonctionne ( sans l'espace entre Planning et G1)
sinon un grand merci
je check encore mais cela focntionne tres bien
re,
j'utilise maintenant une plage nommé "BART" et "BART1" dans la macro, cela a l'air de fonctionner avec un espace. La première ligne du module est maintenant un variable que vous pouvez utiliser pour le nom de votre feuille.
Bonjour BSAlv
merci je peux utiliser maintenant mes noms de mes feuilles avec des espaces.
je vous en remercie.
je viens de remarque quelques chose
une petite remarque
quand je n 'utilise pas le "debut" c''est bon tout fonctionne il me prendre bien entre les deux "Lundi"
quand j utilise le "debut" il y a une chose qui ne fonctionne pas
example
si il y a un "debut" durant la semaine precedente et plus de "debut" apres
il va prendre deux semaine la semaine precedente et la semaine en cours apres c'est bon
L'idée de faire avec ou sans "debut" je trouve cela pas mal
il faudrait que durant la semaine en cours il recherche d'abort le "debut" et si il y a rien il prend le Lundi
si il y a "debut" c'est "debut" jusqu'au prochain "debut" ou le "Lundi"( si il n y a pas de "debut
si il n y a pas de "debut" il prend que le "Lundi" jusqu'au "Lundi" prochaine
pour info dans la colonne C il y a la date ca peux peut être vous aider.
je vosu en remercie à l'avance
bonjour,
modification de la macro, maintenant on calcule les lignes des dimanches, des lundi et des "débuts" pour chaque semaine. Je pense que la macro est aussi plus lisible.
Const Nom_Feuille = "Planning G1"
Sub Feuil3_Bis()
Dim c As Range, c3, iMax, F3, Dict, iDim1, iDim2, iLun1, iLun2, iDeb1, iDeb2, iJour, Dimanche, iSem
t = Timer
Set Dict = CreateObject("scripting.dictionary")
Dict.comparemode = vbTextCompare
Set F3 = Sheets("Feuil3")
F3.UsedRange.Offset(1).ClearContents 'RAZ feuille
Set c3 = F3.Range("B3") '1ière cellule pour coller
Set F1 = Sheets(Nom_Feuille)
With F1
With .UsedRange
lLigne = .Row + .Rows.Count + 1
End With
With .Range("A1:AC" & lLigne)
.Resize(, 1).Name = "BART"
adates = .Columns(3).Value2
End With
iMax = Application.Max(adates) 'date la plus grande de colonne B
Dimanche = CLng(Date - WorksheetFunction.Weekday(Date, 11))
For iJour = Dimanche To iMax - 8 Step 7 'boucle des dimanches
iDim1 = Application.Match(iJour, adates, 0) 'ligne du dimanche de la semaine précédente
If Not IsNumeric(iDim1) Then MsgBox "problème avec " & Format(iJour, "ddd dd-mm-yy"), vbCritical, "INTROUVABLE": Exit For
Application.Goto .Cells(iDim1, 1), 1 'montrez ce dimanche en haut de l'écran
iDim2 = Application.Match(iJour + 7, adates, 0) 'ligne du dimanche de cette semaine
If Not IsNumeric(iDim2) Then MsgBox "problème avec " & Format(iJour + 7, "ddd dd-mm-yy"), vbCritical, "INTROUVABLE": Exit For
iSem = WorksheetFunction.IsoWeekNum(iJour + 1) '&Format(iJour + 4, "'YY-")
iLun1 = Application.Match(iJour + 1, adates, 0) 'ligne du lundi de cette semaine
If Not IsNumeric(iLun1) Then MsgBox "problème avec " & Format(iJour + 1, "ddd dd-mm-yy"), vbCritical, "INTROUVABLE": Exit For
iLun2 = Application.Match(iJour + 8, adates, 0) 'ligne du lundi de la semaine prochaine
If Not IsNumeric(iLun2) Then MsgBox "problème avec " & Format(iJour + 8, "ddd dd-mm-yy"), vbCritical, "INTROUVABLE": Exit For
iDeb1 = Evaluate("iferror(AGGREGATE(15,6,ROW(bart)/((bart=""debut"")*(" & iDim1 & "<row(bart))*(row(bart)<=" & iDim2 & ")),1)," & iLun1 & ")") 'premier "debut" entre iDim1+1 et iDim2
iDeb2 = Evaluate("iferror(AGGREGATE(15,6,ROW(bart)/((bart=""debut"")*(" & iDim2 & "<row(bart))),1)," & iLun2 & ")") 'premier debut apres iDim2
i1 = Application.Min(iLun1, iDeb1) '1ière ligne de notre plage
i2 = Application.Min(iLun2, iDeb2) 'dernier ligne de notre plage
Set c = .Cells(i1, "A").Resize(i2 - i1) 'notre plage
s = Join(Array("semaine ", iSem, iDim1, iLun1, iDim2, iLun2, iDeb1, iDeb2, i1, i2, " ", c.Address))
Application.StatusBar = s: DoEvents
'Debug.Print s
Dict.RemoveAll
For Each c0 In c.Cells 'boucle cette plage
If c0.Offset(, 6).Value > 0 Then 'bulk <>"" (la colonne 7 = décalage de 6)
Dict(c0.Offset(, 6).Value) = Dict(c0.Offset(, 6).Value) + c0.Offset(, 28).Value 'cumuler qty pour ce "bulk" colonne 29 (= décalage 28) oubien 4 si AC et D sont les mêmes)
End If
Next
If Dict.Count Then 'il y a des résultats
With c3.Resize(Dict.Count) 'plage pour coller
.Value = Application.Transpose(Dict.keys) 'les différents bulks
.Offset(, 1).Value = Application.Transpose(Dict.items) 'ces qty cumulés
End With
End If
c3.Offset(-1).Value = "Week " & iSem 'la semaine
Set c3 = c3.Offset(, 2) 'cellule pour la semaine suivante
Dict.RemoveAll 'RAZ dictionaire
Next
Application.Goto F3.Range("A1")
Application.StatusBar = ""
'MsgBox Timer - t
End With
End Sub
Rebonjour
cela semble correct.
la seul petite remarque c'est qu'on voit le macro se lancer et il va jusque en bas du fichier
avec l'ancienne macro il lancait la macro mais on voyait rien.
je reviens vers vous pour savoir si tout est ok je vais tester cela pendant quelque jours.
un Grand Merci.