XL 2010 VBA - macro avec 1 boucle qui alterne 1 action à conditions et 1 action sans conditions

Scorp0211

XLDnaute Nouveau
Bonjour à TOUS !

(Excusez ce roman, mais une lecture lente à partir du 4e paragraphe est suggérée).

Je m'appelle Greg. Je viens juste de m'inscrire sur ce site (aujourd'hui même).
J'ai pris mes nouvelles fonctions au sein de mon entreprise mi-février, et parmi les tâches que j'ai à accomplir, j'ai un tableau statistiques à créer sous Excel.
Les statistiques ne sont pas un problème pour moi, et la manipulation d'Excel est plutôt aisée pour moi.

Mais jusqu'ici, je n'ai jamais eu plus d'une centaine d'entrées à analyser. Là, pour l'année 2021, j'ai un fichier qui en compte 3091 (si, si, trois mille quatre-vingt-onze !).
Et histoire de rendre les choses bien drôles, ces 3091 entrées sont en (584) petits groupes avec un nombre d'entrées variant (j'irai même jusqu'à dire aléatoire).

C'est pourquoi je me suis tourné vers une macro, et donc le codage VBA... auquel je ne connaissais absolument rien au 1er mars 2022.
Et même si en 6 semaines, j'ai appris pas mal de trucs... là, j'en arrive à un point où je ne peux plus avancer tout seul.

Voici ma problématique :
Mon service gère des travaux (nommés ''OT'') effectués par 7 ateliers différents, ayant chacun un nombre différent d'agents.
Les OT sont sollicités par les différents "services" qui constituent l'entreprise, au nombre de 28. Ce nombre n'est pas appelé à changer.
Chaque OT est saisi une première fois dans un tableau Excel, qui conserve des informations spécifiques (lieu, adresse, type d'OT, type d'événement, atelier concerné, matériel concerné, etc...). Chaque OT se voit attribué un 1er n° d'identification à 5 caractères (2 lettres + 3 chiffres).
Puis une seconde saisie est réalisée dans un autre logiciel, spécifique à notre entreprise, qui reprends les mêmes informations, mais pour certaines formulées différemment, et à partir duquel on peut réaliser une requête dans un tableau Excel. Chaque OT se voit attribué un 2e n° d'identification (9 chiffres) qui est la RÉFÉRENCE de base pour mon tableau.

Cette requête constitue ma PREMIERE source de données à analyser, et le fichier Excel de la 1er saisie en sera ma seconde source.

J'ai créé un tableau Excel comportant 19 feuilles, nommées respectivement dans l'ordre de A01 à A19.

Définition des feuilles :
(je commence par la A02, pour une raison que j'explique tout de suite : c'est la feuille qui contient les colonnes qui m'intéressent de la REQUÊTE. La feuille A01 est une copie de la 1e colonne de la requête dont j'ai supprimé les doublons pour avoir ma base "mémoire" de travail pour "reconnaître" chaque OT).
A02 : REQUETE-source 1
A01 : Base "mémoire" des N°OT
A03 : Fichier Excel de 1er saisi - source 2 (qui sera utilisée BEAUCOUP plus tard,... une fois que j'aurais géré la 1er source)
A04 : tableau récapitulatif de la composition des 7 ateliers, avec des noms (tronqués, ici, pour des raisons de confidentialité professionnelle que vous comprendrez certainement), leur catégorie professionnelle. La version non-tronquée de ce tableau est classée par ordre alphabétique par le nom de famille AU SEIN de chaque atelier. il doit encore être retravaillé/modifié.
A05 : un tableau "temps" pour réaliser des conversions de données de temps sous un certains format en un autre format. (qui sera utilisée BEAUCOUP plus tard...)
A06 : un tableau qui reprends la liste de TOUS les "services" demandeur d'OT. (noms tronqués, là encore, pour des raisons de confidentialité professionnelle).
A07 : un tableau qui reprends la liste des types d'OT : 8 en tout.
A08 : un tableau qui reprends la liste des Ateliers.
Les tableaux des feuilles A04, A05, A06, A07 et A08 seront retravaillés un peu plus tard, pour la concordance des positions d'atelier et autres... c'est pas urgent pour le moment.

et ensuite, c'est là que ça devient intéressant mais aussi compliqué :

de A09 à A15 : STATISTIQUES 1 : les "BLOCS ATELIER" avec les tableaux qui vont "recevoir" les données à analyser à partir des 2 sources, et la feuille A16 "BLOC TOTAL", qui fait les calculs automatiques.
A17 : le "BLOC STATISTIQUES 2" par nombre d'atelier concerné. (certains OT ne concernent qu'une seul atelier, d'autres OT concernent "plus" que 1 atelier).
A18 : le "BLOC STATISTIQUES 3" par service demandeur.
A19 : qui ne sert pas à grand-chose pour le moment, mais qui pourrait être un support pour la 1er macro que j'ai à créer.

Définition de ma 1e action à faire, compte tenu de la quantité d'entrées à analyser, et surtout du fait que ces entrées soient en groupe à nbre aléatoire d'entrées. Chaque groupe représente UN OT. Vous trouverez le fichier Excel en p.j. AVEC la macro. Le 1er groupe se compose de 6 entrées, c'est à dire 6 lignes avec le même N°OT à 9 chiffres, le deuxième groupe compte 7 entrées, le troisième 11 entrées, et ainsi de suite, avec à chaque fois un nombre plus grand OU plus petit d'entrées.

AUCUNE entrée ne DOIT être omise. Elles DOIVENT TOUTES être analysées.

J'ai donc créé une macro qui reprend, dans le même ordre, les N°OT de la requête (A02), en les comparant avec la liste sans doublons (A01), afin de les "copier-coller" indépendamment dans chaque "bloc atelier", dans le "bloc Total", et les "blocs statistiques 2 et 3". Ma macro fonctionne ! Mais elle ne fait qu'une partie de ce que je voudrais qu'elle fasse.

C'est là que je vous sollicite : je ne sais pas trop si je dois mettre une 2e action dans CETTE macro ou faire une 2e macro pour créer la ligne "sous-total" pour chaque OT.

Mon besoin :

pour le 1er OT
avoir les 6 lignes avec le même n°OT (ici 401508385)
Directement suivi d'une ligne nommée "S/S TOTAL"
puis, les 7 lignes pour le 2e OT (401567468)
Directement suivi d'une ligne nommée "S/S TOTAL"
et ainsi de suite, jusqu'à avoir TOUS les groupes d'OT séparés par cette ligne "S/S TOTAL".

Mes questions :
1) Est-il possible d'ajouter dans ma 1ere macro une 2e action pour créer cette ligne "S/S TOTAL" dans CHAQUE BLOC ? (Un screen shot du résultat recherché en p.j.)
(c'est-à-dire : "POUF" 6 entrées à n°OT, "PAF" Ligne "S/S TOTAL", "POUF" 7 entrées à n°OT, "PAF" Ligne "S/S TOTAL", "POUF" 11 entrées à n°OT, "PAF" Ligne "S/S TOTAL", etc...)

OU

2) Si NON, est-il possible de créer une 2e macro qui insère une ligne vide entre la 6e cellule qui contient le n°OT 401508385 et la 1e cellule qui contient le n°OT 401567468, et ainsi de suite jusqu'à la fin des 3091 entrées, MAIS là encore dans CHAQUE BLOC. Et qui fait "copier-coller" de la fameuse ligne "S/S TOTAL" (dans son entier, du coup, tant qu'à faire) sur cette ligne vide.
Et j'ai beau avoir parcouru plus de 70 pages du Forum de ce site, je n'ai rien trouvé qui m'aide réellement à ça.

Vous trouverez dans le VBE 3 modules. Il faut exécuter le 1er : "Sub AA_01". Cela dure environ 10 à 12 secondes avant que le résultat s'affiche.
J'ai mis un ' (apostrophe) devant les lignes qui concerne les feuilles A10 à A18, car pour les test, la A09 suffit. Mais je confirme que la macro fonctionne sur tous les blocs.
Et si vous voulez vous amuser à retirer l'apostrophe de chaque ligne, faites-vous plaisir ^^ !
Le module 2 et 3 (AA_02 et AA_03) sont des idées/tentatives que je n'arrive pas à faire aboutir du fait de ma connaissance BEAUCOUP TROP MÉDIOCRE du VBA.

Vous trouverez un fichier pdf avec une capture d'écran donnant aperçu du résultat recherché.

D'autres questions viendront éventuellement plus tard, dans d'autres posts, pour des détails du même genre pour ce même tableau . Mais tant que je n'ai réussi à créer ces lignes "S/S TOTAL", je suis bloqué, car toutes les autres macros qui suivront seront fondées sur cette fameuse ligne.

Je précise que je n'ai pas d'échéance dans le temps pour réaliser mon tableau.

Je remercie vivement tous ceux qui auront le courage de lire ça jusqu'au bout, et plus encore ceux qui pourront m'apporter ne serait-ce qu'une piste pour régler ma problématique. Je précise que mon entreprise fonctionne avec Excel 2010.

Un grand merci encore.
 

Pièces jointes

  • AC-05 - test - Redem feuillets bon ordre - macro 2b.xlsm
    438.3 KB · Affichages: 21
  • Résultat recherché pdf.pdf
    58.3 KB · Affichages: 14

vgendron

XLDnaute Barbatruc
Hello
effectivement, c'est un sacré pavé que tu nous proposes la :-D

une proposition de code pour créer la première colonne de résultat:
je te laisse regarder les commentaires que j'y ai mis
ps: dans le cas d'un grand nombre de données, l'utilisation de tablo vba est très efficace et rapide

VB:
Sub Statistiques()
Dim TabCodeSsDoublon() As Variant 'contient la liste des codes sans doublon de la feuille A01
Dim TabData() As Variant 'contiendra les données de la feuille A02
Dim TabFinal() As Variant 'contiendra les données à mettre dans les onglets A09==>A15

With Sheets("A01")
    fin = .Range("A" & .Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A
    TabCodeSsDoublon = .Range("A1:A" & fin).Value
End With

With Sheets("A02")
    fin = .Range("A" & .Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A
    TabData = .Range("A1:E" & fin).Value
End With
TailleFinale = UBound(TabData, 1) + UBound(TabCodeSsDoublon, 1) 'calcul de la taille finale du tableau final

ReDim TabFinal(1 To TailleFinale, 1 To 1) 'on définit le tablo (vide pour l'instant)

IndI = 1 'initialisation de l'indice qui permet de parcourir et remplir le tablo final
For i = LBound(TabData, 1) To UBound(TabData, 1) 'pour chaque ligne du tablo de données
    TabFinal(IndI, 1) = TabData(i, 1) 'on colle la donnée dans le tablo final
    
    If i = UBound(TabData, 1) Then 'si on est sur la dernière ligne==> il manque donc la ligne "total"
        TabFinal(IndI + 1, 1) = "Total"
    Else
        If TabData(i, 1) <> TabData(i + 1, 1) Then 'si la donnée suivante est différente, ca veut dire qu'on va passer à un autre code ==> il faut donc ajouter la ligne "Total"
            TabFinal(IndI + 1, 1) = "Total"
            IndI = IndI + 1
        End If
    End If
    IndI = IndI + 1
Next i
Sheets("A09").Range("A4").Resize(UBound(TabFinal, 1), 1) = TabFinal 'on colle le résultat dans a feuille A09
End Sub
 

Scorp0211

XLDnaute Nouveau
Hello
effectivement, c'est un sacré pavé que tu nous proposes la :-D

une proposition de code pour créer la première colonne de résultat:
je te laisse regarder les commentaires que j'y ai mis
ps: dans le cas d'un grand nombre de données, l'utilisation de tablo vba est très efficace et rapide

VB:
Sub Statistiques()
Dim TabCodeSsDoublon() As Variant 'contient la liste des codes sans doublon de la feuille A01
Dim TabData() As Variant 'contiendra les données de la feuille A02
Dim TabFinal() As Variant 'contiendra les données à mettre dans les onglets A09==>A15

With Sheets("A01")
    fin = .Range("A" & .Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A
    TabCodeSsDoublon = .Range("A1:A" & fin).Value
End With

With Sheets("A02")
    fin = .Range("A" & .Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A
    TabData = .Range("A1:E" & fin).Value
End With
TailleFinale = UBound(TabData, 1) + UBound(TabCodeSsDoublon, 1) 'calcul de la taille finale du tableau final

ReDim TabFinal(1 To TailleFinale, 1 To 1) 'on définit le tablo (vide pour l'instant)

IndI = 1 'initialisation de l'indice qui permet de parcourir et remplir le tablo final
For i = LBound(TabData, 1) To UBound(TabData, 1) 'pour chaque ligne du tablo de données
    TabFinal(IndI, 1) = TabData(i, 1) 'on colle la donnée dans le tablo final
  
    If i = UBound(TabData, 1) Then 'si on est sur la dernière ligne==> il manque donc la ligne "total"
        TabFinal(IndI + 1, 1) = "Total"
    Else
        If TabData(i, 1) <> TabData(i + 1, 1) Then 'si la donnée suivante est différente, ca veut dire qu'on va passer à un autre code ==> il faut donc ajouter la ligne "Total"
            TabFinal(IndI + 1, 1) = "Total"
            IndI = IndI + 1
        End If
    End If
    IndI = IndI + 1
Next i
Sheets("A09").Range("A4").Resize(UBound(TabFinal, 1), 1) = TabFinal 'on colle le résultat dans a feuille A09
End Sub

Bonjour Vgendron !

Un SUPER MEGA ENORMISSIME MERCI !
D'une pour avoir lu jusqu'au bout, mais surtout pour avoir résolu mon pb. ET aussi vite !!!!!

ÇA MARCHE DU TONNERRE !! Et en reproduisant la ligne
"Sheets("A09").Range("A4").Resize(UBound(TabFinal, 1), 1) = TabFinal"
mais en changeant A09 par le nom des autres feuilles concernées, ça fait le taf sur tous les blocs atelier, le bloc TOTAL, et les blocs statistiques 2 et 3.

Oui, et ce n'est que le début du cycle 1 ! Le cycle 2 concernera la feuille A17, le cycle 3 la feuille A18 (à partir de la source 2, MAIS TOUJOURS avec la feuille A01 comme point de référence), et le cycle 4 consistera à créer des graphiques (camembert et en barres verticales) automatiquement à partir des résultats des feuilles A16, A17 et A18. Il y aura beaucoup de formules (somme, somme auto, pourcentages) à insérer dans les macros pour des cellules ciblées. J'ai un "gros morceau de pain à couper sur ma planche" :-D .

Question : ce code peut-il être réutilisé "en l'état" mais en changeant juste les coordonnées de certaines cellules/colonnes/lignes/feuilles pour mes actions suivantes ? Ou vais-je devoir faire des macros complètement différentes à chaque fois ? Dois-je clore ce topic et en créer un autre pour la 2e macro ? En sachant que le principe "d'aller chercher" restera le même pour les colonnes B, C, D et E des 7 blocs ateliers, mais avec quelques petites "variantes" de ci-de là..., et qu'ensuite, le bloc TOTAL (A16) devra faire un total des données des 7 blocs atelier pour chaque OT + un TOTAL final (tout en bas, du coup) une fois TOUTES les entrées correctement réparties.

Par exemple, ma prochaine action se fera en colonne B et C des feuilles A09 à A15 : je dois "passer en revue" la colonne D de la feuille A02, en la comparant à la colonne A de la feuille A04 avec les noms des agents d'atelier.

Mon but est de faire en sorte que le N°OT RESTE la référence, mais que Excel aille chercher le nom de l'agent en colonne D ligne 1, qu'il aille chercher/trouver le MÊME nom dans la colonne A de la feuille A04, et que, dès qu'il le trouve, il aille insérer le chiffre "1" dans la cellule de la ligne 1 colonne B dans le bloc atelier EN FONCTION de l'atelier auquel appartient cet agent c'est-à-dire en fonction du chiffre qui est dans la cellule de la MÊME ligne que le nom, en colonne B de la feuille A04.

Concrètement, voilà ce que je recherche : (ici : "je" = Excel)
________________________________________________sub AA_02________________________________________________________
A02 : je vois que pour la 1er entrée, n°OT 401508385, l'agent est ZDZISLAW
A04 : je parcours la colonne A, et cherche le même nom
A04 : Ah, ça y est, j'ai trouvé le même nom
A04 : je regarde colonne B, et je vois que l'agent appartient à l'atelier 3
XXX : je sais que l'atelier 3 correspond à la feuille A11 (atelier logistique)
A11 : je vais dans la 1e ligne, car le N°OT en colonne A correspond,
je vais en colonne B, et je saisi un "1" (et je fige la cellule)
A04 : je reparcours la colonne A, et re-cherche le même nom
A04 : Ah, ça y est, j'ai trouvé le même nom
A04 : je regarde colonne C, et je vois que l'agent appartient à la catégorie "C"
XXX : je sais que l'atelier 3 correspond à la feuille A11 (atelier logistique)
A11 : je vais dans la 1e ligne, car le N°OT en colonne A correspond,
je vais en colonne C, et je saisi un "C" (et je fige la cellule).

"ET"
je répète la même action pour les 5 autres lignes du même N°OT, en sachant que les autres agents ne seront pas forcément du même atelier et/ou de la même catégorie.
"ET"
quand j'ai fini les 6 lignes de l'OT, je vais en ligne "S/S TOTAL", en colonne B (=cellule B10), et je fais une somme automatique de ces 6 lignes (et je fige la cellule), puis en colonne C (=cellule C10), je fais une mise en forme (fond vert (216/228/188) + style de motif rayure diagonale) (et je fige la cellule).

Puis je recommence avec l'OT suivant, et ainsi de suite, jusqu'à la fin de la liste de la feuille A02.
________________________________________________end sub___________________________________________________________

Et la macro suivante (3e donc) fera la même chose avec avec la colonne E de la Feuille A02 (cible colonne E de A09 à A15).
La 4e macro devra convertir ce format temps en un autre format temps, puis le convertir une 2e fois, faire des totaux dans la ligne S/S TOTAL, mais aussi dans le bloc TOTAL, ligne par ligne, ET simultanément OT par OT.
La 5e fera des calculs de pourcentage à partir des résultats de la 4e macro.
La 6e fera un TOTAL final (donc tout en bas) à partir des résultats de la 4e macro.
La 7e fera un calcul de pourcentage à partir des résultats de la 6e macro.
(en sachant qu'il sera peut-être nécessaire de faire plus de macro s'il faut séparer certaines actions, et sans oublier les macros pour la mise en forme (cadrage, couleur de fond, insertion de motif).

Et on aura fini le cycle 1.

Puis le cycle 2, puis le cycle 3, et enfin le cycle 4.

Je vais essayer de me débrouiller un maximum pour créer toutes ces macros, mais j'avoue qu'il est TRÈS fortement probable que je vienne ici pour demander conseils et petits ajustements.

En tout cas, encore un GRAND merci à toi Vgendron !!

Greg
 

vgendron

XLDnaute Barbatruc
Hello
Je pense que tu peux rester sur ce fil, vu qu'il s'agit de travailler sur le meme fichier et donc projet
d'autant que tu as tout intérêt à réutiliser le code proposé pour ajouter tes différents cycles

je vois que tu as décrit ce que tu souhaites faire sous forme d'algo.. c'est très bien.. il me semble que c'est la base. ensuite. il s'agit juste de traduire en VBA :-D

je regarde ca
 

vgendron

XLDnaute Barbatruc
J'ai une question
Dans la feuille A02: si on considère le 1er code 401508385
il y a 6 lignes
ces 6 lignes ont 6 noms différents
si on considère que ces 6 personnes sont de 6 ateliers différents.. ils vont chacun se retrouver dans 6 feuilles (A09-A15) différentes
et donc dans ces 6 feuilles, le code 401508385 ne sera rempli qu'une seule fois==> pourquoi avoir copié 6 lignes dans chaque atelier ?==> on va avoir 5 lignes vides..
est ce que c'est voulu?
du coup. la ligne sous-total ne sert que si pour un meme code, on a au moins deux employés dans le meme atelier..??
 

vgendron

XLDnaute Barbatruc
début de solution pour remplir les ateliers
la recherche d'équivalence pour le temps horaire n'est pas faite ici==> je recopie juste la donnée d'entrée

Selon ta réponse au message précédent, il faudra voir pour remettre les lignes "S/s Total"

VB:
Sub Statistiques()
Dim TabCodeSsDoublon() As Variant 'contient la liste des codes sans doublon de la feuille A01
Dim TabData() As Variant 'contiendra les données de la feuille A02
Dim TabFinal() As Variant 'contiendra les données à mettre dans les onglets A09==>A15
Dim TabAgent() As Variant 'contiendra la liste des agents(colA) avec le numéro d'atelier (colB) et sa catégorie (ColC)

With Sheets("A01")
    fin = .Range("A" & .Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A
    TabCodeSsDoublon = .Range("A1:A" & fin).Value
End With

With Sheets("A04")
    fin = .Range("A" & .Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A
    TabAgent = .Range("A1:C" & fin).Value
End With

With Sheets("A02")
    fin = .Range("A" & .Rows.Count).End(xlUp).Row 'dernière ligne de la colonne A
    TabData = .Range("A1:E" & fin).Value
End With
TailleFinale = UBound(TabData, 1) + UBound(TabCodeSsDoublon, 1) 'calcul de la taille finale du tableau final

ReDim TabFinal(1 To TailleFinale, 1 To 1) 'on définit le tablo (vide pour l'instant)

Indi = 1 'initialisation de l'indice qui permet de parcourir et remplir le tablo final
'cette boucle n'est peut etre plus necessaire..??
For i = LBound(TabData, 1) To UBound(TabData, 1) 'pour chaque ligne du tablo de données
    TabFinal(Indi, 1) = TabData(i, 1) 'on colle la donnée dans le tablo final
    
    If i = UBound(TabData, 1) Then 'si on est sur la dernière ligne==> il manque donc la ligne "total"
        TabFinal(Indi + 1, 1) = "S/s Total"
    Else
        If TabData(i, 1) <> TabData(i + 1, 1) Then 'si la donnée suivante est différente, ca veut dire qu'on va passer à un autre code ==> il faut donc ajouter la ligne "Total"
            TabFinal(Indi + 1, 1) = "S/s Total"
            Indi = Indi + 1
        End If
    End If
    Indi = Indi + 1
Next i

For i = LBound(TabData, 1) To UBound(TabData, 1) 'pour chaque ligne du tablo de données
    Agent = TabData(i, 4)
    Durée = TabData(i, 5)
    'on cherche l'agent dans le tablo
    For Indi = LBound(TabAgent, 1) To UBound(TabAgent, 1)
        If TabAgent(Indi, 1) = Agent Then
            NumAtelier = TabAgent(Indi, 2)
            Catégorie = TabAgent(Indi, 3)
            Exit For
        End If
    Next Indi
    With Sheets("A" & Format(NumAtelier + 7, "00")) '+7 pour la correspondance entre le numéro d'atelier, et le nom de la feuille: atelier 1 est en feuille A8
        .Range("A" & .Rows.Count).End(xlUp).Offset(1, 0) = TabData(i, 1)
        .Range("B" & .Rows.Count).End(xlUp).Offset(1, 0) = Agent
        .Range("C" & .Rows.Count).End(xlUp).Offset(1, 0) = Catégorie
        .Range("D" & .Rows.Count).End(xlUp).Offset(1, 0) = Durée
    End With
    
Next i

'à remettre si la boucle de départ est utile
'Sheets("A09").Range("A4").Resize(UBound(TabFinal, 1), 1) = TabFinal 'on colle le résultat dans la feuille A09
'Sheets("A10").Range("A4").Resize(UBound(TabFinal, 1), 1) = TabFinal 'on colle le résultat dans la feuille A10
'Sheets("A11").Range("A4").Resize(UBound(TabFinal, 1), 1) = TabFinal 'on colle le résultat dans la feuille A11
'Sheets("A12").Range("A4").Resize(UBound(TabFinal, 1), 1) = TabFinal 'on colle le résultat dans la feuille A12
'Sheets("A13").Range("A4").Resize(UBound(TabFinal, 1), 1) = TabFinal 'on colle le résultat dans la feuille A13
'Sheets("A14").Range("A4").Resize(UBound(TabFinal, 1), 1) = TabFinal 'on colle le résultat dans la feuille A14
'Sheets("A15").Range("A4").Resize(UBound(TabFinal, 1), 1) = TabFinal 'on colle le résultat dans la feuille A15
'Sheets("A16").Range("A4").Resize(UBound(TabFinal, 1), 1) = TabFinal 'on colle le résultat dans la feuille A16
'Sheets("A17").Range("A4").Resize(UBound(TabFinal, 1), 1) = TabFinal 'on colle le résultat dans la feuille A17
'Sheets("A18").Range("A4").Resize(UBound(TabFinal, 1), 1) = TabFinal 'on colle le résultat dans la feuille A18
End Sub
 

Scorp0211

XLDnaute Nouveau
Hello
Je pense que tu peux rester sur ce fil, vu qu'il s'agit de travailler sur le meme fichier et donc projet
d'autant que tu as tout intérêt à réutiliser le code proposé pour ajouter tes différents cycles

je vois que tu as décrit ce que tu souhaites faire sous forme d'algo.. c'est très bien.. il me semble que c'est la base. ensuite. il s'agit juste de traduire en VBA :-D

je regarde ca
Hello,
OK, je reste donc sur ce topic.

quand tu dis "réutiliser le code proposé pour ajouter les différents cycles", tu veux dire créer une nouvelle macro et faire "copier-coller" du code, en changeant les nom des cellules/colonnes/lignes/feuilles en fonction des besoins de chaque étapes

ou

tout mettre à la suite en une seule macro ? (question c*n : est-ce seulement possible ?)

Merci pour le compliment avec le "je vois que tu as décrit ce que tu souhaites faire sous forme d'algo.. c'est très bien..."... En fait, dans la vie de tous les jours, je m'efforce d'être "pratique"... "faire en sorte que ça marche". et pour arriver à ce résultat, je me prends pas la tête pendant 107 ans : j'observe, j'évalue, je créé mon ébauche, je pose des questions pour affiner, je modifie, j'explore d'autres pistes éventuelles, je me renseigne à droite à gauche (en cherchant l'info la plus pertinente), je corrige et re-corrige mon travail... jusqu'à arriver à qqch qui tienne la route...

Tu noteras le nom de mon fichier Excel : AC-05 (etc...)

Le A correspond au fait que je créer un tableau pour faire des stats pour X raison.
J'avais crée le AA-01 et le AA-02 pour les stats qui concernent respectivement les données à analyser PAR OT et par ATELIER,
et les tableaux AB-01 et le AB-02 pour les stats qui concernent respectivement les données à analyser en fonction du type d'OT et du demandeur de l'OT.
Le "AC" est 1 seul tableau qui réunis ces 4 tableaux.
Le "-05" signifie qu'il s'agit de la 5e version de ce tableau (car j'ai procédé à de petites modifications par-ci par-là à chaque fois que je l'estimai nécessaire).

Avec TA macro, je suis passé à AC-06, car le passage de MON codage (sans la ligne "S/S TOTAL") à TON codage (avec la ligne "S/S TOTAL") est L'AVANCÉE qui permet tout le reste ! Sans la ligne "S/S TOTAL", je ne peut pas avancer, c'est elle qui est la "pièce maîtresse".

J'ai une question
Dans la feuille A02: si on considère le 1er code 401508385
il y a 6 lignes
ces 6 lignes ont 6 noms différents
si on considère que ces 6 personnes sont de 6 ateliers différents.. ils vont chacun se retrouver dans 6 feuilles (A09-A15) différentes
et donc dans ces 6 feuilles, le code 401508385 ne sera rempli qu'une seule fois==> pourquoi avoir copié 6 lignes dans chaque atelier ?==> on va avoir 5 lignes vides..
est ce que c'est voulu?
du coup. la ligne sous-total ne sert que si pour un meme code, on a au moins deux employés dans le meme atelier..??
Pour répondre directement à ta question : "pourquoi avoir copié 6 lignes dans chaque atelier ?==> on va avoir 5 lignes vides... est ce que c'est voulu?"

OUI, c'est voulu... du fait de l' "ALÉATOIRITÉ" (je sais même pas si ce mot existe) du nombre d'entrées pour chaque OT.
ET
dans le sens où : DANS toutes les cellules qui seront vides parce qu'il n'y a pas d'agents dans tels ou tels atelier, créer une macro qui les remplira avec des 0 (zéro) (ou un quelconque autre symbole que Excel considérera comme "à ignorer") sera nécessaire...
car
Excel n'aime pas les cases vides, surtout quand il y a des formules...

AFIN

de faire ce que j'appelle personnellement un "double total".
Il y aura un "total vertical" pour chaque bloc atelier, calculé séparément...
avec une macro supplémentaire qui fera les calculs à partir de TOUTES les lignes "S/S TOTAL"
dans une ligne appelée "TOTAL DEF 1"
bloc par bloc (et qui au passage permettra de vérifier si les formules sont bonnes*)
(ET on s'en tape s'il n'y a qu'une seul entrée dans certains OT)
(car on me demande des données analysées PAR ATELIER)

ET

il y aura un "total horizontal" pour chaque bloc atelier, calculé séparément,
(car on me demande des données analysées PAR OT)
avec une macro supplémentaire qui fera les calculs à partir de TOUTES les lignes "S/S TOTAL"
du bloc TOTAL
dans une ligne appelée "TOTAL DEF 2"

CE qui permettra :
1) de vérifier si les données ont été calculées correctement verticalement ET horizontalement
2) de produire des graphiques (ici, camembert) pour les stats demandées.

C'est ce qu'on appelle un "tableau statistique matriciel" (= à double commande).

Ce genre de tableau permet d'exploiter les mêmes données de 2 manières différentes simultanément.

*(s'il y a ne serait-ce qu'une seul formule foireuse, ça se verra tout-de-suite... raison pour laquelle en feuille A16, tu as 2 colonnes nommées "Vérif").

MDR : tu écris tes messages plus vite que moi !! Merci pour ce deuxième codage... il s'agit bien là d'une macro distincte de la première ? là, il est 22h55, je suis chez moi... je la testerai demain à la première heure, une fois arrivé au bureau (car sur mon pc perso, j'ai Excel 2007, et pas 2010).

C'est la 7e ou 8e fois que je fais ce genre de tableau... mais comme dit précédemment, je n'ai jamais eu plus de 100 ou 150 entrées à analyser... et seulement avec 2, 3 ou 4 critères différents... donc, j'ai toujours tout saisi à la main... comme un grand garçon...
Là, pour 2021, il y a 3091 entrées à gérer, avec 11 critères... pour 2022, on est presque fin avril, et il y a déjà plus de 1875 entrées... (soit > à 50% par rapport à tout 2021)...
Tu vois le truc ? Pas d'autre choix que de passer en mode "automatique" pour recueillir les données...

Je te souhaite une bonne soirée, et on en reparle demain !! Tchüss !
 

vgendron

XLDnaute Barbatruc
Salut

J'ai detecté quelques problèmes à confirmer
feuille A04
si j'ai bien compris, la colonne B correspond au numéro d'atelier et la colonne B à la catégorie Agent
1) il faudrait ajouter une ligne d'entete avec le nom des colonnes (NomAgent - NumAtelier - Catégorie Agent): juste pour une question de lisibilité

2) en colonne B: de la ligne 45 à 49, les colonnes semblent inversées==> ca va poser des problèmes lorsqu'on cherchera la feuille de l'atelier

3) les 4 eres lignes indiquent un numéro d'atelier 0 (la feuille atelier 0, n'existe pas) ==> je vois que ce sont les chefs d'atelier==> Comment sait on qui est le chef de quel atelier?

4) à partir de la ligne 80, on a un atelier numéro 8==> idem, la feuille de cet atelier n'existe pas (la dernière feuille A15 correspond à l'atelier 7)

5) pour les personnes "plus la": vu qu'ils n'ont pas de numéro d'atelier: comment doit on les traiter? on les ignore?

6) question pour la correspondance de temps
comment ca se passe?
feuille A02: agent ZDZiSLAW ==> Temps 7.8

dans la feuille A05: on récupère quoi? en fonction de quoi?
 

vgendron

XLDnaute Barbatruc
Re,

En PJ ton fichier que j'ai légèrement modifié: les feuilles d'atelier s'appellent "Atelier xx" ==> plus simple pour s'y retrouver

j'ai ajouté quelques lignes d'entete en feuille A02 et A04
lance et regarde la macro Statistiques2
elle charge la feuille A02, chercher les numéros d'atelier et catégorie dans la feuille A04
et colle le résultat dans la feuille A02 (deux nouvelles colonnes)
tu verra qu'il y a aussi un problème sur les noms
(j'en ai déjà corrigé quelques uns), mais certains agents ne son pas listés (ou mal orthographiés) dans la feuille A04
 

Pièces jointes

  • AC-06.xlsm
    407.4 KB · Affichages: 8

vgendron

XLDnaute Barbatruc
Re,

voir PJ
Contrairement à ce que tu as décris plus haut, je n'ajoute QUE les numéro d'OT pour lesquels il y a un agent
==> pas de lignes vides
cliquer sur bouton macro dans la feuille A02
 

Pièces jointes

  • AC-06.xlsm
    588 KB · Affichages: 9

Scorp0211

XLDnaute Nouveau
Re,

En PJ ton fichier que j'ai légèrement modifié: les feuilles d'atelier s'appellent "Atelier xx" ==> plus simple pour s'y retrouver

j'ai ajouté quelques lignes d'entete en feuille A02 et A04
lance et regarde la macro Statistiques2
elle charge la feuille A02, chercher les numéros d'atelier et catégorie dans la feuille A04
et colle le résultat dans la feuille A02 (deux nouvelles colonnes)
tu verra qu'il y a aussi un problème sur les noms
(j'en ai déjà corrigé quelques uns), mais certains agents ne son pas listés (ou mal orthographiés) dans la feuille A04
Re,

voir PJ
Contrairement à ce que tu as décris plus haut, je n'ajoute QUE les numéro d'OT pour lesquels il y a un agent
==> pas de lignes vides
cliquer sur bouton macro dans la feuille A02

Bonjour Vgendron,

Merci pour ces indications. De mon côté, j'ai lu attentivement ton 2e codage, l'ai exécuté et vu les résultats.
j'ai également fait quelques modifications dans les blocs atelier car je me suis rendu-compte qu'il y avait des colonnes inutiles.

J'ai également remanié les tableaux en A04 et A08, avec les données qui me manquaient et que j'ai enfin obtenu ce matin. En effet, certains agents ne sont pas listé dans la version que je t'avais fourni. Ils le sont désormais. Ce sont des agents qui ont quitter l'entreprise. leur noms apparaîtront sur fond orangé.

Je vais intégrer tes modifications et les associer aux miennes dans la mesure du possible. J'ai juste encore quelques "calibrages" à faire, et je t'envoi dans l'après-midi une version AD-07, avec quelques annotations.

Je comprends ton soucis concernant les lignes vides, mais il est IMPORTANT de les avoir dans les blocs !
je m'explique : cela va créer un décalage dans les tableaux, en particulier dans le bloc "TOTAL" qui lui doit ABSOLUMENT contenir le même nombre de ligne pour un OT que le nombre de ligne de la base de données source A02 pour le même OT, car la ligne "S/S TOTAL" de CE bloc va être le point de départ de TOUTES les formules. Et s'il y a décalage, les stats seront faussées ! Garantiert, Kamarad ^^ !

je t'envoi avec CE message une capture d'écran qui te montre le résultat recherché pour le 1er OT. Il faut imaginer que tous les blocs se suivent (sans séparation par feuille). J'envoi également une photo que j'ai prise avec mon portable pour te donner une idée de l'ampleur du tableau à "grandeur nature". Tu comprendra mieux "pourquoi" en voyant ça.

Je te souhaite un bon appétit, et te dis à tout-à-l'heure.
 

Pièces jointes

  • résultat recherché 02 pdf.pdf
    788.1 KB · Affichages: 9
  • résultat recherché 01 pdf.pdf
    630.1 KB · Affichages: 9

vgendron

XLDnaute Barbatruc
Re
Voir nouvelle PJ
j'ai donc mis toutes les lignes (vides et non vides)
j'ai fait une mise en forme

à priori il va manquer la correspondance pour le temps (colonne C de la feuille A2 qui devient...??)
et des formules à modifier/ajouter

voila. sur ca.. je file m'aérer
 

Pièces jointes

  • AC-06.xlsm
    202.6 KB · Affichages: 8

Scorp0211

XLDnaute Nouveau
Bonjour Vgendron,

Merci pour ces indications. De mon côté, j'ai lu attentivement ton 2e codage, l'ai exécuté et vu les résultats.
j'ai également fait quelques modifications dans les blocs atelier car je me suis rendu-compte qu'il y avait des colonnes inutiles.

J'ai également remanié les tableaux en A04 et A08, avec les données qui me manquaient et que j'ai enfin obtenu ce matin. En effet, certains agents ne sont pas listé dans la version que je t'avais fourni. Ils le sont désormais. Ce sont des agents qui ont quitter l'entreprise. leur noms apparaîtront sur fond orangé.

Je vais intégrer tes modifications et les associer aux miennes dans la mesure du possible. J'ai juste encore quelques "calibrages" à faire, et je t'envoi dans l'après-midi une version AD-07, avec quelques annotations.

Je comprends ton soucis concernant les lignes vides, mais il est IMPORTANT de les avoir dans les blocs !
je m'explique : cela va créer un décalage dans les tableaux, en particulier dans le bloc "TOTAL" qui lui doit ABSOLUMENT contenir le même nombre de ligne pour un OT que le nombre de ligne de la base de données source A02 pour le même OT, car la ligne "S/S TOTAL" de CE bloc va être le point de départ de TOUTES les formules. Et s'il y a décalage, les stats seront faussées ! Garantiert, Kamarad ^^ !

je t'envoi avec CE message une capture d'écran qui te montre le résultat recherché pour le 1er OT. Il faut imaginer que tous les blocs se suivent (sans séparation par feuille). J'envoi également une photo que j'ai prise avec mon portable pour te donner une idée de l'ampleur du tableau à "grandeur nature". Tu comprendra mieux "pourquoi" en voyant ça.

Je te souhaite un bon appétit, et te dis à tout-à-l'heure.
Re
Voir nouvelle PJ
j'ai donc mis toutes les lignes (vides et non vides)
j'ai fait une mise en forme

à priori il va manquer la correspondance pour le temps (colonne C de la feuille A2 qui devient...??)
et des formules à modifier/ajouter

voila. sur ca.. je file m'aérer
Re-Bonjour ! (ou bonsoir, vue l'heure...)

Merci pour ce nouvel envoi, je viens d’y jeter un œil, et c’est cool si tu as pu remettre l’ensemble des lignes.

Tes macros fonctionnent à la perfection ! C’est juste GÉNIAL ! Je ne te remercierai jamais assez.

Je vais étudier tout ce codage avec beaucoup d’attention. Parce qu’il n’y a pas de raison que tu fasses tout tout-seul. Je ne me suis pas inscrit ici pour exploiter qui que ce soit, mais aussi pour apprendre !

1) De mon côté, j’ai procédé à une correction du tableau en A04. Il est désormais parfaitement à jour.

Peut-être faudra-t-il que tu modifies un peu le code en fonction de ça. Je te laisse regarder.

Le truc, c’est que tu as travaillé avec une version incomplète et surtout tronquée… et du coup il y a dans cette liste des prénoms qui reviennent plusieurs fois… et du coup, le résultat s’en trouve faussé.

Ce n’est pas ta faute ! C’est celle de cette règle de confidentialité professionnelle qui m’interdit de transmettre une liste nominative.

La question c’est : ta 2e macro fonctionnera elle tout aussi bien avec la liste non-tronquée ?

2) Je t’envoi ci-joint le tableau AD-07 avec mes propres modifications, ainsi que celles que toi tu as faites ! Que je trouve finalement très bien d’ailleurs : renommer les feuilles atelier, ajouter des entêtes en A02, et surtout, le bouton en A02 avec son effet qui m’a impressionné !! Je ne savais pas qu’il était possible de faire ça aussi !!

Tu noteras que j’ai supprimé une colonne dans chaque bloc atelier : la colonne « Quantité », qui faisait doublon avec la colonne « Agent », car finalement si on modifie un peu ta macro pour mettre un « 1 » dans cette colonne-là, à la place du prénom dans les blocs atelier, ça fera le taf !

Pour le résultat final, ma hiérarchie n’a pas exprimé son besoin de savoir quel agent a plus travaillé que tel autre.

(pour faire simple : le nom, on s’en balance !)

Le fait de mettre un « 1 » dans cette colonne permettra de faire une somme automatique dans la ligne « S/S TOTAL », puis de faire un second calcul, qui correspondra à la somme de tous ces sous-totaux, puis de faire un 3e calcul, de pourcentage cette fois-ci qui, lui, servira à montrer dans le cycle 4 (graphique) qu’il y a un nombre « x » d’OT pour lesquels il y a 6 agents qui ont travaillé, un nombre « y » d’OT pour lesquels il y a 7 agents qui ont travaillé, etc…

Sachant qu’il y a 584 OT dans la liste de 2021, il y aura certainement entre 15 et 20% d’OT pour lesquels il y a eu 6 agents à travailler… tu me suis ?

3) La donnée « Temps » : ma hiérarchie souhaite connaître, en %, combien d’OT (sur 584) ont demandé « x » heures de travail, combien d’OT « y » heures de travail, combien d’OT « z » heures de travail, etc…

Je dois donc pour ça recueillir la valeur temps inscrite dans la requête, qui se trouve être formulée d’une certaine manière qui n’est pas exploitable en l’état. Je dois donc convertir cette valeur en une autre valeur équivalente en heure réelle. Puis la convertir en minutes pour faciliter la formule qui fera le calcul.

Le tableau en A05 n’est pas encore terminé. Il doit encore être complété et de toute manière entièrement remanié. Il va servir à procéder à la 1e conversion du format inexploitable en format « temps réel ».

Pour la 2e conversion, pour un résultat en « minutes », je sais qu’Excel a une fonction qui fait ça sans problème.

Par exemple : pour la toute 1e ligne (ligne 4) en colonne H du bloc TOTAL, il y aura la formule « =(F4*A3)/F10 », soit un simple produit en croix.

La F4 contient la somme des cellules F4 de tous les blocs atelier

La A3 contient la valeur 100. (je l’ai mise avec un fond noir, pour qu’on aille pas se poser la question « c’est quoi ce « 100 » qui traîne, là ?)

La F10 contient le total des sommes des cellules F4 de tous les blocs atelier.

Ce produit en croix nous donnera simultanément comme résultat 1) le % de temps que chaque agent a passé sur cet OT, et 2) tout à la fin du tableau (une fois les 3091 entrées analysées), avec une autre formule de produit en croix, (en % donc), la position de CET OT par rapport au nombre TOTAL des OT, disant que CET OT fait partit du groupe d’OT qui a demander « x » heure(s) de travail ou du groupe d’OT qui a demander « y » heure(s) de travail…

Tu comprends maintenant l’importance d’avoir toutes les lignes, même si elles sont vides ? Y’a-t-il une macro faisable pour remplir ces lignes automatiquement avec des 0 (zéros) ?

Ne te tue pas à cette tâche ! Tu es déjà super cool de faire ça pour moi ! Et comme dit plus haut, Je ne me suis pas inscrit ici pour exploiter. Je souhaite vraiment apprendre !

Je te souhaite bonne soirée, et à la prochaine !
 

Pièces jointes

  • AD-07 - STATS OT - SET - macro 2 sans noms agents.xlsm
    553.2 KB · Affichages: 8

vgendron

XLDnaute Barbatruc
J'ai remis la macro et le bouton dans ton fichier AD-07

pour ta question 1: pas de souci, la macro fonctionnera toujours à partir du moment où les noms complets ne sont pas en doublon (sinon, c'est le premier trouvé qui est pris en compte: c'est ce qui se passe actuellement avec juste les prénoms)

pour la donnée Temps (feuille A05)==> si ca peut t'aider
pour convertir un nombre (7.8) en temps ==> 7h48 ou 468mn, il y a une formule qui fonctionne très bien
je l'ai mise en lignes 24 et 25 (en jaune)
en 24, j'ai découpé le calcul pour que tu vois l'effet de chaque élément de la formule
et en ligne 25, j'ai supprimé les calculs intermédiaires pour tout mettre en une fois.

d'une manière générale, tu demandes s'il existe une macro pour faire telle ou telle chose
en fait: la macro, c'est le programme qu'on est en train d'écrire: du coup, une macro fait tout ce qu'on lui demande de faire à travers des instructions

les possibilités d'une macro n'ont pour limite que l'imagination du créateur..
certains ecrivent des macros pour envoyer des mails, envoyer des SMS, Suis quasi sur qu'une macro excel est tout aussi capable de passer un coup de téléphone :-D
 

Pièces jointes

  • AD-07 - STATS OT - SET - macro 2 sans noms agents.xlsm
    175.9 KB · Affichages: 5

vgendron

XLDnaute Barbatruc
Hello
voici une nouvelle version avec remplissage des heures et minutes issues de la conversion des heures décimales..
tu pourras remarquer que le code ne fait pas appel à la feuille A05==> les formules de conversion sont directements effectuées dans le code

pour la suite, plutot qu'un long roman, je te propose ce qui suit:
lance la macro (bouton 1)
et dans une des feuilles atelier, saisis à la main les formules que tu souhaites avoir au final (ne saisir que le premier OT de la feuille.. ca suffira)
 

Pièces jointes

  • AD-07 - STATS OT - SET - macro 2 sans noms agents.xlsm
    210.2 KB · Affichages: 9

Discussions similaires

Statistiques des forums

Discussions
315 087
Messages
2 116 084
Membres
112 655
dernier inscrit
fannycordi